RocketMQ Rebalance机制!

Rebalance机制

Rebalance即再均衡:

  • 指的是将⼀个Topic下的多个Queue在同⼀个Consumer Group中的多个Consumer间进行重新分配的过程。

它能够提升消息的并行消费能力。

哪些场景会触发Rebalance

消费者所订阅Topic的队列数量发生变化。

比如动态调整了Topic对应的队列数量,那么此时肯定是要重新分配一下,也就是触发Rebalance再均衡。

  • 例如⼀个Topic下5个队列,有2个消费者的情况下,那么就可以给其中⼀个消费者分配2个队列,给另⼀个分配3个队列。

  • 假设调整到Topic下有7个队列,还是2个消费者的情况下,那么就可以给其中⼀个消费者分配4个队列,给另⼀个分配3个队列。

  • 从而提升消息的并行消费能力。

Broker扩容或缩容、BrokerNameServer间发生网络异常、Queue扩容或缩容等场景。

  • 都可能导致消费者所订阅Topic的队列数量发生变化。

img

消费者组中消费者的数量发生变化。

  • 比如动态添加了Consumer进行消费,那么此时肯定是要重新分配一下,也就是触发Rebalance再均衡。

例如,⼀个Topic下5个队列,在只有1个消费者的情况下,这个消费者将负责消费这5个队列的消息。

  • 如果此时增加⼀个消费者,那么就可以给其中⼀个消费者分配2个队列,给另⼀个分配3个队列,从而提升消息的并行消费能力。

Consumer Group扩容或缩容、ConsumerNameServer间发生网络异常、Consumer发生宕机等。

  • 都会导致消费者组中消费者的数量发生变化。

由于⼀个队列最多分配给⼀个消费者,因此当某个消费者组下的消费者实例数量大于队列的数量时。

  • 多余的消费者实例将分配不到任何队列,等于是多余的消费者什么都不做,白白浪费。

img

Rebalance的危害?

消费暂停:

  • 在只有一个Consumer时,其负责消费所有队列。
  • 在新增了一个Consumer后会触发 Rebalance 的发生。
  • 此时原Consumer就需要暂停部分队列的消费,等到这些队列分配给新的Consumer后,这些暂停消费的队列才能继续被消费。

消费重复:

  • Consumer在消费新分配给自己的队列时,必须接着之前Consumer提交的消费进度的offset继续消费。
  • 然而默认情况下,offset是异步提交的,这个异步性导致提交到BrokeroffsetConsumer实际消费的消息并不一致。
  • 这个不一致的差值就是可能会重复消费的消息。

消费突刺:

  • 由于Rebalance可能导致重复消费,如果需要重复消费的消息过多,或者因为Rebalance暂停时间过长从而导致积压了部分消息。
  • 那么有可能会导致在Rebalance结束之后瞬间需要消费很多消息。