分区再平衡
触发条件:
- 消费组成员发生变化。比如有新的消费者加入组或离开组,或是有消费者崩溃被踢出组。
- 订阅主题数发生变化。消费组可以使用正则表达式的方式订阅主题,比如consumer.subscribe(Pattern.compile(“t.*c”)) 就表明该 Group 订阅所有以字母 t 开头、字母 c 结尾的主题。在消费组的运行过程中,你新创建了一个满足这样条件的主题,那么该 Group 就会发生Rebalance。
- Topic 的分区数发生变化。
主动再平衡
在进行主动再均衡期间,所有消费者都会停止读取消息,放弃分区所有权,重新加入消费组,并获得重新分配到的分区。这样会导致整个消费组在一个很短的时间窗口内不可用。这个时间窗口的长短取决于消费组的大小和几个配置参数。
两个阶段:
- 所有消费者都放弃分区所有权。
- 消费者重新加入群组,获得重新分配到的分区,并继续读取消息。
协作再均衡
协作再均衡(也称为增量再均衡)是指将一个消费者的部分分区重新分配给另一个消费者,其他消费者则继续读取没有被重新分配的分区。这种再均衡包含两个或多个阶段。
- 消费组leader会通知所有消费者,它们将失去部分分区的所有权,然后消费者会停止读取这些分区,并放弃对它们的所有权。
- 消费组leader会将这些没有所有权的分区分配给其他消费者。
虽然这种增量再均衡可能需要进行几次迭代,直到达到稳定状态,但它避免了主动再均衡中出现的“停止世界”停顿。
消费者会向被指定为群组协调器的broker(不同消费组的协调器可能不同)发送心跳,以此来保持群组成员关系和对分区的所有权关系。心跳是由消费者的一个后台线程发送的,只要消费者能够以正常的时间间隔发送心跳,它就会被认为还“活着”。
如果消费者在足够长的一段时间内没有发送心跳,那么它的会话就将超时,群组协调器会认为它已经“死亡”,进而触发再均衡。
如果一个消费者发生崩溃并停止读取消息,那么群组协调器就会在几秒内收不到心跳,它会认为消费者已经“死亡”,进而触发再均衡。在这几秒时间里,“死掉”的消费者不会读取分区里的消息。在关闭消费者后,协调器会立即触发一次再均衡,尽量降低处理延迟。