✅什么是Kafka的重平衡机制?
典型回答
Kafka 的重平衡机制是指在消费者组中新增或删除消费者时,Kafka 集群会重新分配主题分区给各个消费者,以保证每个消费者消费的分区数量尽可能均衡。
重平衡机制的目的是实现消费者的负载均衡和高可用性,以确保每个消费者都能够按照预期的方式消费到消息。

重平衡的 3 个触发条件:
- 消费者组成员数量发生变化。(新消费者的加入或者退出)
- 订阅主题(Topic)数量发生变化。
- 订阅主题的分区(Partition)数发生变化。
还有两种异常情况:
- 组协调器(Group Coordinator) 是 Kafka 负责管理消费者组的 Broker 节点。如果它崩溃或者发生故障,Kafka 需要重新选举新的
Group Coordinator,并进行重平衡。 - 当消费者组中的 Leader 消费者崩溃或退出。Kafka 需要选举新的 Leader,重新进行重平衡。
当Kafka 集群要触发重平衡机制时,大致的步骤如下:
-
暂停消费:在重平衡开始之前,Kafka 会暂停所有消费者的拉取操作,以确保不会出现重平衡期间的消息丢失或重复消费。
-
计算分区分配方案:Kafka 集群会根据当前消费者组的消费者数量和主题分区数量,计算出每个消费者应该分配的分区列表,以实现分区的负载均衡。
-
通知消费者:一旦分区分配方案确定,Kafka 集群会将分配方案发送给每个消费者,告诉它们需要消费的分区列表,并请求它们重新加入消费者组。
-
重新分配分区:在消费者重新加入消费者组后,Kafka 集群会将分区分配方案应用到实际的分区分配中,重新分配主题分区给各个消费者。
-
恢复消费:最后,Kafka 会恢复所有消费者的拉取操作,允许它们消费分配给自己的分区。
Kafka 的重平衡机制能够有效地实现消费者的负载均衡和高可用性,提高消息的处理能力和可靠性。但是,由于重平衡会带来一定的性能开销和不确定性,因此在设计应用时需要考虑到重平衡的影响,并采取一些措施来降低重平衡的频率和影响。
在重平衡过程中,所有 Consumer 实例都会停止消费,等待重平衡完成。但是目前并没有什么好的办法来解决重平衡带来的STW,只能尽量避免它的发生。
扩展知识
消费者的五种状态
Kafka的Consumer实例五种状态,分别是:
| 状态 | 描述 |
|---|---|
| Empty | 组内没有任何成员,但是消费者可能存在已提交的位移数据,而且这些位移尚未过期 |
| Dead | 同样是组内没有任何成员,但是组的元数据信息已经被协调者端移除,协调者保存着当前向他注册过的所有组信息 |
| PreparingRebalance | 消费者组准备开启重平衡,此时所有成员都需要重新加入消费者组 |
| CompletingRebalance | 消费者组下所有成员已经加入,各个成员中等待分配方案 |
| Stable | 消费者组的稳定状态,该状态表明重平衡已经完成,组内成员能够正常消费数据 |
状态的流转过程:

优化重平衡
重平衡会导致STW,应尽量减少问题发生,可以有以下几种优化方式,
默认情况下,消费者离开后会导致重平衡。但如果开启静态成员,Kafka 不会立即移除该消费者,而是等待一段时间(group.instance.id)。 这样,如果消费者重启,Kafka 仍然保持它的分区分配,不触发重平衡。
还有就是,Kafka 提供了多种分区分配策略,选择合适的策略可以减少重平衡的影响:
- RangeAssignor(默认):基于
range分配,可能导致不均衡。 - RoundRobinAssignor:轮询分配,适用于均匀分布的消费者。
- StickyAssignor:优先保持之前的分区分配,减少重平衡。
- CooperativeStickyAssignor:渐进式重平衡,不会影响所有消费者,只影响变更的部分。
4.0优化
在最新发布的4.0版本中(2025-03-19),提出了下一代消费者重平衡协议(https://cwiki.apache.org/confluence/display/KAFKA/KIP-848%3A+The+Next+Generation+of+the+Consumer+Rebalance+Protocol)
一方面将分区分配逻辑从客户端移到了服务端,简化客户端更加简单,而且这样服务端也能从全局视角更好的处理重平衡。
另外有个比较大的改进,就是允许消费者独立于其他成员进行重平衡了,这就意味着当一个消费者发生变化时,不再需要暂停整个组,其他消费者可以继续正常工作,提高了系统的可靠性和扩展性。