① 输入
C1
C2
C3
C4
无人消费
RangeAssignor
按 Consumer 字典序在每个 Topic 内分段。多 Topic 时容易出现某个 Consumer 多接管 1 分区,跨 Topic 累积放大。
RoundRobinAssignor
把所有 (topic, partition) 展开排序,依次轮询发给 Consumer。要求所有 Consumer 订阅完全相同的 Topic 集合。
StickyAssignor
初始分配同 RoundRobin;Rebalance 时尽量保留每个 Consumer 原来的分区,仅迁移少量。
CooperativeStickyAssignor(推荐)
分配结果与 Sticky 相同,但 Rebalance 过程是「增量」的(详见 Tab 2)。
Eager vs Cooperative Rebalance 对比演示
剧本:3 个 Consumer 稳态消费 6 分区,t=5s 时第 4 个 Consumer 加入。 点击「开始」观察两种协议在「全停时间」上的差异。
当前时刻 t = 0s
Eager 协议(Stop-the-World)
全部 Consumer 在 Rebalance 期间停止消费,即使分配结果与原来 70% 一样
Cooperative 协议(增量 Rebalance)
只有「即将失去分区」的 Consumer 经历短暂 revoke;其余 Consumer 完全不停
结果对比
| 指标 | Eager | Cooperative |
|---|
临时网络抖动场景对比
剧本:3 个 Consumer 稳态消费 6 分区,t=5s 时 Consumer C2 网络抖动 8s 后恢复。 对比 group.instance.id 开关下的行为。
当前时刻 t = 0s
未启用 Static Membership(默认)
抖动 → 触发第一次 Rebalance;恢复 → 触发第二次 Rebalance;整组停顿很久
启用 Static Membership(group.instance.id="c2-pod")
Coordinator 在 session.timeout 内不立刻 Rebalance;C2 恢复后直接还原分区
对比结论
| 项目 | 未启用 | 启用 Static |
|---|