5月27日 22:28

Kafka Consumer Group Rebalance 什么时候触发?四种分配协议有什么区别?

核心答案

Consumer Group Rebalance 是 Kafka 在组成员或订阅变化时重新分配 Partition 的过程。面试抓住三点:什么触发、怎么分配、如何减影响。

什么情况会触发 Rebalance?

三个维度:

  • 成员变化:Consumer 加入/退出/宕机/心跳超时(超过 session.timeout.ms
  • 订阅变化:Consumer 订阅的 Topic 发生变动
  • 分区变化:Topic 分区数增减

追问:Consumer 处理慢会触发吗?会。两次 poll() 间隔超过 max.poll.interval.ms,Coordinator 认为 Consumer 已死,踢出并触发 Rebalance。

Rebalance 分几步?

  1. JoinGroup:所有 Consumer 向 Group Coordinator 发请求,Coordinator 选出 Leader Consumer
  2. SyncGroup:Leader 制定分区分配方案,发给 Coordinator,再下发给所有 Consumer
  3. 开始消费:Consumer 按新方案消费

只有 Leader Consumer 负责分配,其他 Consumer 被动接收方案。

四种分配策略有什么区别?

策略分配方式优点缺点
Range(默认)按 Partition 序号范围连续分配简单不整除时不均匀
RoundRobin轮询分配所有 Partition多 Topic 时更均匀订阅不一致时可能不均
Sticky均匀分配 + 尽量保持上次分配减少 Partition 迁移
CooperativeSticky增量式,只重分配受影响 Partition不停消费,减少 STWKafka 2.4+ 支持

关键区分:Range 和 RoundRobin 属 Eager 协议——Rebalance 时所有 Consumer 先停消费再重新分配。CooperativeSticky 属 Cooperative 协议,只迁移需要变动的 Partition,其余不受影响。

怎么减少 Rebalance 的负面影响?

1. 调参数避免误判

properties
max.poll.interval.ms=600000 session.timeout.ms=30000 heartbeat.interval.ms=10000

2. 用 CooperativeSticky 策略

避免全量 STW,只重分配受影响分区。

3. 手动管理 Offset

java
enable.auto.commit=false consumer.commitSync();

自动提交在 Rebalance 期间可能丢数据或重复消费,手动提交更可控。

4. 静态成员(Static Membership)

设置 group.instance.id,Consumer 重启后 Coordinator 仍认为同一成员,不触发 Rebalance。

追问方向

  • Eager 协议下 Rebalance 期间能消费吗?不能。Cooperative 协议下未受影响分区可以
  • 怎么监控?关注 RebalanceRatePerSecRebalanceTotal 指标
  • Kafka 4.0 消费者组协议变化?原生支持增量 Rebalance,不再需要 Eager 回退
标签:Kafka