RabbitMQ.Kafka.MQ

Rabbitmq基本原理

image.png

MQ全稱為Message Queue, 是一種分布式應(yīng)用程序的的通信方法泣特,它是消費(fèi)-生產(chǎn)者模型的一個(gè)典型的代表咙边,producer往消息隊(duì)列中不斷寫入消息钧嘶,而另一端consumer則可以讀取或者訂閱隊(duì)列中的消息龟劲。RabbitMQ是MQ產(chǎn)品的典型代表炒嘲,是一款基于AMQP協(xié)議可復(fù)用的企業(yè)消息系統(tǒng)。業(yè)務(wù)上尝哆,可以實(shí)現(xiàn)服務(wù)提供者和消費(fèi)者之間的數(shù)據(jù)解耦秉撇,提供高可用性的消息傳輸機(jī)制,在實(shí)際生產(chǎn)中應(yīng)用相當(dāng)廣泛秋泄。本文意在介紹Rabbitmq的基本原理琐馆,包括rabbitmq基本框架,概念恒序,通信過程等瘦麸。
系統(tǒng)架構(gòu)
Rabbitmq系統(tǒng)最核心的組件是Exchange和Queue,下圖是系統(tǒng)簡單的示意圖歧胁。Exchange和Queue是在rabbitmq server(又叫做broker)端滋饲,producer和consumer在應(yīng)用端彤敛。



producer&Consumer
producer指的是消息生產(chǎn)者,consumer消息的消費(fèi)者了赌。
Queue
消息隊(duì)列墨榄,提供了FIFO的處理機(jī)制,具有緩存消息的能力勿她。rabbitmq中袄秩,隊(duì)列消息可以設(shè)置為持久化,臨時(shí)或者自動(dòng)刪除逢并。
設(shè)置為持久化的隊(duì)列之剧,queue中的消息會(huì)在server本地硬盤存儲(chǔ)一份,防止系統(tǒng)crash砍聊,數(shù)據(jù)丟失
設(shè)置為臨時(shí)隊(duì)列背稼,queue中的數(shù)據(jù)在系統(tǒng)重啟之后就會(huì)丟失
設(shè)置為自動(dòng)刪除的隊(duì)列,當(dāng)不存在用戶連接到server玻蝌,隊(duì)列中的數(shù)據(jù)會(huì)被自動(dòng)刪除

Exchange
Exchange類似于數(shù)據(jù)通信網(wǎng)絡(luò)中的交換機(jī)蟹肘,提供消息路由策略。rabbitmq中俯树,producer不是通過信道直接將消息發(fā)送給queue帘腹,而是先發(fā)送給Exchange。一個(gè)Exchange可以和多個(gè)Queue進(jìn)行綁定许饿,producer在傳遞消息的時(shí)候阳欲,會(huì)傳遞一個(gè)ROUTING_KEY,Exchange會(huì)根據(jù)這個(gè)ROUTING_KEY按照特定的路由算法陋率,將消息路由給指定的queue球化。和Queue一樣,Exchange也可設(shè)置為持久化瓦糟,臨時(shí)或者自動(dòng)刪除筒愚。
Exchange有4種類型:direct(默認(rèn)),fanout, topic, 和headers狸页,不同類型的Exchange轉(zhuǎn)發(fā)消息的策略有所區(qū)別:
Direct直接交換器锨能,工作方式類似于單播,Exchange會(huì)將消息發(fā)送完全匹配ROUTING_KEY的Queue

fanout廣播是式交換器芍耘,不管消息的ROUTING_KEY設(shè)置為什么,Exchange都會(huì)將消息轉(zhuǎn)發(fā)給所有綁定的Queue熄阻。

topic主題交換器斋竞,工作方式類似于組播,Exchange會(huì)將消息轉(zhuǎn)發(fā)和ROUTING_KEY匹配模式相同的所有隊(duì)列秃殉,比如坝初,ROUTING_KEY為user.stock的Message會(huì)轉(zhuǎn)發(fā)給綁定匹配模式為 * .stock,user.stock浸剩, * . * 和#.user.stock.#的隊(duì)列。( * 表是匹配一個(gè)任意詞組鳄袍,#表示匹配0個(gè)或多個(gè)詞組)

headers消息體的header匹配(ignore)

Binding
所謂綁定就是將一個(gè)特定的 Exchange 和一個(gè)特定的 Queue 綁定起來绢要。Exchange 和Queue的綁定可以是多對多的關(guān)系。
virtual host
在rabbitmq server上可以創(chuàng)建多個(gè)虛擬的message broker拗小,又叫做virtual hosts (vhosts)重罪。每一個(gè)vhost本質(zhì)上是一個(gè)mini-rabbitmq server,分別管理各自的exchange哀九,和bindings剿配。vhost相當(dāng)于物理的server,可以為不同app提供邊界隔離阅束,使得應(yīng)用安全的運(yùn)行在不同的vhost實(shí)例上呼胚,相互之間不會(huì)干擾。producer和consumer連接rabbit server需要指定一個(gè)vhost息裸。
通信過程
假設(shè)P1和C1注冊了相同的Broker蝇更,Exchange和Queue。P1發(fā)送的消息最終會(huì)被C1消費(fèi)呼盆〔炯牛基本的通信流程大概如下所示:
P1生產(chǎn)消息,發(fā)送給服務(wù)器端的Exchange
Exchange收到消息宿亡,根據(jù)ROUTINKEY常遂,將消息轉(zhuǎn)發(fā)給匹配的Queue1
Queue1收到消息,將消息發(fā)送給訂閱者C1
C1收到消息挽荠,發(fā)送ACK給隊(duì)列確認(rèn)收到消息
Queue1收到ACK克胳,刪除隊(duì)列中緩存的此條消息

Consumer收到消息時(shí)需要顯式的向rabbit broker發(fā)送basic.ack消息或者consumer訂閱消息時(shí)設(shè)置auto_ack參數(shù)為true。在通信過程中圈匆,隊(duì)列對ACK的處理有以下幾種情況:
如果consumer接收了消息漠另,發(fā)送ack,rabbitmq會(huì)刪除隊(duì)列中這個(gè)消息,發(fā)送另一條消息給consumer跃赚。
如果cosumer接受了消息, 但在發(fā)送ack之前斷開連接笆搓,rabbitmq會(huì)認(rèn)為這條消息沒有被deliver,在consumer在次連接的時(shí)候,這條消息會(huì)被redeliver纬傲。
如果consumer接受了消息满败,但是程序中有bug,忘記了ack,rabbitmq不會(huì)重復(fù)發(fā)送消息。
rabbitmq2.0.0和之后的版本支持consumer reject某條(類)消息叹括,可以通過設(shè)置requeue參數(shù)中的reject為true達(dá)到目地算墨,那么rabbitmq將會(huì)把消息發(fā)送給下一個(gè)注冊的consumer。

Conclusion
本文和大家一起學(xué)習(xí)了rabbitmq的一些基礎(chǔ)知識(shí)汁雷,在之后的博文中净嘀,筆者將會(huì)和大家一起分享更多的Rabbitmq知識(shí)

RabbitMQ

Rabbitmq.png

Rabbitmq1.png
Rabbitmq2.png
Rabbitmq3.png
Rabbitmq4.png
Rabbitmq6.png
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末报咳,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子挖藏,更是在濱河造成了極大的恐慌暑刃,老刑警劉巖,帶你破解...
    沈念sama閱讀 211,639評論 6 492
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件膜眠,死亡現(xiàn)場離奇詭異岩臣,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī)柴底,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,277評論 3 385
  • 文/潘曉璐 我一進(jìn)店門婿脸,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人柄驻,你說我怎么就攤上這事狐树。” “怎么了鸿脓?”我有些...
    開封第一講書人閱讀 157,221評論 0 348
  • 文/不壞的土叔 我叫張陵抑钟,是天一觀的道長。 經(jīng)常有香客問我野哭,道長在塔,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 56,474評論 1 283
  • 正文 為了忘掉前任拨黔,我火速辦了婚禮蛔溃,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘篱蝇。我一直安慰自己贺待,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 65,570評論 6 386
  • 文/花漫 我一把揭開白布零截。 她就那樣靜靜地躺著麸塞,像睡著了一般。 火紅的嫁衣襯著肌膚如雪涧衙。 梳的紋絲不亂的頭發(fā)上哪工,一...
    開封第一講書人閱讀 49,816評論 1 290
  • 那天,我揣著相機(jī)與錄音弧哎,去河邊找鬼雁比。 笑死,一個(gè)胖子當(dāng)著我的面吹牛傻铣,可吹牛的內(nèi)容都是我干的章贞。 我是一名探鬼主播,決...
    沈念sama閱讀 38,957評論 3 408
  • 文/蒼蘭香墨 我猛地睜開眼非洲,長吁一口氣:“原來是場噩夢啊……” “哼鸭限!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起两踏,我...
    開封第一講書人閱讀 37,718評論 0 266
  • 序言:老撾萬榮一對情侶失蹤败京,失蹤者是張志新(化名)和其女友劉穎,沒想到半個(gè)月后梦染,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體赡麦,經(jīng)...
    沈念sama閱讀 44,176評論 1 303
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,511評論 2 327
  • 正文 我和宋清朗相戀三年帕识,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了泛粹。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 38,646評論 1 340
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡肮疗,死狀恐怖晶姊,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情伪货,我是刑警寧澤们衙,帶...
    沈念sama閱讀 34,322評論 4 330
  • 正文 年R本政府宣布,位于F島的核電站碱呼,受9級(jí)特大地震影響蒙挑,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜愚臀,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,934評論 3 313
  • 文/蒙蒙 一忆蚀、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧姑裂,春花似錦馋袜、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,755評論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至捧毛,卻和暖如春观堂,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背呀忧。 一陣腳步聲響...
    開封第一講書人閱讀 31,987評論 1 266
  • 我被黑心中介騙來泰國打工师痕, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人而账。 一個(gè)月前我還...
    沈念sama閱讀 46,358評論 2 360
  • 正文 我出身青樓胰坟,卻偏偏與公主長得像,于是被迫代替她去往敵國和親泞辐。 傳聞我的和親對象是個(gè)殘疾皇子笔横,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 43,514評論 2 348

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

  • Spring Cloud為開發(fā)人員提供了快速構(gòu)建分布式系統(tǒng)中一些常見模式的工具(例如配置管理竞滓,服務(wù)發(fā)現(xiàn),斷路器吹缔,智...
    卡卡羅2017閱讀 134,633評論 18 139
  • 來源 RabbitMQ是用Erlang實(shí)現(xiàn)的一個(gè)高并發(fā)高可靠AMQP消息隊(duì)列服務(wù)器商佑。支持消息的持久化、事務(wù)厢塘、擁塞控...
    jiangmo閱讀 10,346評論 2 34
  • 1. 歷史 RabbitMQ是一個(gè)由erlang開發(fā)的AMQP(Advanced Message Queue )的...
    高廣超閱讀 6,092評論 3 51
  • rabbitMQ是一款基于AMQP協(xié)議的消息中間件茶没,它能夠在應(yīng)用之間提供可靠的消息傳輸。在易用性晚碾,擴(kuò)展性抓半,高可用性...
    點(diǎn)融黑幫閱讀 2,991評論 3 41
  • 1 RabbitMQ安裝部署 這里是ErLang環(huán)境的下載地址http://www.erlang.org/down...
    Bobby0322閱讀 2,225評論 0 11