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 了。不过这里需要注意的是,实际上并没有先均分、再分配剩余的逻辑,上面那套复杂的计算逻辑会直接一把梭地计算到位,这里这么说只是为了方便大家理解。