kafka重平衡问题-golang

这里只讨论"github.com/IBM/sarama"的用法

这里将会从触发重平衡的原因,影响重平衡的因素去介绍重平衡

1. 触发重平衡的原因

  1. 消费组中新增消费者

    因为消费者一旦启动,就会请求broker,所以消费者新增会立即被kakfa识别到,立即触发重平衡(需要和消费者离开的场景区分开)

  2. 消费者主动离开

    例如,对机器缩容的时候,关闭掉了消费者。这里不会立即触发重平衡,因为kafka判断消费者的存活机制是心跳上报,消费者上报有间隔的上报心跳(config.Consumer.Group.Heartbeat.Interval),kafka在一段时间内发现有心跳上报(Consumer.Group.Session.Timeout),就认为消费者仍然存活。

    所以当消费者离开后,broker等待一个Session.Timeout时间,发现没有上报,才会触发重平衡

    所以触发缩容的时候,会可能导致消息大于 Session.Timeout的延迟。

  3. 消费者无心跳

    这里golang的java是client实现略有不同

  • java有两种识别方式:
    1.认为节点死亡: config.Consumer.Group.Heartbeat.Interval和Consumer.Group.Session.Timeout
    2. 认为节点处理速度过慢:max.poll.interval.ms,当消费者会拉取一批数据cache到本地(ChannelBufferSize),一遍执行一遍拉数据,当cache满了,且就会停止拉新数据,直到缓冲区空出新的位置。当某个消费者执行时间过长,导致缓冲区填满且长时间无法空闲出来去容纳新数据,就停止拉数据。当通知拉数据时间>max.poll.interval.ms会认为这个节点处理能力不行,从而触发重平衡,把分配给这个消费者的分区分给其他消费者
  • golang:主要依赖于 config.Consumer.Group.Heartbeat.Interval和Consumer.Group.Session.Timeout。然而心跳上报和消费执行时绑定在一起的,互相堵塞,即执行完任务才会上报心跳。所以一旦执行时间大于Session.Timeout,就会导致心跳超时,被踢出消费组

2. 重平衡带来的问题

从触发重平衡的原因上看,重平衡是帮助开发者,实现动态负载均衡,节点异常管理的好方法。但实际使用过程中,因为却带来了大量了的问题。kafka设计之初是为了实现海量数据下的低延迟(毫秒)处理能力,所以默认参数也都是为了做低延迟保障。所以如果对kafka进行优雅调参和正确心跳变得非常重要。

问题:

  1. 少量任务执行慢,但导致全部分区都重新分配。
  2. 大量任务处理慢,一直循环重平衡,导致重平衡期间,消费者会处于闲置状态,无法处理任务,任务积压。对已经拿到重平衡后结果的消费者已经执行完的任务时,重平衡变量,导致自己提交失败。

3. 影响重平衡因素

    1. config.Consumer.Group.Heartbeat.Interval和Consumer.Group.Session.Timeout
      前面讲到了心跳检测失败,就会触发重平衡,所以根据任务时间调整这两个任务,就能不符合预期的重平衡事件。
      Consumer.Group.Session.Timeout>单个消息执行时间
      config.Consumer.Group.Heartbeat.Interval如果任务时间较长,配置为一批任务时间的1/3
    1. config.ChannelBufferSize 这个参数决定了任务的数量,一批消息的执行时间=单个消息*config.ChannelBufferSize 。如果任务执行很慢,建议参数配置足够小,避免重平衡后导致大量的消息提交失败。

未完待续,写中

相关推荐
回家路上绕了弯1 天前
深入解析Agent Subagent架构:原理、协同逻辑与实战落地指南
分布式·后端
初次攀爬者1 天前
Kafka的Rebalance基础介绍
后端·kafka
初次攀爬者2 天前
Kafka + KRaft模式架构基础介绍
后端·kafka
初次攀爬者2 天前
Kafka + ZooKeeper架构基础介绍
后端·zookeeper·kafka
初次攀爬者2 天前
Kafka 基础介绍
spring boot·kafka·消息队列
DemonAvenger6 天前
Kafka性能调优:从参数配置到硬件选择的全方位指南
性能优化·kafka·消息队列
初次攀爬者6 天前
ZooKeeper 实现分布式锁的两种方式
分布式·后端·zookeeper
花酒锄作田7 天前
Gin 框架中的规范响应格式设计与实现
golang·gin
yumgpkpm7 天前
AI视频生成:Wan 2.2(阿里通义万相)在华为昇腾下的部署?
人工智能·hadoop·elasticsearch·zookeeper·flink·kafka·cloudera