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种模式
    • 分页模式(随机分配模式)
    • 手动配置模式
    • 指定机房模式
    • 就近机房模式
    • 统一哈希模式
    • 环形模式
posted @ 2021-12-07 19:35  sellingpear  阅读(433)  评论(0)    收藏  举报