跳转至

Kafka Rebalance

在处理消息积压的问题时,常见的方案之一为增加 partition 数量,但是此时会触发 rebalance,在某些配置条件下会短暂阻塞消费,同时由于分区的消费者可能发生切换,消息消费的顺序性需要重新考量

Rebalance 触发机制

image-20250907204626196

一般在三种情况下触发:

  1. 主题下的 partition 数量发生变化,如分区数增加时

  2. 消费者组内成员数量发生变化

    • 新的消费者加入 consumer group 时
    • 消费者离开 consumer group 时,如正常关闭或崩溃

Rebalance 的过程

  1. 暂停消费(防止 rebalance 时出此案数据丢失或重复)
  2. 由一个 broker 充当 coordinator,触发 rebalance
  3. coordinator 挑选一个消费者作为 group leader,由 leader 根据分配策略决定每个分区分给哪个消费者
  4. coordinator 下发最新的分配结果给每个消费者
  5. 恢复消费

分区策略

分区策略通过 partition.assignment.strategy 这个配置进行设置

Range Assignor

以 topic 为单位,按照分区的编号将分区划分给消费者,每个消费者分配连续的分区

RR Assignor

将消费者组负责的所有 topic 中的所有 partition 按照 (topic, partition) 进行偏序排序,最后几个 consumer 轮流交错进行认领,如:

  • c1: a0, a2, b1, b3
  • c2: a1, b0, b2

Sticky Assignor

在保证均衡分配的同时,尽可能多地保留原有的分配

在这个配置下,最初的一次原始分配按照 RR 进行,后面在均衡的同时,减少分区分配的移动

CooperativeStickyAssignor

在分配层面上的策略和 StickyAssignor 保持一致,实际的 reblance 的执行过程不同

不会一次性全部分配好,而是进行渐进式地分配

Eager / Incremental Rebalance

上述分区策略中,前三个都是 eager rebalance,在 rebalance 发生的过程中,整个消费者组停止消费任何消息,出现 stop the world

CooperativeStickyAssignor 是在 2.3 版本之后引入的优化方案,在 rebalance 的过程中部分分区从一个消费者移动到另一个消费者,其他不涉及的消费者可以继续进行消费。付出的代价则是 rebalance 的时间会更久,因为在整个均匀化的过程中,不止涉及到一次的移动操作