RocketMQ架構(gòu)解析

RocketMQ 是阿里開源的消息中間件掸绞,它是一個開源的分布式消息傳遞和流式數(shù)據(jù)平臺统扳。RocketMQ提供億級消息的堆積能力酝碳,這不是重點(diǎn)捍歪,重點(diǎn)是堆積了億級的消息后户辱,依然保持寫入低延遲鸵钝!
我們來看一下它的架構(gòu)圖

rmq-basic-arc.png

總共有四大部分:NameServer,Broker庐镐,Producer恩商,Consumer。

NameServer

NameServer主要包括兩個主要功能:

  • 1.管理brokers:broker服務(wù)器啟動時會注冊到NameServer上必逆,并且兩者之間保持心跳監(jiān)測機(jī)制怠堪,以此來保證NameServer知道broker的存活狀態(tài);
  • 2.路由信息管理:每一臺NameServer都存有全部的broker集群信息和生產(chǎn)者/消費(fèi)者客戶端的請求信息名眉;

Namesrv用于存儲Topic粟矿、Broker關(guān)系信息,功能簡單损拢,穩(wěn)定性高陌粹。多個Namesrv之間相互沒有通信,單臺Namesrv宕機(jī)不影響其他Namesrv與集群福压;即使整個Namesrv集群宕機(jī)掏秩,已經(jīng)正常工作的Producer,Consumer隧膏,Broker仍然能正常工作哗讥,但新起的Producer, Consumer,Broker就無法工作胞枕。

注意:
Namesrv壓力不會太大杆煞,平時主要開銷是在維持心跳和提供Topic-Broker的關(guān)系數(shù)據(jù)。但有一點(diǎn)需要注意腐泻,Broker向Namesr發(fā)心跳時决乎,會帶上當(dāng)前自己所負(fù)責(zé)的所有Topic信息,如果Topic個數(shù)太多(萬級別)派桩,會導(dǎo)致一次心跳中构诚,就Topic的數(shù)據(jù)就幾十M,網(wǎng)絡(luò)情況差的話铆惑,網(wǎng)絡(luò)傳輸失敗范嘱,心跳失敗,導(dǎo)致Namesrv誤認(rèn)為Broker心跳失敗员魏。

Broker

Broker的四大作用:

請求分發(fā):是client的入口丑蛤,接收來自生產(chǎn)者消費(fèi)者的請求
client管理:管理客戶(產(chǎn)品/消費(fèi)者)并維護(hù)消費(fèi)者的主題訂閱。
數(shù)據(jù)存儲:提供簡單的api來查詢磁盤上的臨時數(shù)據(jù)
高可用:主從節(jié)點(diǎn)間同步數(shù)據(jù)保證高可用

Broker的優(yōu)勢

1.負(fù)載均衡:Broker上存Topic信息撕阎,Topic由多個隊(duì)列組成受裹,隊(duì)列會平均分散在多個Broker上,而Producer的發(fā)送機(jī)制保證消息盡量平均分布到所有隊(duì)列中,最終效果就是所有消息都平均落在每個Broker上棉饶。

2.動態(tài)伸縮能力(非順序消息):Broker的伸縮性體現(xiàn)在兩個維度:Topic, Broker厦章。

Topic維度:假如一個Topic的消息量特別大,但集群水位壓力還是很低照藻,就可以擴(kuò)大該Topic的隊(duì)列數(shù)袜啃,Topic的隊(duì)列數(shù)跟發(fā)送、消費(fèi)速度成正比岩梳。
Broker維度:如果集群水位很高了囊骤,需要擴(kuò)容,直接加機(jī)器部署B(yǎng)roker就可以冀值。Broker起來后想Namesrv注冊也物,Producer、Consumer通過Namesrv發(fā)現(xiàn)新Broker列疗,立即跟該Broker直連滑蚯,收發(fā)消息。

3.高可用&高可靠

高可用:集群部署時一般都為主備抵栈,備機(jī)實(shí)時從主機(jī)同步消息告材,如果其中一個主機(jī)宕機(jī),備機(jī)提供消費(fèi)服務(wù)古劲,但不提供寫服務(wù)斥赋。
高可靠:所有發(fā)往broker的消息,有同步刷盤和異步刷盤機(jī)制产艾;同步刷盤時疤剑,消息寫入物理文件才會返回成功,異步刷盤時闷堡,只有機(jī)器宕機(jī)隘膘,才會產(chǎn)生消息丟失,broker掛掉可能會發(fā)生杠览,但是機(jī)器宕機(jī)崩潰是很少發(fā)生的弯菊,除非突然斷電

Producer

Producer啟動時,需要指定Namesrv的地址踱阿,從Namesrv集群中選一臺建立長連接管钳。如果該Namesrv宕機(jī),會自動連其他Namesrv软舌。直到有可用的Namesrv為止才漆。生產(chǎn)者每30秒從Namesrv獲取Topic跟Broker的映射關(guān)系,更新到本地內(nèi)存中葫隙。再跟Topic涉及的所有Broker建立長連接栽烂,每隔30秒發(fā)一次心跳躏仇。
RocketMQ提供三種發(fā)送方式:

同步:在廣泛的場景中使用可靠的同步傳輸恋脚,如重要的通知信息腺办、短信通知、短信營銷系統(tǒng)等糟描。
異步:異步發(fā)送通常用于響應(yīng)時間敏感的業(yè)務(wù)場景怀喉,發(fā)送出去即刻返回,利用回調(diào)做后續(xù)處理船响。
一次性:一次性發(fā)送用于需要中等可靠性的情況躬拢,如日志收集,發(fā)送出去即完成见间,不用等待發(fā)送結(jié)果聊闯,回調(diào)等等。

生產(chǎn)者端的負(fù)載均衡

生產(chǎn)者發(fā)送時米诉,會自動輪詢當(dāng)前所有可發(fā)送的broker菱蔬,一條消息發(fā)送成功,下次換另外一個broker發(fā)送史侣,以達(dá)到消息平均落到所有的broker上拴泌。

Consumer

消費(fèi)客戶端的連接方式和生產(chǎn)者類似。

消費(fèi)者端的負(fù)載均衡

先討論消費(fèi)者的消費(fèi)模式惊橱,消費(fèi)者有兩種模式消費(fèi):集群消費(fèi)蚪腐,廣播消費(fèi)。

廣播消費(fèi):每個消費(fèi)者消費(fèi)Topic下的所有隊(duì)列税朴。
集群消費(fèi):一個topic可以由同一個ID下所有消費(fèi)者分擔(dān)消費(fèi)回季。
具體例子:假如TopicA有6個隊(duì)列,某個消費(fèi)者ID起了2個消費(fèi)者實(shí)例掉房,那么每個消費(fèi)者負(fù)責(zé)消費(fèi)3個隊(duì)列茧跋。如果再增加一個消費(fèi)者ID相同消費(fèi)者實(shí)例,即當(dāng)前共有3個消費(fèi)者同時消費(fèi)6個隊(duì)列卓囚,那每個消費(fèi)者負(fù)責(zé)2個隊(duì)列的消費(fèi)瘾杭。

消費(fèi)者端的負(fù)載均衡,就是集群消費(fèi)模式下哪亿,同一個ID的所有消費(fèi)者實(shí)例平均消費(fèi)該Topic的所有隊(duì)列粥烁。

消費(fèi)者從用戶角度來看有兩種類型:

PullConsumer:主動從brokers經(jīng)紀(jì)人處拉取消息。一旦拉取到批量的數(shù)據(jù)蝇棉,用戶應(yīng)用的消費(fèi)進(jìn)程初始化讨阻。
PushConsumer:封裝消息拉取、消費(fèi)進(jìn)程和內(nèi)部其他工作維護(hù)篡殷,留下一個回調(diào)接口讓用戶實(shí)現(xiàn)钝吮,當(dāng)消息到達(dá)時即可執(zhí)行用戶實(shí)現(xiàn)邏輯。

補(bǔ)充一些概念

Topic:主題,是生產(chǎn)者發(fā)送的消息和消費(fèi)者拉取的消息的規(guī)類奇瘦。Topic與生產(chǎn)者和消費(fèi)者都是非常松散的關(guān)系棘催,一個topic可以有0個或者1個或者多個生產(chǎn)者向其發(fā)送消息,換句話說耳标,一個生產(chǎn)者可以同時向不同和topic發(fā)送消息醇坝。從消費(fèi)者的解度來說,一個topic可能被0個或者一個或者多個消費(fèi)組訂閱次坡,類似的呼猪,一個消費(fèi)組可以訂閱一個或者多個主題只要這個消費(fèi)組的實(shí)例保持他們的訂閱一致。

Message:消息砸琅,要傳輸?shù)男畔ⅰ?/strong>一個message必須有一個主題宋距,主題可以看做是你的信件要郵寄的地址。一個消息也可以擁有一個可選的tag和額處的鍵值對症脂。如你可能需要給你的message設(shè)置一個業(yè)務(wù)key和要boker服務(wù)上查找此message乡革,以便在開發(fā)期間查找問題。

Message Queue:消息隊(duì)列摊腋,一個主題被化分為一個或者多個子主題(sub-topics)沸版,“消息隊(duì)列”.

Tag:標(biāo)簽,換而言之為子主題兴蒸,為用戶提供額外的靈活性视粮。使用tag,同一業(yè)務(wù)模塊不同目的的messages就可以用相同topic不同tag來標(biāo)識橙凳。Tags有益于保持你的代碼干凈而條理清晰蕾殴,同時促進(jìn)使用RocketMQ提供的查詢系統(tǒng)的效率。Topic:主題岛啸,是生產(chǎn)者發(fā)送的消息和消費(fèi)者拉取的消息的規(guī)類钓觉。Topic與生產(chǎn)者和消費(fèi)者都是非常松散的關(guān)系,一個topic可以有0個或者1個或者多個生產(chǎn)者向其發(fā)送消息坚踩,換句話說荡灾,一個生產(chǎn)者可以同時向不同和topic發(fā)送消息。從消費(fèi)者的解度來說瞬铸,一個topic可能被0個或者一個或者多個消費(fèi)組訂閱批幌,類似的,一個消費(fèi)組可以訂閱一個或者多個主題只要這個消費(fèi)組的實(shí)例保持他們的訂閱一致嗓节。

Message Order:當(dāng)使用DefaultMQPushConsumer時荧缘,你需要確定消費(fèi)消息的方式:

Orderly:順序地消費(fèi)消息即表示消費(fèi)的消息順序同生產(chǎn)者發(fā)送的順序一致。
Concurrently:并行消費(fèi)拦宣。指定此方式消費(fèi)截粗,信息消費(fèi)的最大并行數(shù)量僅受限于每個消費(fèi)者客戶端指定的線程池信姓。

Consumer Group:消費(fèi)組,把同樣角色的消費(fèi)乾分組到一起即消費(fèi)者組绸罗。消費(fèi)者組是實(shí)現(xiàn)負(fù)載均衡目標(biāo)和容錯目標(biāo)的一個重要概念财破。就信息消費(fèi)而言,超級easy从诲。
Producer Group:生產(chǎn)者組,是將同樣角色生產(chǎn)者的分組在一起靡羡。同一生產(chǎn)組的不同生產(chǎn)者實(shí)例都會被Broker經(jīng)紀(jì)人聯(lián)絡(luò)告知提交或者回滾事務(wù)系洛,以避免事務(wù)后源生產(chǎn)者崩潰。

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末略步,一起剝皮案震驚了整個濱河市描扯,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌趟薄,老刑警劉巖绽诚,帶你破解...
    沈念sama閱讀 212,383評論 6 493
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異杭煎,居然都是意外死亡恩够,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,522評論 3 385
  • 文/潘曉璐 我一進(jìn)店門羡铲,熙熙樓的掌柜王于貴愁眉苦臉地迎上來蜂桶,“玉大人,你說我怎么就攤上這事也切∑嗣模” “怎么了?”我有些...
    開封第一講書人閱讀 157,852評論 0 348
  • 文/不壞的土叔 我叫張陵雷恃,是天一觀的道長疆股。 經(jīng)常有香客問我,道長倒槐,這世上最難降的妖魔是什么旬痹? 我笑而不...
    開封第一講書人閱讀 56,621評論 1 284
  • 正文 為了忘掉前任,我火速辦了婚禮讨越,結(jié)果婚禮上唱凯,老公的妹妹穿的比我還像新娘。我一直安慰自己谎痢,他們只是感情好磕昼,可當(dāng)我...
    茶點(diǎn)故事閱讀 65,741評論 6 386
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著节猿,像睡著了一般票从。 火紅的嫁衣襯著肌膚如雪漫雕。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 49,929評論 1 290
  • 那天峰鄙,我揣著相機(jī)與錄音浸间,去河邊找鬼。 笑死吟榴,一個胖子當(dāng)著我的面吹牛魁蒜,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播吩翻,決...
    沈念sama閱讀 39,076評論 3 410
  • 文/蒼蘭香墨 我猛地睜開眼兜看,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了狭瞎?” 一聲冷哼從身側(cè)響起细移,我...
    開封第一講書人閱讀 37,803評論 0 268
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎熊锭,沒想到半個月后胶哲,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體站宗,經(jīng)...
    沈念sama閱讀 44,265評論 1 303
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,582評論 2 327
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了桑阶。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片任斋。...
    茶點(diǎn)故事閱讀 38,716評論 1 341
  • 序言:一個原本活蹦亂跳的男人離奇死亡如蚜,死狀恐怖浅碾,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情从祝,我是刑警寧澤襟己,帶...
    沈念sama閱讀 34,395評論 4 333
  • 正文 年R本政府宣布,位于F島的核電站牍陌,受9級特大地震影響擎浴,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜毒涧,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 40,039評論 3 316
  • 文/蒙蒙 一贮预、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧契讲,春花似錦仿吞、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,798評論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至银伟,卻和暖如春你虹,著一層夾襖步出監(jiān)牢的瞬間绘搞,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 32,027評論 1 266
  • 我被黑心中介騙來泰國打工傅物, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留夯辖,地道東北人。 一個月前我還...
    沈念sama閱讀 46,488評論 2 361
  • 正文 我出身青樓董饰,卻偏偏與公主長得像蒿褂,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子卒暂,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 43,612評論 2 350

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