RocketMQ负载均衡
Producer负载均衡
- 容错机制:开启容错机制后,会进行失败隔离和超时隔离,规避失败的Broker
- Broker选择:如果随机到了已经发送过的Broker会重新进行选择
Consumer负载均衡
- Consumer会定时向所有的Broker发送心跳,心跳数据包括消费组名称、订阅关系集合、消息的通信模式、消费者ID等,Broker接收到心跳包后会维护在ConsumerManager中,当Broker监听到Consumer变化之后,会通知Consumer进行ReBalance
- 在Consumer客户端,也会有一个定时任务,周期性进行Rebalance
Rebalance
Rebalance是一个由消费端平衡queue和consumer的过程,实现原理:
触发时机:
- 在Consuner启动或者停止的时候,此时消费者数量变化,Consumer会主动发起一次Rebalance
- 收到Broker的Rebalance通知时
- 消费者每执行定时任务,每20s触发一次Rebalance
- 向服务端获取TopicA最新的Queue列表和Consumer列表,根据这些信息重新分配消费关系
分配策略:
- rocket提供多个消费策略,消费机器不同但是内部代码相同,所以会选择相同的消费策略,保证不同的Consumer节点执行Rebalance后得到相同的分配结果
- Rebalance之后,消费者会对比消费关系是否变化,有新增的queue则加入pullRequests请求队列中,如果一个queue被移除将被标记drop在后续流程中将会从pullRequests请求队列剔除
Rebalance的缺点
暂停消费
- 当有新增的consumer时,原来的queue需要分一部分到新的consumer消费,在分配好之前这部分queue的消费会被暂停
重复消费
- 在切换分配关系的间隙,可能queue的原来consumer还未提交offset就切换到新的consumer了,此时会导致queue的消息被多个Consumer消费了,所以需要在业务上考虑幂等
顺序消息的Rebalance:
因为顺序消息为了严格保证顺序,是不能被多个Consumer消费的,所以顺序消息的Rebalance会直接在queue上加锁,上锁成功后才可以进行消费关系调整