Bootstrap

RocketMQ(八)——Rebalance机制介绍

Rebalance机制

  • 前提:集群消费模式
介绍:
  • Rebalance指的是:将下一个Topic的多个Queue在同一个Consumer Group中的多个Consumer间进行重新分配的过程
  • 该机制是为了提升消息的并行消费能力
  • 例子:一个Topic有4个队列,两个消费者,那么这两个消费者将各自负责两个队列的消费。
Rebalance限制
  • 当某个组下的消费者示例数大于数列数量时,多余的消费者将分配不到任何队列。一个队列最多分配给一个消费者
Rebalance带来的问题
  • 消费暂停:只有一个Consumer时,该Consumer负责消费所有队列。若新增Consumer,则会触发Rebalance,原Consumer就需要暂停部分队列的消费。等到这些队列分配给新的Consumer,暂停的队列才能继续被消费。

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

    同步提交和异步提交

    • 同步提交: consumer提交了其消费完毕的一批消息的offset给broker后,需要等待broker的成功ACK,收到ACK后,consumer才会继续获取并消费下一批消息。在等待ACK期间,consumer是阻塞的。
    • 异步提交:consumer提交了消费完毕的一批消息的offset后,不需要等待不容二科的成功ack,consumer可以直接获取并消费下一批消息
    • 对于一次读取消息的数量,需要根据具体业务场景选择一个相对均衡是很有必要的。数量过的大,产生重复的消息可能会增加。数量过小,系统性能会下降。
  • 消息突刺:由于Rebalance可能导致重复消费,如果重复消费的消息过多,或者因为Rebalance暂停时间过长而导致积压了部分消息。name有可能会导致在Rebalance结束后需要瞬间消费很多消息。

Rebalance产生的原因

消费者Topic的Queue数量发生变化:

  • Broker扩容或缩容
  • Broker升级运维
  • Broker与NameServer之间的网络异常

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

  • Consumer Group扩容或缩容
  • Consumer 升级运维
  • Consumer与NameServer 间网络异常
Rebalance过程

在Broker中维护着多个Map集合,这些集合中动态存放这当前Topic中Queue的信息、Consumer Group中Consumer示例的信息。一旦发现消费者所订阅的Queue数量发生变化,或者消费者组中消费者的数量发生变化,立即向Consumer Group中的每个实例发出Rebalance通知

  • TopicConfigManager:Key是topic名称,Value是Topic Config。TopicConfig中维护着该Topic所有Queue的数据

  • ConsumerManager:key是Consumer Group Id,Value是ConsumerGroupInfo。ConsumerGroupInfo中维护着该Group中素有Consumer实例数据。

  • ConsumerOffsetManager: Key为Topic与订阅该Topic的Group的组合,即Topic@group,value是一个内层Map,key是QueueID,value 为该Queue的消费进度Offset

Consumer实例在接收到通知后会采用Queue分配算法自己获取到相应的Queue,即由Consumer实例自主进行Rebalance。

;