Kafka核心概念
-
Topic : 消息的逻辑分类,类似与数据库中的表
-
partition : 每个主体可以被分割程多个分区,消息的存储和顺序保证的基本单位。分区使得kafka具备水平扩展的能力
-
producer : 向kakfka的特定主体发布消息的客户端
-
consumer : 从主题订阅并读取消息的客户端
-
consumer group :有多个消费者实例组成,共同消费一个主体,每个分区再同一时刻只能被组内的一个消费者消费,从而实现负载均衡。
(如果消费组内的单个consumer由于其他原因不可用,可能会导致整个消费组短时间内的消费暂停,GroupCoordinator 检测到心跳丢失后会进行对整个消费组再平衡) -
broker : 一个独立的kafka服务器,多个broker组成一个集群
-
replica:每个分区有多个副本,用于高可用,分为leader副本(处理读写请求)和follower副本(只与leader同步)
-
zookeeper:负责维护kafka元数据(broker,topic,partition信息)和实现集群的动态管理(选举等)
高并发下导致延迟的配置与优化
概述可以分为三个方面的配置来进行优化
生产者配置
acks确认机制:这个配置决定了生产者需要收到多少个副本的确认后才认为消息发送成功。可以考虑ack = 1 leader副本确认即可- linger.ms & batch.size批处理:为了提升吞吐,生产者会讲消息再本地积累程批次再发送。 linger.ms定义批次再发送钱可以等待更多消息加入的最大时间,默为0 立即发送。batch.size批处理大小
Broker配置
-
num.io.threads:Broker处理网络请求的I/O线程数。当写入请求激增时,如果线程数不足,请求会被积压,导致延迟增加。 -
log.flush.interval.messages与log.flush.interval.ms:控制日志数据从系统缓存刷到磁盘的频率。减少这些值可以让数据更快地持久化,有助于降低延迟,但会增加磁盘I/O压力
-
分区数量:一个主题的分区数量决定了该主题的最大并行消费能力。如果分区数远小于消费者数量,消费者会处于空闲;反之,如果分区数不足,则无法充分利用消费者资源,导致消息积压,增加延迟。
consumer配置
- 拉取消息配置: fetch.min.bytes (消费者会等待直到有足够的数据(按字节)才返回。)& fetch.max.wait.ms 消费者未达到min.bytes等待到这个时间后也会反水数据
- max.poll.records:单次拉取请求返回的最大消息数,如果值设置过小,会导致处理能力限制,设置过大则会影响响应速度。