如何從零到一設(shè)計(jì)一個(gè)MQ消息隊(duì)列

消息隊(duì)列整體設(shè)計(jì)思路

主要是設(shè)計(jì)一個(gè)整體的消息被消費(fèi)的數(shù)據(jù)流。

這里會(huì)涉及到:消息生產(chǎn)Producer拳球、Broker(消息服務(wù)端)、消息消費(fèi)者Consumer。

file

1.Producer(消息生產(chǎn)者):發(fā)送消息到Broker债蓝。

2.Broker(服務(wù)端):Broker這個(gè)概念主要來自于Apache的ActiveMQ,特指消息隊(duì)列的服務(wù)端盛龄。

主要功能就是:把消息從發(fā)送端傳送到接收端饰迹,這里會(huì)涉及到消息的存儲(chǔ)、消息通訊機(jī)制等余舶。

3.Consumer(消息消費(fèi)者):從消息隊(duì)列接收消息啊鸭,consumer回復(fù)消費(fèi)確認(rèn)。

Broker(消息隊(duì)列服務(wù)端)設(shè)計(jì)重點(diǎn)
1)消息的轉(zhuǎn)儲(chǔ):在更合適的時(shí)間點(diǎn)投遞匿值,或者通過一系列手段輔助消息最終能送達(dá)消費(fèi)機(jī)赠制。

2)規(guī)范一種范式和通用的模式,以滿足解耦挟憔、最終一致性钟些、錯(cuò)峰等需求烟号。

3)其實(shí)簡單理解就是一個(gè)消息轉(zhuǎn)發(fā)器,把一次RPC做成兩次RPC政恍,發(fā)送者把消息投遞到broker汪拥,broker再將消息轉(zhuǎn)發(fā)一手到接收端。

總結(jié)起來就是兩次RPC加一次轉(zhuǎn)儲(chǔ)篙耗,如果要做消費(fèi)確認(rèn)迫筑,則是三次RPC。

為了實(shí)現(xiàn)上述消息隊(duì)列的基礎(chǔ)功能:

  • 消息的傳輸
  • 存儲(chǔ)
  • 消費(fèi)

就需要涉及到如下三個(gè)方面的設(shè)計(jì):

  • 通信協(xié)議
  • 存儲(chǔ)選擇
  • 消費(fèi)關(guān)系維護(hù)
file
通訊協(xié)議

消息Message:既是信息的載體宗弯,消息發(fā)送者需要知道如何構(gòu)造消息铣焊,消息接收者需要知道如何解析消息,它們需要按照一種統(tǒng)一的格式描述消息罕伯,這種統(tǒng)一的格式稱之為消息協(xié)議曲伊。

傳統(tǒng)的通信協(xié)議標(biāo)準(zhǔn)有XMPP和AMQP協(xié)議等,現(xiàn)在更多的消息隊(duì)列從性能的角度出發(fā)使用自己設(shè)計(jì)實(shí)現(xiàn)的通信協(xié)議追他。

1.JMS
JMS(Java MessageService)實(shí)際上是指JMS API坟募。JMS是由Sun公司早期提出的消息標(biāo)準(zhǔn),旨在為java應(yīng)用提供統(tǒng)一的消息操作邑狸,包括創(chuàng)建消息懈糯、發(fā)送消息、接收消息等单雾。

JMS通常包含如下一些角色:

file

JMS提供了兩種消息模型:

  • 點(diǎn)對點(diǎn)
  • 以及publish-subscribe(發(fā)布訂閱)模型赚哗。

當(dāng)采用點(diǎn)對點(diǎn)模型時(shí),消息將發(fā)送到一個(gè)隊(duì)列硅堆,該隊(duì)列的消息只能被一個(gè)消費(fèi)者消費(fèi)屿储。

file

而采用發(fā)布訂閱模型時(shí),消息可以被多個(gè)消費(fèi)者消費(fèi)渐逃。

在發(fā)布訂閱模型中够掠,生產(chǎn)者和消費(fèi)者完全獨(dú)立,不需要感知對方的存在茄菊。

2.AMQP

AMQP是 Advanced Message Queuing Protocol疯潭,即高級(jí)消息隊(duì)列協(xié)議。

AMQP不是一個(gè)具體的消息隊(duì)列實(shí)現(xiàn)面殖,而 是一個(gè)標(biāo)準(zhǔn)化的消息中間件協(xié)議竖哩。

目標(biāo)是讓不同語言,不同系統(tǒng)的應(yīng)用互相通信脊僚,并提供一個(gè)簡單統(tǒng)一的模型和編程接口相叁。 目前主流的ActiveMQ和RabbitMQ都支持AMQP協(xié)議。

AMQP是一種協(xié)議,更準(zhǔn)確的說是一種binary wire-level protocol(鏈接協(xié)議)钝荡。這是其和JMS的本質(zhì)差別,AMQP不從API層進(jìn)行限定舶衬,而是直接定義網(wǎng)絡(luò)交換的數(shù)據(jù)格式埠通。

JMS和AMQP比較

JMS: 只允許基于JAVA實(shí)現(xiàn)的消息平臺(tái)的之間進(jìn)行通信

AMQP: AMQP允許多種技術(shù)同時(shí)進(jìn)行協(xié)議通信

3.Kafka的通信協(xié)議

Kafka的Producer、Broker和Consumer之間采用的是一套自行設(shè)計(jì)的基于TCP層的協(xié)議逛犹。Kafka的這套協(xié)議完全是為了Kafka自身的業(yè)務(wù)需求而定制的端辱。

file
存儲(chǔ)選型

對于分布式系統(tǒng),存儲(chǔ)的選擇有以下幾種

  • 內(nèi)存
  • 本地文件系統(tǒng)
  • 分布式文件系統(tǒng)
  • nosql
  • DB

從速度上內(nèi)存顯然是最快的虽画,對于允許消息丟失舞蔽,消息堆積能力要求不高的場景(例如日志),內(nèi)存會(huì)是比較好的選擇码撰。

DB則是最簡單的實(shí)現(xiàn)可靠存儲(chǔ)的方案渗柿,很適合用在可靠性要求很高,最終一致性的場景(例如交易消息)脖岛,對于不需要100%保證數(shù)據(jù)完整性的場景朵栖,要求性能和消息堆積的場景,hbase也是一個(gè)很好的選擇柴梆。

理論上陨溅,從速度來看,文件系統(tǒng)>分布式KV(持久化)>分布式文件系統(tǒng)>數(shù)據(jù)庫绍在,而可靠性卻截然相反门扇。

還是要從支持的業(yè)務(wù)場景出發(fā)作出最合理的選擇,如果你們的消息隊(duì)列是用來支持支付/交易等對可靠性要求非常高偿渡,但對性能和量的要求沒有這么高臼寄,而且沒有時(shí)間精力專門做文件存儲(chǔ)系統(tǒng)的研究,DB是最好的選擇溜宽。

對于不需要100%保證數(shù)據(jù)完整性的場景脯厨,要求性能和消息堆積的場景,hbase也是一個(gè)很好的選擇坑质,典型的比如 kafka的消息落地可以使用hadoop合武。

消費(fèi)關(guān)系處理

現(xiàn)在我們的消息隊(duì)列初步具備了轉(zhuǎn)儲(chǔ)消息的能力。

下面一個(gè)重要的事情就是解析發(fā)送接收關(guān)系涡扼,進(jìn)行正確的消息投遞了稼跳。

市面上的消息隊(duì)列定義了一堆讓人暈頭轉(zhuǎn)向的名詞,如JMS 規(guī)范中的Topic/Queue吃沪,Kafka里面的Topic/Partition/ConsumerGroup汤善,RabbitMQ里面的Exchange等等。

拋開現(xiàn)象看本質(zhì),無外乎是單播與廣播的區(qū)別红淡。

所謂單播不狮,就是點(diǎn)到點(diǎn);而廣播在旱,是一點(diǎn)對多點(diǎn)摇零。

為了實(shí)現(xiàn)廣播功能,我們必須要維護(hù)消費(fèi)關(guān)系桶蝎,通常消息隊(duì)列本身不維護(hù)消費(fèi)訂閱關(guān)系驻仅,可以利用zookeeper等成熟的系統(tǒng)維護(hù)消費(fèi)關(guān)系,在消費(fèi)關(guān)系發(fā)生變化時(shí)下發(fā)通知登渣。

消息隊(duì)列需要支持高級(jí)特性

除了上述的消息隊(duì)列基本功能以外噪服,消息隊(duì)列在某些特殊的場景還需要支持事務(wù),消息重試等功能胜茧。

file
  • 消息的順序
  • 投遞可靠性保證
  • 消息持久化
  • 支持不同消息模型
  • 多實(shí)例集群功能
  • 事務(wù)特性等

以上就是如何設(shè)計(jì)一個(gè)消息隊(duì)列MQ的介紹粘优,由于篇幅關(guān)系,后續(xù)再詳解消息隊(duì)列需要支持的高級(jí)特性呻顽。

file

本文由博客一文多發(fā)平臺(tái) OpenWrite 發(fā)布敬飒!

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市芬位,隨后出現(xiàn)的幾起案子无拗,更是在濱河造成了極大的恐慌,老刑警劉巖昧碉,帶你破解...
    沈念sama閱讀 206,482評(píng)論 6 481
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件英染,死亡現(xiàn)場離奇詭異,居然都是意外死亡被饿,警方通過查閱死者的電腦和手機(jī)四康,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,377評(píng)論 2 382
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來狭握,“玉大人闪金,你說我怎么就攤上這事÷勐” “怎么了哎垦?”我有些...
    開封第一講書人閱讀 152,762評(píng)論 0 342
  • 文/不壞的土叔 我叫張陵,是天一觀的道長恃疯。 經(jīng)常有香客問我漏设,道長,這世上最難降的妖魔是什么今妄? 我笑而不...
    開封第一講書人閱讀 55,273評(píng)論 1 279
  • 正文 為了忘掉前任郑口,我火速辦了婚禮鸳碧,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘犬性。我一直安慰自己瞻离,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 64,289評(píng)論 5 373
  • 文/花漫 我一把揭開白布乒裆。 她就那樣靜靜地躺著套利,像睡著了一般。 火紅的嫁衣襯著肌膚如雪缸兔。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 49,046評(píng)論 1 285
  • 那天吹艇,我揣著相機(jī)與錄音惰蜜,去河邊找鬼。 笑死受神,一個(gè)胖子當(dāng)著我的面吹牛抛猖,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播鼻听,決...
    沈念sama閱讀 38,351評(píng)論 3 400
  • 文/蒼蘭香墨 我猛地睜開眼财著,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了撑碴?” 一聲冷哼從身側(cè)響起撑教,我...
    開封第一講書人閱讀 36,988評(píng)論 0 259
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎醉拓,沒想到半個(gè)月后伟姐,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 43,476評(píng)論 1 300
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡亿卤,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 35,948評(píng)論 2 324
  • 正文 我和宋清朗相戀三年愤兵,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片排吴。...
    茶點(diǎn)故事閱讀 38,064評(píng)論 1 333
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡秆乳,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出钻哩,到底是詐尸還是另有隱情屹堰,我是刑警寧澤,帶...
    沈念sama閱讀 33,712評(píng)論 4 323
  • 正文 年R本政府宣布街氢,位于F島的核電站双藕,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏阳仔。R本人自食惡果不足惜忧陪,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,261評(píng)論 3 307
  • 文/蒙蒙 一扣泊、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧嘶摊,春花似錦延蟹、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,264評(píng)論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至虱颗,卻和暖如春沥匈,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背忘渔。 一陣腳步聲響...
    開封第一講書人閱讀 31,486評(píng)論 1 262
  • 我被黑心中介騙來泰國打工高帖, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人畦粮。 一個(gè)月前我還...
    沈念sama閱讀 45,511評(píng)論 2 354
  • 正文 我出身青樓散址,卻偏偏與公主長得像,于是被迫代替她去往敵國和親宣赔。 傳聞我的和親對象是個(gè)殘疾皇子预麸,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 42,802評(píng)論 2 345

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