消息隊(duì)列的流派

學(xué)習(xí)完整課程請移步 互聯(lián)網(wǎng) Java 全棧工程師

本節(jié)視頻

什么是 MQ

Message Queue(MQ),消息隊(duì)列中間件。很多人都說:MQ 通過將消息的發(fā)送和接收分離來實(shí)現(xiàn)應(yīng)用程序的異步和解偶春寿,這個(gè)給人的直覺是——MQ 是異步的寿羞,用來解耦的袁梗,但是這個(gè)只是 MQ 的效果而不是目的细燎。MQ 真正的目的是為了通訊适滓,屏蔽底層復(fù)雜的通訊協(xié)議铝穷,定義了一套應(yīng)用層的钠怯、更加簡單的通訊協(xié)議。一個(gè)分布式系統(tǒng)中兩個(gè)模塊之間通訊要么是 HTTP曙聂,要么是自己開發(fā)的 TCP晦炊,但是這兩種協(xié)議其實(shí)都是原始的協(xié)議。HTTP 協(xié)議很難實(shí)現(xiàn)兩端通訊——模塊 A 可以調(diào)用 B,B 也可以主動(dòng)調(diào)用 A断国,如果要做到這個(gè)兩端都要背上 WebServer贤姆,而且還不支持長連接(HTTP 2.0 的庫根本找不到)。TCP 就更加原始了稳衬,粘包庐氮、心跳、私有的協(xié)議宋彼,想一想頭皮就發(fā)麻弄砍。MQ 所要做的就是在這些協(xié)議之上構(gòu)建一個(gè)簡單的“協(xié)議”——生產(chǎn)者/消費(fèi)者模型。MQ 帶給我的“協(xié)議”不是具體的通訊協(xié)議输涕,而是更高層次通訊模型音婶。它定義了兩個(gè)對象——發(fā)送數(shù)據(jù)的叫生產(chǎn)者;接收數(shù)據(jù)的叫消費(fèi)者莱坎, 提供一個(gè) SDK 讓我們可以定義自己的生產(chǎn)者和消費(fèi)者實(shí)現(xiàn)消息通訊而無視底層通訊協(xié)議

有 Broker 的 MQ

這個(gè)流派通常有一臺服務(wù)器作為 Broker衣式,所有的消息都通過它中轉(zhuǎn)。生產(chǎn)者把消息發(fā)送給它就結(jié)束自己的任務(wù)了檐什,Broker 則把消息主動(dòng)推送給消費(fèi)者(或者消費(fèi)者主動(dòng)輪詢)

重 Topic

kafka碴卧、JMS(ActiveMQ)就屬于這個(gè)流派,生產(chǎn)者會發(fā)送 key 和數(shù)據(jù)到 Broker乃正,由 Broker 比較 key 之后決定給哪個(gè)消費(fèi)者住册。這種模式是我們最常見的模式,是我們對 MQ 最多的印象瓮具。在這種模式下一個(gè) topic 往往是一個(gè)比較大的概念荧飞,甚至一個(gè)系統(tǒng)中就可能只有一個(gè) topic,topic 某種意義上就是 queue名党,生產(chǎn)者發(fā)送 key 相當(dāng)于說:“hi叹阔,把數(shù)據(jù)放到 key 的隊(duì)列中”

如上圖所示,Broker 定義了三個(gè)隊(duì)列传睹,key1耳幢,key2,key3欧啤,生產(chǎn)者發(fā)送數(shù)據(jù)的時(shí)候會發(fā)送 key1 和 data睛藻,Broker 在推送數(shù)據(jù)的時(shí)候則推送 data(也可能把 key 帶上)。

雖然架構(gòu)一樣但是 kafka 的性能要比 jms 的性能不知道高到多少倍堂油,所以基本這種類型的 MQ 只有 kafka 一種備選方案修档。如果你需要一條暴力的數(shù)據(jù)流(在乎性能而非靈活性)那么 kafka 是最好的選擇

輕 Topic

這種的代表是 RabbitMQ(或者說是 AMQP)碧绞。生產(chǎn)者發(fā)送 key 和數(shù)據(jù)府框,消費(fèi)者定義訂閱的隊(duì)列,Broker 收到數(shù)據(jù)之后會通過一定的邏輯計(jì)算出 key 對應(yīng)的隊(duì)列,然后把數(shù)據(jù)交給隊(duì)列

這種模式下解耦了 key 和 queue迫靖,在這種架構(gòu)中 queue 是非常輕量級的(在 RabbitMQ 中它的上限取決于你的內(nèi)存)院峡,消費(fèi)者關(guān)心的只是自己的 queue;生產(chǎn)者不必關(guān)心數(shù)據(jù)最終給誰只要指定 key 就行了系宜,中間的那層映射在 AMQP 中叫 exchange(交換機(jī))照激。

AMQP 中有四種 exchange

  • Direct exchange:key 就等于 queue
  • Fanout exchange:無視 key,給所有的 queue 都來一份
  • Topic exchange:key 可以用“寬字符”模糊匹配 queue
  • Headers exchange:無視 key盹牧,通過查看消息的頭部元數(shù)據(jù)來決定發(fā)給那個(gè) queue(AMQP 頭部元數(shù)據(jù)非常豐富而且可以自定義)

這種結(jié)構(gòu)的架構(gòu)給通訊帶來了很大的靈活性俩垃,我們能想到的通訊方式都可以用這四種 exchange 表達(dá)出來。如果你需要一個(gè)企業(yè)數(shù)據(jù)總線(在乎靈活性)那么 RabbitMQ 絕對的值得一用

無 Broker 的 MQ

無 Broker 的 MQ 的代表是 ZeroMQ汰寓。該作者非常睿智口柳,他非常敏銳的意識到——MQ 是更高級的 Socket,它是解決通訊問題的有滑。所以 ZeroMQ 被設(shè)計(jì)成了一個(gè)“庫”而不是一個(gè)中間件跃闹,這種實(shí)現(xiàn)也可以達(dá)到——沒有 Broker 的目的

節(jié)點(diǎn)之間通訊的消息都是發(fā)送到彼此的隊(duì)列中,每個(gè)節(jié)點(diǎn)都既是生產(chǎn)者又是消費(fèi)者毛好。ZeroMQ 做的事情就是封裝出一套類似于 Socket 的 API 可以完成發(fā)送數(shù)據(jù)望艺,讀取數(shù)據(jù)

ZeroMQ 其實(shí)就是一個(gè)跨語言的、重量級的 Actor 模型郵箱庫肌访。你可以把自己的程序想象成一個(gè) Actor找默,ZeroMQ 就是提供郵箱功能的庫;ZeroMQ 可以實(shí)現(xiàn)同一臺機(jī)器的 RPC 通訊也可以實(shí)現(xiàn)不同機(jī)器的 TCP吼驶、UDP 通訊啡莉,如果你需要一個(gè)強(qiáng)大的、靈活旨剥、野蠻的通訊能力咧欣,別猶豫 ZeroMQ

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市轨帜,隨后出現(xiàn)的幾起案子魄咕,更是在濱河造成了極大的恐慌,老刑警劉巖蚌父,帶你破解...
    沈念sama閱讀 219,589評論 6 508
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件哮兰,死亡現(xiàn)場離奇詭異,居然都是意外死亡苟弛,警方通過查閱死者的電腦和手機(jī)喝滞,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,615評論 3 396
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來膏秫,“玉大人右遭,你說我怎么就攤上這事。” “怎么了窘哈?”我有些...
    開封第一講書人閱讀 165,933評論 0 356
  • 文/不壞的土叔 我叫張陵吹榴,是天一觀的道長。 經(jīng)常有香客問我滚婉,道長图筹,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 58,976評論 1 295
  • 正文 為了忘掉前任让腹,我火速辦了婚禮远剩,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘骇窍。我一直安慰自己民宿,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,999評論 6 393
  • 文/花漫 我一把揭開白布像鸡。 她就那樣靜靜地躺著活鹰,像睡著了一般。 火紅的嫁衣襯著肌膚如雪只估。 梳的紋絲不亂的頭發(fā)上志群,一...
    開封第一講書人閱讀 51,775評論 1 307
  • 那天,我揣著相機(jī)與錄音蛔钙,去河邊找鬼锌云。 笑死,一個(gè)胖子當(dāng)著我的面吹牛吁脱,可吹牛的內(nèi)容都是我干的桑涎。 我是一名探鬼主播,決...
    沈念sama閱讀 40,474評論 3 420
  • 文/蒼蘭香墨 我猛地睜開眼兼贡,長吁一口氣:“原來是場噩夢啊……” “哼攻冷!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起遍希,我...
    開封第一講書人閱讀 39,359評論 0 276
  • 序言:老撾萬榮一對情侶失蹤等曼,失蹤者是張志新(化名)和其女友劉穎,沒想到半個(gè)月后凿蒜,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體禁谦,經(jīng)...
    沈念sama閱讀 45,854評論 1 317
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 38,007評論 3 338
  • 正文 我和宋清朗相戀三年废封,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了州泊。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 40,146評論 1 351
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡漂洋,死狀恐怖遥皂,靈堂內(nèi)的尸體忽然破棺而出力喷,到底是詐尸還是另有隱情,我是刑警寧澤渴肉,帶...
    沈念sama閱讀 35,826評論 5 346
  • 正文 年R本政府宣布冗懦,位于F島的核電站爽冕,受9級特大地震影響仇祭,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜颈畸,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,484評論 3 331
  • 文/蒙蒙 一乌奇、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧眯娱,春花似錦礁苗、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,029評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至于样,卻和暖如春疏叨,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背穿剖。 一陣腳步聲響...
    開封第一講書人閱讀 33,153評論 1 272
  • 我被黑心中介騙來泰國打工蚤蔓, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人糊余。 一個(gè)月前我還...
    沈念sama閱讀 48,420評論 3 373
  • 正文 我出身青樓秀又,卻偏偏與公主長得像,于是被迫代替她去往敵國和親贬芥。 傳聞我的和親對象是個(gè)殘疾皇子吐辙,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,107評論 2 356