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 。如果任务执行很慢,建议参数配置足够小,避免重平衡后导致大量的消息提交失败。

未完待续,写中

相关推荐
ん贤6 小时前
AI大模型落地系列:一文读懂 Eino 的 Memory 与 Session(持久化对话)
大数据·ai·golang·eino
`Jay7 小时前
Python Redis连接池&账号管理池
redis·分布式·爬虫·python·学习
Anastasiozzzz7 小时前
告别 Class:深入理解 Go 语言的面向对象编程
开发语言·后端·golang
阿里云云原生7 小时前
悠悠有品:RocketMQ 稳扛核心交易,Kafka 驱动海量数据,支撑高并发游戏饰品交易平台
kafka·rocketmq
F1FJJ8 小时前
一个 CLI 工具的开源迭代记录:从单二进制到全平台分发
网络·网络协议·docker·golang·开源·开源软件
雨师@8 小时前
多个golang版本如何切换的办法
开发语言·后端·golang
rannn_1118 小时前
【Redis|实战篇4】黑马点评|分布式锁
java·数据库·redis·分布式·后端
qiumingxun8 小时前
【Go】Go语言基础学习(Go安装配置、基础语法)
服务器·学习·golang
mcooiedo9 小时前
RabbitMQ高级特性----生产者确认机制
分布式·rabbitmq
若鱼19199 小时前
SpringBoot4+Kafka4 - 生产环境故障 - 消费者执行时间太长导致消息无限循环投递
java·spring·kafka