RocketMQ中Rebalance介绍

Rebalance介绍:

首先介绍一下Rebalance用来解决的问题:当一个Topic下有多个Queue时,如何分配每个Consumer Group中各个Consumer要消费的队列数量?(例如:一个Topic有16个Queue,现在有1个Group4个Consumer去消费,如何知道每个Consumer消费的个数?可不是简单的除法哦)这时候Rebalance机制就派上用场了。

其次明确触发Rebalance的场景都有哪些

发生场景

  • Consumer在启动时
  • Consumer会开一个线程每20秒执行一次Rebalance定时任务
  • Broker 每30s接受一次Consumer发送的心跳请求,判断如果有新的Consuner被启用注册时

再来了解一下Rebalance采用的平衡策略

策略

  • 平均哈希队列算法

平均哈希队列算法

range 代表当前这个 Consumer 获取到了多少个 MessageQueue,而 for 循环当中的 startIndex 代表了当前这个 Consumer 从 MessageQueue 数组的哪个位置开始取。举个例子,假设有 4 个 MessageQueue,2 个 Consumer,并且在经过排序之后,当前新启动的 Consumer 在数组中的下标是 1,即第 2 个元素,那么计算的情况就是这样:

不能均分时:

所以我们可以将这个均分逻辑简单总结一下:能均分就均分,不能均分就先保证每个 Consumer 都拿到相同数量的 MessgeQueue,然后再将剩下的从头开始分给每个 Consumer。

比如刚刚的 7 个 MessageQueue 分给 2 个 Consuemr,我们可以抽象地理解成:每个 Consumer 先分 3 个,然后剩下的 1 个按照 cidAll 中的顺序开始分,自然是分给排在第一位的 Consumer1 了。不过这里需要注意的是,实际上并没有先均分、再分配剩余的逻辑,上面那套复杂的计算逻辑会直接一把梭地计算到位,这里这么说只是为了方便大家理解。

猜你喜欢

转载自blog.csdn.net/xmbcc777/article/details/130442867
今日推荐