外观
Kafka ReBalance 的过程是什么样子的
- 触发重平衡的条件
重平衡通常由以下事件触发:
- 消费者加入或离开:消费者组中新增或移除消费者实例。
- 订阅的主题发生变化:消费者组订阅的主题列表发生变化。
- 分区数量变化:订阅的主题中分区数量发生变化(例如通过
kafka-topics.sh --alter
命令增加分区)。 - 手动触发:通过调用
Consumer#poll()
或Consumer#wakeup()
等方法手动触发重平衡。
- 重平衡的阶段
重平衡过程可以分为以下几个阶段:
(1)
检测到变化
当 Kafka
消费者客户端检测到上述触发条件之一时,会开始重平衡流程。消费者通过心跳机制与 Kafka
协调器(Coordinator
)保持通信,协调器负责管理消费者组的状态。
(2)
停止当前消费任务
在重平衡开始时,消费者会停止当前的消费任务,以避免在分配变化期间消费到重复的消息。这称为“暂停”阶段。
(3)
同步组成员信息
协调器会收集当前消费者组的成员信息,包括:
- 每个消费者实例的
ID
。 - 每个消费者实例的订阅信息。
- 每个消费者实例的当前分区分配情况。
(4)
选择分区分配策略
Kafka
提供了多种分区分配策略,用于决定如何将分区分配给消费者实例。默认的分配策略包括:
Range
分配策略:将分区按范围分配给消费者。RoundRobin
分配策略:按轮询方式分配分区。Sticky
分配策略:尽量保持现有分配,减少分区的重新分配。
(5)
分配分区
协调器根据选定的分区分配策略,计算出每个消费者实例应分配的分区。分配结果会以“分配协议”(Assignment Protocol
)的形式发送给每个消费者。
(6)
消费者重新启动消费
每个消费者收到分配结果后,会根据新的分配重新启动消费任务:
- 如果消费者被分配了新的分区,它会从指定的偏移量开始消费。
- 如果消费者失去了某些分区,它会停止对这些分区的消费。
(7)
提交偏移量
在重平衡完成后,消费者需要提交当前的偏移量,以确保在新的分配下不会重复消费或漏掉消息。