第4章 分布式消息隊列的協(xié)調(diào)者

對于一個消息隊列集群來說,系統(tǒng)由很多臺機器組成癣诱,每個機器的角色计维、IP 地址都不相同,而且這些信息是變動的撕予。這種情況下鲫惶, 如果一個新的Producer 或Consumer 加入,怎么配置連接信息呢嗅蔬?NameServer 的存在主要是為了解決這類問題剑按,由NameServer 維護這些配置信息疾就、狀態(tài)信息澜术,其他角色都通過NameServer 來協(xié)同執(zhí)行。

4.1 NameServer 的功能

NameServer 是整個消息隊列中的狀態(tài)服務(wù)器猬腰,集群的各個組件通過它來了解全局的信息鸟废。同時,各個角色的機器都要定期向NameServer 上報自己的狀態(tài)姑荷,超時不上報的話盒延, NameServer 會認為某個機器出故障不可用了,其他的組件會把這個機器從可用列表里移除鼠冕。
NamServer 可以部署多個添寺,相互之間獨立,其他角色同時向多個NameServer機器上報狀態(tài)信息懈费,從而達到熱備份的目的计露。NameServer 本身是無狀態(tài)的,也就是說NameServer 中的Broker 憎乙、Topic 等狀態(tài)信息不會持久存儲票罐,都是由各個角色定時上報并存儲到內(nèi)存中的( NameServer 支持配置參數(shù)的持久化,一般用不到) 艳丛。

4.1.1 集群狀態(tài)的存儲結(jié)構(gòu)

在org.apache.rocketmq.namesrv.routeinfo 的Rou telnfoManager 類中鞋诗,有五個變量伙判,集群的狀態(tài)就保存在這五個變量中。

4.1.2 狀態(tài)維護邏輯

本節(jié)基于源碼分析NameServer 如何維護各個Broker 的實時狀態(tài)蚕礼,如何根據(jù)Broker 的情況更新各種集群的屬性數(shù)據(jù)。因為其他角色會主動向Name Server 上報狀態(tài)梢什,所以NameServer 的主要邏輯在DefaultRequest Processor類中奠蹬,根據(jù)上報消息里的請求碼做相應(yīng)的處理, 更新存儲的對應(yīng)信息绳矩。
當(dāng)NameServer 和Broker 的長連接斷掉以后罩润, onChannelDestroy 函數(shù)會被調(diào)用,把這個Broker 的信息清理出去翼馆。
NameServer 還有定時檢查時間戳的邏輯割以, Broker 向NameServer發(fā)送的心跳會更新時間戳金度, 當(dāng)NameServer 檢查到時間戳長時間沒有更新后,便會觸發(fā)清理邏輯严沥。從代碼可以看出是每10 秒檢查一次猜极,時間戳超過2 分鐘則認為Broker 已失效。

4.2 各個角色間的交互流程

下面從Topic 的創(chuàng)建入手消玄,結(jié)合源碼分析一下NameServer 如何和其他各個組件交互跟伏,以及NameServer 存儲的元數(shù)據(jù)內(nèi)容的具體含義。

4.2.1 交互流程源碼分析

這里是一堆代碼翩瓜,不貼出了受扳,說下大概意思。
Topic的創(chuàng)建需要指定b和c兩個參數(shù)兔跌,而且他們倆只有一個會起作用( -b 優(yōu)先)勘高, b 參數(shù)指定在哪個Broker 上創(chuàng)建本Topic 的Message Queue , c 參數(shù)表示在這個Cluster 下面所有的Master Broker 上創(chuàng)建這個Topic 的Message Queue , 從而達到高可用性的目的坟桅。具體的創(chuàng)建動作是通過發(fā)送命令觸發(fā)的华望。
在Nameserv執(zhí)行創(chuàng)建Topic的命令后,命令會被發(fā)送到對應(yīng)的Broker上仅乓,Broker 接到創(chuàng)建Topic 的請求后赖舟,執(zhí)行具體的創(chuàng)建邏輯。其中最后一步是向NameServer 發(fā)送注冊信息夸楣, NameServer 完成創(chuàng)建Topic 的邏輯后宾抓,其他客戶端才能發(fā)現(xiàn)新增的Topic。

4.2.2 為何不用ZooKeeper

ZooKeeper 是Apache 的一個開源軟件裕偿,為分布式應(yīng)用程序提供協(xié)調(diào)服務(wù)洞慎。那為什么RocketMQ 要自己造輪子,開發(fā)集群的管理程序呢嘿棘?答案是ZooKeeper 的功能很強大劲腿,包括自動Master選舉等, RocketMQ 的架構(gòu)設(shè)計決定了它不需要進行Master 選舉鸟妙,用不到這些復(fù)雜的功能焦人,只需要一個輕量級的元數(shù)據(jù)服務(wù)器就足夠了。

中間件對穩(wěn)定性要求很高重父, RocketMQ 的NameServer 只有很少的代碼花椭,容易維護,所以不需要再依賴另一個中間件房午,從而減少整體維護成本矿辽。

4.3 底層通信機制

分布式系統(tǒng)各個角色間的通信效率很關(guān)鍵,通信效率的高低直接影響系統(tǒng)性能,基于Socket 實現(xiàn)一個高效的TCP 通信協(xié)議是很有挑戰(zhàn)的袋倔,本節(jié)介紹RocketMQ 是如何解決這個問題的雕蔽。
好吧,這里基本都是代碼宾娜,不介紹了批狐。

4.4 本章小結(jié)

本章介紹了NameServer 的功能, NameServer 在RocketMQ 集群中扮演調(diào)度中心的角色前塔。各個Producer 嚣艇、Consumer 上報自己的狀態(tài)上去,同時從Name Server 獲取其他角色的狀態(tài)信息华弓。NameServer 的功能雖然非常重要食零,但是被設(shè)計得很輕量級,代碼量少并且?guī)缀鯚o磁盤存儲该抒,所有的功能都通過內(nèi)存高效完成慌洪。本章還介紹了底層的通信機制, RocketMQ 基于Netty 對底層通信做了很好的抽象凑保,使得通信功能邏輯清晰,代碼簡單涌攻。Netty 的介紹和具體的通信實現(xiàn)可以查看第13 章欧引。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市恳谎,隨后出現(xiàn)的幾起案子芝此,更是在濱河造成了極大的恐慌,老刑警劉巖因痛,帶你破解...
    沈念sama閱讀 216,651評論 6 501
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件婚苹,死亡現(xiàn)場離奇詭異,居然都是意外死亡鸵膏,警方通過查閱死者的電腦和手機膊升,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,468評論 3 392
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來谭企,“玉大人廓译,你說我怎么就攤上這事≌椋” “怎么了非区?”我有些...
    開封第一講書人閱讀 162,931評論 0 353
  • 文/不壞的土叔 我叫張陵,是天一觀的道長盹廷。 經(jīng)常有香客問我征绸,道長,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 58,218評論 1 292
  • 正文 為了忘掉前任管怠,我火速辦了婚禮剥汤,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘排惨。我一直安慰自己吭敢,他們只是感情好,可當(dāng)我...
    茶點故事閱讀 67,234評論 6 388
  • 文/花漫 我一把揭開白布暮芭。 她就那樣靜靜地躺著鹿驼,像睡著了一般。 火紅的嫁衣襯著肌膚如雪辕宏。 梳的紋絲不亂的頭發(fā)上畜晰,一...
    開封第一講書人閱讀 51,198評論 1 299
  • 那天,我揣著相機與錄音瑞筐,去河邊找鬼凄鼻。 笑死,一個胖子當(dāng)著我的面吹牛聚假,可吹牛的內(nèi)容都是我干的块蚌。 我是一名探鬼主播,決...
    沈念sama閱讀 40,084評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼膘格,長吁一口氣:“原來是場噩夢啊……” “哼峭范!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起瘪贱,我...
    開封第一講書人閱讀 38,926評論 0 274
  • 序言:老撾萬榮一對情侶失蹤纱控,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后菜秦,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體甜害,經(jīng)...
    沈念sama閱讀 45,341評論 1 311
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,563評論 2 333
  • 正文 我和宋清朗相戀三年球昨,在試婚紗的時候發(fā)現(xiàn)自己被綠了尔店。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 39,731評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡褪尝,死狀恐怖闹获,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情河哑,我是刑警寧澤避诽,帶...
    沈念sama閱讀 35,430評論 5 343
  • 正文 年R本政府宣布,位于F島的核電站璃谨,受9級特大地震影響沙庐,放射性物質(zhì)發(fā)生泄漏鲤妥。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 41,036評論 3 326
  • 文/蒙蒙 一拱雏、第九天 我趴在偏房一處隱蔽的房頂上張望棉安。 院中可真熱鬧,春花似錦铸抑、人聲如沸贡耽。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,676評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽蒲赂。三九已至,卻和暖如春刁憋,著一層夾襖步出監(jiān)牢的瞬間滥嘴,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 32,829評論 1 269
  • 我被黑心中介騙來泰國打工至耻, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留若皱,地道東北人。 一個月前我還...
    沈念sama閱讀 47,743評論 2 368
  • 正文 我出身青樓尘颓,卻偏偏與公主長得像走触,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子泥耀,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 44,629評論 2 354

推薦閱讀更多精彩內(nèi)容