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解决了以上的种种问题。更多的可以去了解一下。