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 分几步?
- JoinGroup:所有 Consumer 向 Group Coordinator 发请求,Coordinator 选出 Leader Consumer
- SyncGroup:Leader 制定分区分配方案,发给 Coordinator,再下发给所有 Consumer
- 开始消费:Consumer 按新方案消费
只有 Leader Consumer 负责分配,其他 Consumer 被动接收方案。
四种分配策略有什么区别?
| 策略 | 分配方式 | 优点 | 缺点 |
|---|---|---|---|
| Range(默认) | 按 Partition 序号范围连续分配 | 简单 | 不整除时不均匀 |
| RoundRobin | 轮询分配所有 Partition | 多 Topic 时更均匀 | 订阅不一致时可能不均 |
| Sticky | 均匀分配 + 尽量保持上次分配 | 减少 Partition 迁移 | — |
| CooperativeSticky | 增量式,只重分配受影响 Partition | 不停消费,减少 STW | Kafka 2.4+ 支持 |
关键区分:Range 和 RoundRobin 属 Eager 协议——Rebalance 时所有 Consumer 先停消费再重新分配。CooperativeSticky 属 Cooperative 协议,只迁移需要变动的 Partition,其余不受影响。
怎么减少 Rebalance 的负面影响?
1. 调参数避免误判
propertiesmax.poll.interval.ms=600000 session.timeout.ms=30000 heartbeat.interval.ms=10000
2. 用 CooperativeSticky 策略
避免全量 STW,只重分配受影响分区。
3. 手动管理 Offset
javaenable.auto.commit=false consumer.commitSync();
自动提交在 Rebalance 期间可能丢数据或重复消费,手动提交更可控。
4. 静态成员(Static Membership)
设置 group.instance.id,Consumer 重启后 Coordinator 仍认为同一成员,不触发 Rebalance。
追问方向
- Eager 协议下 Rebalance 期间能消费吗?不能。Cooperative 协议下未受影响分区可以
- 怎么监控?关注
RebalanceRatePerSec和RebalanceTotal指标 - Kafka 4.0 消费者组协议变化?原生支持增量 Rebalance,不再需要 Eager 回退