RocketMQ角色詳解之NameServer

一、NameServer的功能

NameServer是整個消息隊列中的狀態服務器,集羣的各個組件通過它來了解全局的信息 。

需要了解的兩個知識:

  • 熱備份: NamServer可以部署多個,相互之間獨立,其他角色同時向多個NameServer 機器上報狀態信息。
  • 心跳機制: NameServer 中的 Broker、 Topic等狀態信息不會持久存儲,都是由各個角色定時上報並存儲到內存中,超時不上報的話, NameServer會認爲某個機器出故障不可用了,其他組件會把這個機器從可用列表裏移除 。 (每 10秒檢查一次,時間戳超過 2分鐘則認爲Broker已失效。)

二、NameServer的集羣狀態存儲結構

集羣的狀態就保存於五個變量中,NameServer 的主要工作就是維護這五個變量中存儲的信息。

1.private final HashMap<String, List> topicQueueTable

 Key 是 Topic 的名稱,它存儲了所有Topic 的屬性信息 。
Value 是個 QueueData 隊列,隊裏的長度等於這個 Topic 數據存儲的 MasterBroker的個數。
QueueData裏存儲着 Broker的名稱、 讀寫queue的數量、 同步標識等。

2.private final HashMap<String, BrokerData> Broker- AddrTable

這個結構存儲着一個 BrokerName 對應的屬性信 息,
包括所屬的 Cluster 名稱,Master Broker 和多個 Slave Broker 的地址信息 。

3.private final HashMap<String, Set> ClusterAddrTable

存儲的是集羣中 Cluster 的信息
Cluster 名稱對應一個由 BrokerName組成的集合

4.private final HashMap<String, BrokerLivelnfo> Broker- LiveTable

BrokerLiveTable 存儲的內容是這臺 Broker機器的實時狀態,
包括上次更新狀態的時間戳, NameServer會定期檢查這個時間戳,超時沒有更新就認爲這個 Broker無效了,將其從 Broker列表裏清除。

5.private fina l HashMap<String , List> filterServerTable

Filter Server是過濾服務器,是 RocketMQ 的一種服務端過濾方式。
一個Broker可以有一個或多個Filter Server。 
Key 是 Broker 的地址
Value 是和這個 Broker關聯的多個 Filter Server 的地址 。

三、爲什麼不用已有的Zookeeper?

ZooKeeper 的功能很強大,包括自動 Master 選舉等, RocketMQ 的架構設計決定了它不需要進行 Master選舉,用不到這些複雜的功能,只需要一個輕量級的元數據服務器就足夠了 。
中間件對穩定性要求很高, RocketMQ的 NameServer只有很少的代碼,容易維護,所以不需要再依賴另一箇中間件,從而減少整體維護成本 。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章