RocketMQ讀書筆記4——NameServer(MQ的協調者)
阿新 • • 發佈:2018-11-30
【NameServer簡述】
對於一個訊息佇列叢集來說,系統由很多機器組成,每個機器的角色、IP地址都不相同,而且這些資訊是變動的(如在某些情況下,會有新的Producer或Consumer加入)。
NameServer的存在主要是為了解決這類問題,由NameServer維護這些配置資訊、狀態資訊,其他角色都通過NameServer來協同執行。
【NameServer的功能】
NameServer是整個訊息佇列中的狀態伺服器,叢集的各個元件通過它來了解全域性的資訊。各個角色的機器要定時向NameServer上報自己的狀態,如果超時未上報,NameServer會認為某個機器出故障不可用了,其他的元件會把這個機器從可用列表中刪除。
NameServer可以部署多個,相互之間獨立,其他角色同時向多個NameServer上報狀態資訊,從而達到熱備份的目的。NameServer本身是無狀態的,也就是說NameServer中的Broker、Topic等資訊都不會持久化,都是由各個角色定時上報並存儲到記憶體中的(NameServer支援引數的持久化,一般用不到)。
【叢集狀態的儲存結構】
在RouterInfoManager中,有5個變數,叢集的狀態就儲存在這5個變數中。
/** * 儲存所有Topic的屬性資訊 */ private final HashMap<String/*topic */, List<QueueData>> topicQueueTable; /** * 儲存BrokerName對應的屬性資訊 */ private final HashMap<String/* brokerName */, BrokerData> brokerAddrTable; /** * 儲存叢集的資訊 */ private final HashMap<String/* clusterName */, Set<String/* brokerName */>> clusterAddrTable;/** * 儲存Broker機器的實時狀態 */ private final HashMap<String/* brokerAddr */, BrokerLiveInfo> brokerLiveTable; /** * 儲存過濾伺服器資訊 */ private final HashMap<String/* brokerAddr */, List<String>/* Filter Server */> filterServerTable;