RocketMQ Rebalance机制!
RocketMQ Rebalance机制!
月伴飞鱼Rebalance机制
Rebalance
即再均衡:
- 指的是将⼀个
Topic
下的多个Queue
在同⼀个Consumer Group
中的多个Consumer
间进行重新分配的过程。它能够提升消息的并行消费能力。
哪些场景会触发Rebalance
?
消费者所订阅
Topic
的队列数量发生变化。比如动态调整了
Topic
对应的队列数量,那么此时肯定是要重新分配一下,也就是触发Rebalance
再均衡。
例如⼀个
Topic
下5个队列,有2个消费者的情况下,那么就可以给其中⼀个消费者分配2个队列,给另⼀个分配3个队列。假设调整到
Topic
下有7个队列,还是2个消费者的情况下,那么就可以给其中⼀个消费者分配4个队列,给另⼀个分配3个队列。从而提升消息的并行消费能力。
像
Broker
扩容或缩容、Broker
与NameServer
间发生网络异常、Queue
扩容或缩容等场景。
- 都可能导致消费者所订阅
Topic
的队列数量发生变化。
消费者组中消费者的数量发生变化。
- 比如动态添加了
Consumer
进行消费,那么此时肯定是要重新分配一下,也就是触发Rebalance
再均衡。例如,⼀个
Topic
下5个队列,在只有1个消费者的情况下,这个消费者将负责消费这5个队列的消息。
- 如果此时增加⼀个消费者,那么就可以给其中⼀个消费者分配2个队列,给另⼀个分配3个队列,从而提升消息的并行消费能力。
像
Consumer Group
扩容或缩容、Consumer
与NameServer
间发生网络异常、Consumer
发生宕机等。
- 都会导致消费者组中消费者的数量发生变化。
由于⼀个队列最多分配给⼀个消费者,因此当某个消费者组下的消费者实例数量大于队列的数量时。
- 多余的消费者实例将分配不到任何队列,等于是多余的消费者什么都不做,白白浪费。
Rebalance
的危害?
消费暂停:
- 在只有一个
Consumer
时,其负责消费所有队列。- 在新增了一个
Consumer
后会触发Rebalance
的发生。- 此时原
Consumer
就需要暂停部分队列的消费,等到这些队列分配给新的Consumer
后,这些暂停消费的队列才能继续被消费。消费重复:
Consumer
在消费新分配给自己的队列时,必须接着之前Consumer
提交的消费进度的offset
继续消费。- 然而默认情况下,
offset
是异步提交的,这个异步性导致提交到Broker
的offset
与Consumer
实际消费的消息并不一致。- 这个不一致的差值就是可能会重复消费的消息。
消费突刺:
- 由于
Rebalance
可能导致重复消费,如果需要重复消费的消息过多,或者因为Rebalance
暂停时间过长从而导致积压了部分消息。- 那么有可能会导致在
Rebalance
结束之后瞬间需要消费很多消息。