nameServer是什么
nameServer負(fù)責(zé)rocketMq的路由管理、服務(wù)管理雷客、服務(wù)發(fā)現(xiàn)唯蝶。
重點:
- nameServer整體構(gòu)建設(shè)計
- nameServer動態(tài)路由發(fā)現(xiàn)與剔除機制
nameServer整體構(gòu)建設(shè)計
nameServer啟動流程
step1: 首先解析配置文件操软。填充NameServerConfig、NettyServerConfig屬性值请毛。
包括:端口號志鞍,目錄路徑,netty線程池個數(shù)方仿,消息請求并發(fā)度固棚。等等等等统翩。step2: 根據(jù)啟動屬性,創(chuàng)建NamesrvController實例此洲,并初始化該實例厂汗。NameServerController為nameServer的核心控制器。
NameServerController里面有一個nettyServer和兩個定時任務(wù)呜师。
nettyServer負(fù)責(zé)與broker娶桦、生產(chǎn)者、消費者進(jìn)行網(wǎng)絡(luò)通信汁汗。
定時任務(wù)1:每隔10s掃描一次broker衷畦,移除死亡狀態(tài)broker。
定時任務(wù)2:每隔10分鐘打印一次KV配置知牌。
路由注冊
路由元信息
來看一下NameServer中到底存了哪些信息
/**
* key 為 topic
* topic 消息隊列路由信息祈争,消息發(fā)送時根據(jù)路由進(jìn)行負(fù)載均衡
*/
private final HashMap<String, List<QueueData>> topicQueueTable;
/**
* key 為 brokerName
* broker基礎(chǔ)信息,包含brokerName角寸、所屬集群名稱菩混、主備broker地址
*/
private final HashMap<String, BrokerData> brokerAddrTable;
/**
* key 為 cluserName
* broker集群信息,存儲集群中所有broker名稱
*/
private final HashMap<String, Set<String>> clusterAddrName;
/**
* key 為 brokerAddr
* broker狀態(tài)信息袭厂,nameServer每次收到一臺broker的心跳包后會更新該信息
*/
private final HashMap<String, BrokerLiveInfo> brokerLiveTable;
/**
* key 為 brokerAddr
* broker上filterServer列表墨吓,用于消息過濾
*/
private final HashMap<String, List<String>> filterServerTable;
同一個集群,2主2從部署:
Broker部署相對復(fù)雜纹磺,Broker分為Master與Slave帖烘,一個Master可以對應(yīng)多個Slave,但是一個Slave只能對應(yīng)一個Master橄杨,Master與Slave的對應(yīng)關(guān)系通過指定相同的BrokerName秘症,不同的BrokerId來定義,BrokerId為0表示Master式矫,非0表示Slave乡摹。Master也可以部署多個。每個Broker與Name Server集群中的所有節(jié)點建立長連接采转,定時注冊Topic信息到所有Name Server聪廉。
對應(yīng)運行時的數(shù)據(jù):
{
"topicQueueTable":{
"topic1":[
{
"brokerName":"broker-a",
"readQueueNums":4,
"writeQueueNums":4,
"perm":6, // 讀寫權(quán)限
"topicSynFlag":0 // topic同步標(biāo)記
},
{
"brokerName":"broker-b",
"readQueueNums":4,
"writeQueueNums":4,
"perm":6, // 讀寫權(quán)限
"topicSynFlag":0 // topic同步標(biāo)記
}
],
"topic2":[]
}
}
{
"brokerAddrTable": {
"broker-a": {
"cluster":"c1",
"brokerName":"broker-a",
"brokerAddrs":{
"0":"192.168.56.1:10000",
"1":"192.168.56.2:10000"
}
},
"broker-b": {
"cluster":"c1",
"brokerName":"broker-b",
"brokerAddrs":{
"0":"192.168.56.3:10000",
"1":"192.168.56.4:10000"
}
}
}
}
{
"clusterAddrName":{
"c1":[
"broker-a",
"broker-b"
]
}
}
{
"brokerLiveTable":{
"192.168.56.1:10000": {
"lastUpdateTimestamp":12412,
"dataVersion":"versionOb1",
"channel":"channelObj",
"haServerAddr":"192.168.56.2:10000"
},
"192.168.56.2:10000": {
},
"192.168.56.3:10000": {
},
"192.168.56.4:10000": {
}
}
}
路由注冊
rocketMq的路由注冊是通過broker與NameServer的心跳功能實現(xiàn)的。broker啟動的時候故慈,向集群中的所有nameServer發(fā)送心跳語句板熊,每隔30s向集群中的所有nameServer發(fā)送心跳。
nameServer收到心跳包時會更新brokerLiveTable緩存中的lastUpdateTimestamp察绷。然后nameServer每10秒掃描一次brokerLiveTable干签,如果連續(xù)120s沒有收到心跳包,nameServer將移除該Broker的路由信息拆撼,同時關(guān)閉netty socket連接容劳。
nameServer與broker保持長連接喘沿。在操作路由表的時候(修改topicQueueTable、brokerAddrTable竭贩、brokerLiveTable)使用讀寫鎖蚜印,來保證并發(fā)下的一致性。