NameService
1.1 总体架构
1.2 NameSev启动流程
1.3 路由管理
1.3.1 路由元数据
代码:org.apache.rocketmq.namesrv.routeinfo.RouteInfoManager
private final HashMap<String/* topic */, List<QueueData>> topicQueueTable;
private final HashMap<String/* brokerName */, BrokerData> brokerAddrTable;
private final HashMap<String/* clusterName */, Set<String/* brokerName */>> clusterAddrTable;
private final HashMap<String/* brokerAddr */, BrokerLiveInfo> brokerLiveTable;
private final HashMap<String/* brokerAddr */, List<String>/* Filter Server */> filterServerTable;
topicQueueTable: topic消息队列路由信息,消息发送时根据路由表进行负载均衡
brokerAddrTable: Broker基本信息,包括brokerName,所属集群名称,主备Borker地址
clusterAddrTable: Broker集群信息,存储集群中所有Broker名称
brokerLiveTable: Broker状态信息,NameServer每次收到心跳包是会替换该信息
filterServerTable: Broker上的FilterServer列表,用于类模式消息过滤
RocketMQ基于发布订阅机制,一个Topic拥有多个消息队列,一个Broker为每个创建4个自读,4个只写队列,多个Broker组成一个集群,BrokerName由相同的多台Broker组成Master-Slave,borkerId为0代表Master,大于0为Slave。
brokerLiveInfo中的lastUpdateTimestamp存储上次接收心跳包的时间。
topicQueueTable:{
"topic1":[
{
"brokerName":"broker-a",
"readQueueNums":4,
"writeQueueNums":4,
"perm":6,
"topicSynFlag":0 // topic同步标记
},{
"brokerName":"broker-b",
"readQueueNums":4,
"writeQueueNums":4,
"perm":6,
"topicSynFlag":0 // topic同步标记
}
]
}
brokerAddrTable:{
"broker-a":{
"cluster":"c1",
"brokerName":"broker-a",
"brokerAddrs":{
0:"192.168.32.1:10000", // master
1:"192.168.32.1:10000" // slave
}
}
}
(1) broker发送心跳包
RockerMQ路由注册是通过Broker向NameServ发送心跳包实现,Broker启动时会向NameServ发送心跳信息,启动之后,Broker每个30秒向NameServ发送心跳包,NameServ收到心跳包会更新brokerLiveTable的缓存中BrokerLiveInfo中的lastUpdateTimestamp最后一个更新时间,NameServ每隔10s 扫描broker 路由信息,160秒没有上报信息将删除改路由信息。
(2) 注册路由信息
NameServ中DefaultRequestProcessor类中的processRequest接收所有请求,通过code分发到RouteInfoManager实现接收心跳信息,更新Table中数据。
1.3.4 路由删除
broker每个30秒向namesrv发送心跳包,心跳包包含brokerId,broker地址,broker名称,broker所属集群名称,broker关联的filterServer列表,但是Broker宕机,NameServ无法接收到心跳包,此时NameServ如何删除到broker?Name会每个10s扫描brokerLiveTable状态表,如果BrokerLive的lastUpdateTimestamp的时间戳距离当前时间超过120秒,则认为该broker失效,将会被删除,同时更新topicQueueTable,brokerAddrTable,brokerLiveTable,filterServerTable,clusterAddrTable。
RockerMQ有两种触发删除路由信息动作
-
NameServ定期扫描brokerLIveTable列表,距离上次上报时间超过120s,则删除
-
Broker正常关闭触发unregisterBroker
两种方式都是一样,就是从路由表中删除与该broker相关的信息
1.3.5 消息发现
路由消息发发生变更时,NameServ不会主动向客户端推送变更消息,需要客户端自己请求获取,org.apache.rocketmq.namesrv.processor.DefaultRequestProcessor#getRouteInfoByTopic。