分布式消息系列:詳解RocketMQ的簡(jiǎn)介與演進(jìn)喇肋、架構(gòu)設(shè)計(jì)、關(guān)鍵特性及應(yīng)用場(chǎng)景

終身學(xué)習(xí)是程序員的必備能力迹辐,一群人在一起走得更遠(yuǎn)蝶防,一起學(xué)習(xí),共抗惰性明吩。今天间学,我們來(lái)重點(diǎn)了解RocketMQ的簡(jiǎn)介與演進(jìn)、架構(gòu)設(shè)計(jì)印荔、關(guān)鍵特性及應(yīng)用場(chǎng)景等內(nèi)容低葫。


本文內(nèi)容大綱:

RocketMQ的簡(jiǎn)介與演進(jìn)

RocketMQ的架構(gòu)設(shè)計(jì)

RocketMQ的關(guān)鍵特性

RocketMQ的應(yīng)用場(chǎng)景


01? ?RocketMQ的簡(jiǎn)介

RocketMQ是一個(gè)純java、分布式仍律、隊(duì)列模型的開(kāi)源消息中間件嘿悬,前身是MetaQ,是阿里研發(fā)的一個(gè)隊(duì)列模型的消息中間件水泉,后開(kāi)源給apache基金會(huì)成為了apache的頂級(jí)開(kāi)源項(xiàng)目善涨,具有高性能主到、高可靠、高實(shí)時(shí)躯概、分布式特點(diǎn)登钥。


02? RocketMQ的演進(jìn)

RocketMQ一共前后經(jīng)歷了三代演進(jìn):


1.第一代,推模式

數(shù)據(jù)存儲(chǔ)采用關(guān)系型數(shù)據(jù)庫(kù)娶靡,典型代表包括Notify牧牢、Napoli。


2.第二代姿锭,拉模式


自研的專(zhuān)有消息存儲(chǔ)塔鳍,在日志處理方面參考Kafka,典型代表MetaQ呻此。


3.第三代轮纫,以拉模式為主,兼有推模式


低延遲消息引擎RocketMQ焚鲜,在二代功能特性的基礎(chǔ)上掌唾,為電商金融領(lǐng)域添加了可靠重試、基于文件存儲(chǔ)的分布式事務(wù)等特性忿磅。使用在阿里大量的應(yīng)用上糯彬,典型如雙11場(chǎng)景,具有萬(wàn)億級(jí)消息流轉(zhuǎn)葱她。


03? RocketMQ的架構(gòu)設(shè)計(jì)


1.RocketMQ的核心組件

RocketMQ主要由NameServer撩扒、Broker、Producer以及Consumer四部分構(gòu)成吨些。


1)NameServer:主要負(fù)責(zé)對(duì)于源數(shù)據(jù)的管理搓谆,包括了對(duì)于Topic和路由信息的管理。

NameServer是一個(gè)功能齊全的服務(wù)器豪墅,其角色類(lèi)似Dubbo中的Zookeeper泉手,但NameServer與Zookeeper相比更輕量。主要是因?yàn)槊總€(gè)NameServer節(jié)點(diǎn)互相之間是獨(dú)立的但校,沒(méi)有任何信息交互螃诅。

備注:下面的消息類(lèi)型有Topic的介紹啡氢。


2) Producer

消息生產(chǎn)者状囱,負(fù)責(zé)產(chǎn)生消息,一般由業(yè)務(wù)系統(tǒng)負(fù)責(zé)產(chǎn)生消息倘是。

Producer由用戶(hù)進(jìn)行分布式部署亭枷,消息由Producer通過(guò)多種負(fù)載均衡模式發(fā)送到Broker集群,發(fā)送低延時(shí)搀崭,支持快速失敗叨粘。


3 )Broker

消息中轉(zhuǎn)角色猾编,負(fù)責(zé)存儲(chǔ)消息,轉(zhuǎn)發(fā)消息升敲。

Broker是具體提供業(yè)務(wù)的服務(wù)器答倡,單個(gè)Broker節(jié)點(diǎn)與所有的NameServer節(jié)點(diǎn)保持長(zhǎng)連接及心跳,并會(huì)定時(shí)將Topic信息注冊(cè)到NameServer驴党,順帶一提底層的通信和連接都是基于Netty實(shí)現(xiàn)的瘪撇。

Broker負(fù)責(zé)消息存儲(chǔ),以Topic為緯度支持輕量級(jí)的隊(duì)列港庄,單機(jī)可以支撐上萬(wàn)隊(duì)列規(guī)模倔既,支持消息推拉模型。

官網(wǎng)上有數(shù)據(jù)顯示:具有上億級(jí)消息堆積能力鹏氧,同時(shí)可嚴(yán)格保證消息的有序性渤涌。


4)Consumer

消息消費(fèi)者,負(fù)責(zé)消費(fèi)消息把还,一般是后臺(tái)系統(tǒng)負(fù)責(zé)異步消費(fèi)实蓬。

Consumer也由用戶(hù)部署,支持PUSH和PULL兩種消費(fèi)模式吊履,支持集群消費(fèi)和廣播消息瞳秽,提供實(shí)時(shí)的消息訂閱機(jī)制。


5)大致流程

Broker在啟動(dòng)的時(shí)候會(huì)去向NameServer注冊(cè)并且定時(shí)發(fā)送心跳率翅,Producer在啟動(dòng)的時(shí)候會(huì)到NameServer上去拉取Topic所屬的Broker具體地址练俐,然后向具體的Broker發(fā)送消息。具體如下圖:



2.RocketMQ的消息領(lǐng)域模型

主要分為Message冕臭、Topic腺晾、Queue、Offset以及Group這幾部分辜贵。


1)Topic

Topic表示消息的第一級(jí)類(lèi)型悯蝉,比如一個(gè)電商系統(tǒng)的消息可以分為:交易消息、物流消息等托慨。一條消息必須有一個(gè)Topic鼻由。

最細(xì)粒度的訂閱單位,一個(gè)Group可以訂閱多個(gè)Topic的消息厚棵。


2)Tag

Tag表示消息的第二級(jí)類(lèi)型蕉世,比如交易消息又可以分為:交易創(chuàng)建消息,交易完成消息等婆硬。RocketMQ提供2級(jí)消息分類(lèi)狠轻,方便靈活控制。


3)Group

組彬犯,一個(gè)組可以訂閱多個(gè)Topic向楼。


4)Message Queue

消息的物理管理單位查吊。一個(gè)Topic下可以有多個(gè)Queue,Queue的引入使得消息的存儲(chǔ)可以分布式集群化湖蜕,具有了水平擴(kuò)展能力逻卖。

在 RocketMQ 中,所有消息隊(duì)列都是持久化昭抒,長(zhǎng)度無(wú)限的數(shù)據(jù)結(jié)構(gòu)箭阶,所謂長(zhǎng)度無(wú)限是指隊(duì)列中的每個(gè)存儲(chǔ)單元都是定長(zhǎng),訪問(wèn)其中的存儲(chǔ)單元使用 Offset 來(lái)訪問(wèn)戈鲁,offset 為 java long 類(lèi)型仇参,64 位,理論上在 100年內(nèi)不會(huì)溢出婆殿,所以認(rèn)為是長(zhǎng)度無(wú)限诈乒。

也可以認(rèn)為 Message Queue 是一個(gè)長(zhǎng)度無(wú)限的數(shù)組,Offset 就是下標(biāo)婆芦。


04? ?RocketMQ的關(guān)鍵特性


1.消息的順序

消息的順序指的是消息消費(fèi)時(shí)怕磨,能按照發(fā)送的順序來(lái)消費(fèi)。例如:一個(gè)訂單產(chǎn)生了 3 條消息消约,分別是訂單創(chuàng)建肠鲫、訂單付款、訂單完成或粮。消費(fèi)時(shí)导饲,要按照這個(gè)順序消費(fèi)才有意義。但同時(shí)訂單之間又是可以并行消費(fèi)的氯材。

RocketMQ是通過(guò)將“相同ID的消息發(fā)送到同一個(gè)隊(duì)列渣锦,而一個(gè)隊(duì)列的消息只由一個(gè)消費(fèi)者處理“來(lái)實(shí)現(xiàn)順序消息。如下圖:

這樣對(duì)于同一個(gè)訂單的創(chuàng)建氢哮、付款和完成消息袋毙,確保按照這一順序被發(fā)送和消費(fèi)。


2.消息重復(fù)

1)消息重復(fù)的原因

消息領(lǐng)域有一個(gè)對(duì)消息投遞的QoS定義冗尤,分為:

最多一次(At most once)

至少一次(At least once)

僅一次( Exactly once)


QoS:Quality of Service听盖,服務(wù)質(zhì)量

幾乎所有的MQ產(chǎn)品都聲稱(chēng)自己做到了At least once。既然是至少一次裂七,那避免不了消息重復(fù)皆看,尤其是在分布式網(wǎng)絡(luò)環(huán)境下。比如:網(wǎng)絡(luò)原因閃斷碍讯,ACK返回失敗等等故障悬蔽,確認(rèn)信息沒(méi)有傳送到消息隊(duì)列,導(dǎo)致消息隊(duì)列不知道自己已經(jīng)消費(fèi)過(guò)該消息了捉兴,再次將該消息分發(fā)給其他的消費(fèi)者蝎困。

不同的消息隊(duì)列發(fā)送的確認(rèn)信息形式不同,例如RabbitMQ是發(fā)送一個(gè)ACK確認(rèn)消息,RocketMQ是返回一個(gè)CONSUME_SUCCESS成功標(biāo)志倍啥,kafka實(shí)際上有個(gè)offset的概念禾乘。

RocketMQ沒(méi)有內(nèi)置消息去重的解決方案,最新版本是否支持還需確認(rèn)虽缕。


2)消息去重


去重原則:利用業(yè)務(wù)端邏輯保持冪等性

冪等性:就是用戶(hù)對(duì)于同一操作發(fā)起的一次請(qǐng)求或者多次請(qǐng)求的結(jié)果是一致的始藕,不會(huì)因?yàn)槎啻吸c(diǎn)擊而產(chǎn)生了副作用,數(shù)據(jù)庫(kù)的結(jié)果都是唯一的氮趋,不可變的。

只要保持冪等性,不管來(lái)多少條重復(fù)消息养盗,最后處理的結(jié)果都一樣袱巨,需要業(yè)務(wù)端來(lái)實(shí)現(xiàn)。


去重策略:保證每條消息都有唯一編號(hào)(比如唯一流水號(hào))昵观,且保證消息處理成功與去重表的日志同時(shí)出現(xiàn)晾腔。

建立一個(gè)消息表,拿到這個(gè)消息做數(shù)據(jù)庫(kù)的insert操作啊犬。給這個(gè)消息做一個(gè)唯一主鍵(primary key)或者唯一約束灼擂,那么就算出現(xiàn)重復(fù)消費(fèi)的情況,就會(huì)導(dǎo)致主鍵沖突觉至,那么就不再處理這條消息剔应。


05? ?RocketMQ的應(yīng)用場(chǎng)景


1.削峰填谷

比如如秒殺等大型活動(dòng)時(shí)會(huì)帶來(lái)較高的流量脈沖,如果沒(méi)做相應(yīng)的保護(hù)语御,將導(dǎo)致系統(tǒng)超負(fù)荷甚至崩潰领斥。如果因限制太過(guò)導(dǎo)致請(qǐng)求大量失敗而影響用戶(hù)體驗(yàn),可以利用MQ 超高性能的消息處理能力來(lái)解決沃暗。


2.異步解耦

通過(guò)上月洛、下游業(yè)務(wù)系統(tǒng)的松耦合設(shè)計(jì),比如:交易系統(tǒng)的下游子系統(tǒng)(如積分等)出現(xiàn)不可用甚至宕機(jī)孽锥,都不會(huì)影響到核心交易系統(tǒng)的正常運(yùn)轉(zhuǎn)嚼黔。


3.順序消息

與FIFO原理類(lèi)似,提供的順序消息即保證消息的先進(jìn)先出惜辑,可以應(yīng)用于交易系統(tǒng)中的訂單創(chuàng)建唬涧、支付、退款等流程盛撑。


4.分布式事務(wù)消息

比如阿里的交易系統(tǒng)碎节、支付紅包等場(chǎng)景需要確保數(shù)據(jù)的最終一致性,需要考慮引入 MQ 的分布式事務(wù)抵卫。主要是將大事務(wù)拆分成小事務(wù)狮荔,減少系統(tǒng)間的交互胎撇,既高效又可靠。再利用MQ 的可靠傳輸與多副本技術(shù)確保消息不丟殖氏,At-Least-Once 特性來(lái)最終確保數(shù)據(jù)的最終一致性晚树。


覺(jué)得不錯(cuò)請(qǐng)點(diǎn)贊支持,歡迎留言或進(jìn)我的個(gè)人群179961551領(lǐng)取【架構(gòu)資料專(zhuān)題目合集90期】雅采、【BATJTMD大廠JAVA面試真題1000+】爵憎,本群專(zhuān)用于學(xué)習(xí)交流技術(shù)、分享面試機(jī)會(huì)婚瓜,拒絕廣告宝鼓,我也會(huì)在群內(nèi)不定期答題、探討巴刻。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末愚铡,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子冈涧,更是在濱河造成了極大的恐慌茂附,老刑警劉巖,帶你破解...
    沈念sama閱讀 211,423評(píng)論 6 491
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件督弓,死亡現(xiàn)場(chǎng)離奇詭異营曼,居然都是意外死亡,警方通過(guò)查閱死者的電腦和手機(jī)愚隧,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,147評(píng)論 2 385
  • 文/潘曉璐 我一進(jìn)店門(mén)蒂阱,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái),“玉大人狂塘,你說(shuō)我怎么就攤上這事录煤。” “怎么了荞胡?”我有些...
    開(kāi)封第一講書(shū)人閱讀 157,019評(píng)論 0 348
  • 文/不壞的土叔 我叫張陵妈踊,是天一觀的道長(zhǎng)。 經(jīng)常有香客問(wèn)我泪漂,道長(zhǎng)廊营,這世上最難降的妖魔是什么? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 56,443評(píng)論 1 283
  • 正文 為了忘掉前任萝勤,我火速辦了婚禮露筒,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘敌卓。我一直安慰自己慎式,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 65,535評(píng)論 6 385
  • 文/花漫 我一把揭開(kāi)白布。 她就那樣靜靜地躺著瘪吏,像睡著了一般癣防。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上肪虎,一...
    開(kāi)封第一講書(shū)人閱讀 49,798評(píng)論 1 290
  • 那天劣砍,我揣著相機(jī)與錄音惧蛹,去河邊找鬼扇救。 笑死,一個(gè)胖子當(dāng)著我的面吹牛香嗓,可吹牛的內(nèi)容都是我干的迅腔。 我是一名探鬼主播,決...
    沈念sama閱讀 38,941評(píng)論 3 407
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼靠娱,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼沧烈!你這毒婦竟也來(lái)了?” 一聲冷哼從身側(cè)響起像云,我...
    開(kāi)封第一講書(shū)人閱讀 37,704評(píng)論 0 266
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤锌雀,失蹤者是張志新(化名)和其女友劉穎,沒(méi)想到半個(gè)月后迅诬,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體腋逆,經(jīng)...
    沈念sama閱讀 44,152評(píng)論 1 303
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,494評(píng)論 2 327
  • 正文 我和宋清朗相戀三年侈贷,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了惩歉。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 38,629評(píng)論 1 340
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡俏蛮,死狀恐怖撑蚌,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情搏屑,我是刑警寧澤争涌,帶...
    沈念sama閱讀 34,295評(píng)論 4 329
  • 正文 年R本政府宣布,位于F島的核電站辣恋,受9級(jí)特大地震影響亮垫,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜抑党,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,901評(píng)論 3 313
  • 文/蒙蒙 一包警、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧底靠,春花似錦害晦、人聲如沸。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 30,742評(píng)論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)鲫剿。三九已至,卻和暖如春稻轨,著一層夾襖步出監(jiān)牢的瞬間灵莲,已是汗流浹背。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 31,978評(píng)論 1 266
  • 我被黑心中介騙來(lái)泰國(guó)打工殴俱, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留政冻,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 46,333評(píng)論 2 360
  • 正文 我出身青樓线欲,卻偏偏與公主長(zhǎng)得像明场,于是被迫代替她去往敵國(guó)和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子李丰,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 43,499評(píng)論 2 348

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

  • 昨天晚上和李先生帶著嘟寶去商場(chǎng)的茉莉幻想兒童游樂(lè)園玩耍苦锨,游樂(lè)園專(zhuān)門(mén)針對(duì)小寶寶們,所以地上都鋪有地毯趴泌,十個(gè)半月齡的嘟...
    噶蹦豆閱讀 270評(píng)論 0 0
  • 1.3.5 什么是優(yōu)雅代碼 代碼邏輯直截了當(dāng) 舟舒,叫缺陷難以隱藏; 盡量減少依賴(lài)關(guān)系嗜憔,使代碼易于維護(hù)秃励; 依據(jù)某種分層...
    oliversmallgan閱讀 193評(píng)論 0 0
  • 上單篇 對(duì)線發(fā)育王:姿態(tài)上場(chǎng)3次,場(chǎng)均壓刀74.67刀痹筛,足足比排在第二名的MaRin多出近35刀莺治。Looper和圣...
    PentaQ刺猬電競(jìng)社閱讀 425評(píng)論 0 0