前言
在上一章分析了NamesrvController的构造函数时,会生成一个RouteInfoManager对象,该对象存放着整个消息集群的相关消息,所以这里单独拿出来分析。其实试想一下namesrv的功能不就是一个提供了通信功能的一个队列嘛,而RouteInfoManager保留了所有信息的路由。所以要想弄明白RocketMQ,RouteInfoManager必须要攻下。
RouteInfoManager的构造函数
主要提供了topic、broker、cluster、liveBroker的路由信息。
1 | public class RouteInfoManager { |
topicQueueTable
1 | private final HashMap<String/* topic */, List<QueueData>> topicQueueTable; |
存放了Topic的一个hashMap,在RocketMQ的插件中RocketMQ控制台,可以看到Topic的列表,这个就是topicQueueTable的一个可视化:
查看QueueData的类信息:
1 | public class QueueData implements Comparable<QueueData> { |
点开一个一个topic的配置可以看到和上面类对应的变量:
clusterAddrTable
1 | private final HashMap<String/* clusterName */, Set<String/* brokerName */>> clusterAddrTable; |
根据一个集群名,获得对应的一组BrokerName的列表,在可视化界面就是如下:
虽然只得到了BrokerName,只要调用对应的接口就能得到Broker对应的属性值。
brokerAddrTable
1 | private final HashMap<String/* brokerName */, BrokerData> brokerAddrTable; |
以Broker Name为Key,BrokerData为Value:
1 | public class BrokerData implements Comparable<BrokerData> { |
Master与Slave 的对应关系通过指定相同的BrokerName,不同的BrokerId来定 义,BrokerId为0 表示Master,非0 表示Slave。
brokerLiveTable
1 | private final HashMap<String/* brokerAddr */, BrokerLiveInfo> brokerLiveTable; |
用于存放存活的Broker信息,BrokerLiveInfo:
1 | class BrokerLiveInfo { |
registerBroker
上面的类的解释可能还存在很多疑惑,下面以registerBroker方法,来实际操作一下上面提到类,看看注册一个Broker发生了什么:
1 | public RegisterBrokerResult registerBroker( |
插入过程可以看如下这张图:
疑惑
- topicQueueTable有一点不明白,为什么一个topic对应的是一个List,难道不是一个topic对应一个QueueData吗?难道可以存在相同的topic?
因为每一个topic可以存在不同的broker中,不同的broker就有不同的QueueData。
- brokerAddrTable根据一个brokername获得一个BrokerData,可是为什么一个BrokerData中有一个hashMap的brokerAddrs呢?我能理解的是一个brokername,会有多个address和id,但是cluster为什么又是同一个呢?
这是因为你理解错了,以为BrokerName是唯一的,实际上是指定多个broker为一个name,只不过指定了不同的id和addres来区分是master还是slave。