1.Kafka消费者源码:重平衡(1)-初始化与FIND_COORDINATOR
2.sarama 源码解析--Kafka的重平衡
Kafka消费者源码:重平衡(1)-初始化与FIND_COORDINATOR
在Kafka 2.5.2的消费者组中,重平衡是关键,它定义了消费者如何根据订阅关系调整对Topic分区的分配。当消费者数量、订阅的Topic或GroupCoordinator所在的Broker发生变更时,会触发重平衡。discuz 整站源码
消费者组状态由GroupState类管理,共有五个状态:Empty(无成员)、PreparingRebalance(加入中)、CompletingRebalance(等待分配)、Stable(已平衡)和Dead(元数据已删除)。状态间的转换基于预先定义的前置状态。例如,体温上报模块源码从Empty到PreparingRebalance,预示着重平衡的开始。
重平衡过程分为几个步骤,首先是消费者和Broker之间的协调。服务端启动时,GroupCoordinator组件即已就绪,io模拟USB源码而Consumer通过ConsumerCoordinator与之通信。在启动时,消费者首先会通过FindCoordinatorRequest找到GroupCoordinator,通过最小负载节点发送请求,然后服务端确定哪个Broker负责协调,如groupId的2020悬赏平台源码hash值对consumer_offsets分区数取模确定。
一旦找到GroupCoordinator,消费者会发送JoinGroupRequest。后续步骤如SYNC_GROUP和HEARTBEAT确保消费者与协调器保持同步。这部分详细内容在后续的文章中会进一步探讨。
sarama 源码解析--Kafka的重平衡
重平衡操作
重平衡是动态调整Consumer Group下的Consumer订阅Topic的分区的一个关键操作。Sarama中的shmget系统调用源码BalanceStrategyRange和BalanceStrategySticky策略具体实施这一操作。
重平衡触发条件之一是成员数变更。这一过程包括以下步骤:
1. 启动一个新的消费者实例。
2. 调用Consume方法。
3. Consume方法初始化连接信息,并启动一个goroutine。程序会阻塞在sess.ctx.Done()上。
4. 在newSession方法中找到协调者信息,并发起join请求和syncgroup请求。Consumer Leader执行一次重平衡。
5. 创建consumer group session,并初始化offset manager和开启心跳goroutine。
6. 当心跳超时或收到coordinator的重平衡通知时,调用cancel()方法取消操作,退出Consume逻辑。
7. 此时,Consume函数优雅退出。由于外层循环的存在,会重新执行Consume,实现一次重平衡。
另一个触发重平衡的条件是订阅主题分区数发生变更。这一过程如下:
1. 在Consume方法中开启心跳goroutine,并将consumer group session传递给它。
2. 分区数发生变化时,调用sess.cancel(),Consume优雅退出并重新执行,实现重平衡。