目录

Kafka简介

前言

消息队列是一个保持信息的容器,顾名思义就是一个队列。但这个队列满足了高吞吐,高并发,高可用。在电商以及越来越高频的业务的当下,对于这些有着越来越高的需求。

消息中间件早在1983年已经有了雏形。而Kafka则是当选较为流行的消息中间件之一。

Kafka简介

Kafka 是一种分布式的,基于发布 / 订阅的消息系统。有分布式的、分区的、多副本的日志提交服务。kafka在高吞吐场景下发挥出色。

Kafka基本概念

生产者与消费者

对于中间件Kafka来说,客户端有两种:生产者(Producer)与消费者(Consumer)

  • 生产者:也就是发布者,创建消息
  • 消费者:也就是订阅者,读取消息

主题与分片

在kafka中,消息以主题(Topic) 来进行分类,每一个主题都对应一个消息队列。所以同类型主题的消息都在一个队列中。

生产者和消费者也是从主题中发布消息和在主题中读取消息。

分区(Partition),则是为了避免一个主题一条队列造成吞吐量不足的问题引入的。在每一个主题里,会存在多个分片,而每个分片都可以并发处理,以提高整个主题的吞吐量。

服务器和集群

在Kafka中,服务器也称之为Broker,它的作用就是接收生产者创建的消息并持久化;同时也将消费者读取分区消息的请求处理,返回已提交的消息。

而若干个Broker就可以组成一个物理集群(Cluster),有着更高的吞吐量。

Offset 分区偏移

消息在分区partition内的相对位置信息,也可以看作为消息的唯一ID,在分区内部严格递增。

Replica 分区副本

Replica分区副本,分布在不同的机器上。它的作用是用来容灾的,如果主分区挂掉了,将副本Follower提升成主分区再进行服务。 而分区副本Follower会在同步的副本(ISR)中选出差距最小的。

ZooKeeper 模块

这个模块是在集群Cluster之上。存储了集群的元数据信息。Controller计算好的方案都会放在这里。

Kafka支撑高吞吐的秘密

生产者方面

  • 批量发送:减少IO次数,加强发送能力
  • 数据压缩:减少消息大小,提高单次消息量。支持Snappy,Gzip,LZ4,ZSTD压缩算法

服务器方面

  • 采用顺序写入内存的方案提高写入效率
  • 使用二分法来找到目标索引。
  • 零拷贝:消费者从磁盘读到os内核缓冲区后直接网络发送。生产者的数据持久化到Broker,使用mmap文件映射,顺序快速写入。

消费者方面

  • 使用Rebalance方案,分区消息合理分配,达到稳定的消费状态。

Kafka的问题

对于kafka,每一个服务器上都有不同主题分区的不同副本,而不同的副本会将其数据存储到该kafka节点上。而分区会进行副本数据直接复制,保证数据的一致性与集群高可用。

  • 如果对一台机器进行重启,会关闭一个Broker。如果该Broker上存在主分区,会引发主副分区互换。而新主分区会在互换期间存在数据滞后,将会追赶数据。然后重新加入ISR。这样会造成机器重启成本增加

  • 负载不均衡:当一个主题由多个分片,当某个Broker的IO达到瓶颈时,将机器上的分区移到负载较小的Broker上。但是迁移本身还会造成高IO,这样在为了解决高IO时,造成了更高的IO。需要极其复杂的负载均衡策略

以上就是Kafka的不足之处,但是BMQ解决了以上的种种问题。更多的可以去了解一下。