rocketMQ的负载均衡
1.相关的类
TopicPublishInfo类是用于producer端做负载均衡的关键类,producer通过这个类识别broker并选择broker。

MessageQueue类描述了单个消息队列的模型。

这个类用于管理队列属于那个topic,以及在哪个broker。
TopicRouteData类:

topic路由信息集中管理了当前topic下的所有队列信息和broker信息。
成员变量brokerDatas包含了该broker的group名字和物理地址。
2.producer的负载均衡
由MQDefaultStratage.selectOneMessageQueue()实现
这个类是MQ负载均衡的核心类,描述了MQ负载均衡的策略,那么如何选择一个broker达到负载均衡呢?
- 尽量不要选择刚刚选择过的broker
- 不要选择延迟容错内的broker
随机选取broker

producer在使用broker的时候会记录这次使用的是哪个broker;下次再选取broker的时候主动排除这个broker。
- 未推送任何消息的时候,producer中的mq为空,此时lastBrokerName也为空
- 选择broker是负载均衡的关键,基于方法selectOneMessageQueue,这个方法会随机选择一个broker
避开上次选取的broker(延时容错未开启)

延迟容错下选择broker

遍历所有broker直至找到一个broker可用(不在延迟容错里或已经可以从延迟容错里去除),如果所有broker都不可用则随机选取一个。
3.consumer的负载均衡

consumer在启动的时候会实例化rebalanceImpl,这个类负责消费端的负载均衡。
MQClientInstance里会调用doRebalance()来进行负载均衡
- consumer负载均衡指的是将消息队列分配到消费者组的哪个consumer
- consumer的负载均衡有rebalanceImpl调用allocateMessageQueueStratage.allocate()完成
- 每次有新的consumer加入group就会重做一下负载均衡
- 每10秒自动做一次负载 consumer的负载均衡有6种模式
- 分页模式(随机分配模式)
- 手动配置模式
- 指定机房模式
- 就近机房模式
- 统一哈希模式
- 环形模式

浙公网安备 33010602011771号