面试题答案
一键面试消费者端负载均衡机制实现
- 队列分配:RocketMQ 消费者端采用一种基于消费者组的负载均衡策略。每个消费者组内的消费者会共同消费一组队列。消费者通过向 NameServer 获取 Topic 的路由信息,知晓该 Topic 下有哪些队列。
- 负载算法:默认采用平均分配算法,尽量将队列平均分配给消费者组内的各个消费者。例如,若有 3 个消费者,10 个队列,则会按照一定顺序尽量均匀分配,每个消费者大致消费 3 - 4 个队列。
Rebalance触发条件
- 消费者实例变化:包括新的消费者实例加入消费者组,或者已有消费者实例因为故障下线等原因离开消费者组。
- 订阅关系变化:消费者组内某个消费者的订阅 Topic 或者 Tag 发生改变。
- 队列变化:Topic 的队列数量发生变化,如动态扩容或缩容。
Rebalance大致流程
- 感知变化:消费者通过心跳机制向 Broker 发送心跳包,Broker 会将消费者的状态变化(如新增、下线等)反馈给 NameServer。消费者也会定时从 NameServer 获取最新的 Topic 路由信息,从而感知到队列变化等情况。
- 发起 Rebalance:当感知到上述触发条件中的变化时,消费者会发起 Rebalance 操作。消费者组内的每个消费者会计算自己应该消费哪些队列。
- 队列重新分配:每个消费者根据负载均衡算法(如平均分配)计算出新的队列分配方案。
- 消费调整:消费者根据新的队列分配结果,停止消费原分配队列,开始消费新分配的队列,完成 Rebalance 过程,从而实现消费者端的负载均衡。