RabbitMQ 消息隊列

RabbitMQ 的基本概念

RabbitMQ 是一種消息隊列帘瞭,用于程序間的通信。形象地說 : MQ就像一個郵局,發(fā)送者將消息寫入 MQMQ 負責(zé)把消息發(fā)送給接收者窒悔。RabbitMQ 可支持 Java, PHP, Python, Go, JavaScript, Ruby 等多種語言。本文主要介紹 RabbitMQ 的基本概念和模型敌买。

術(shù)語

file
  • 生產(chǎn)者( producer )

在圖中為 P简珠,表示消息的發(fā)送者。

  • 交換機( exchanges )

在圖中為 X, 生產(chǎn)者發(fā)過來的消息需要經(jīng)過交換機虹钮,交換機將決定將消息放到哪些隊列當中聋庵。

  • 隊列(queue)

隊列在圖 1 中由紅色矩形陣列表示,負責(zé)保存消息和發(fā)放消息芙粱。

  • 消費者(consumer)

在圖中為 C祭玉,代表等待接收消息的程序。

信息流

  • 消息是怎么從生產(chǎn)者傳遞到消費者的呢春畔?

首先脱货,生產(chǎn)者發(fā)送消息到交換機岛都,同時發(fā)送一個 key,通過這個 key蹭劈,交換機就知道該把消息發(fā)到哪個隊列疗绣。隨后交換機把消息發(fā)送到相應(yīng)的隊列中线召。由隊列將消息發(fā)送給消費者铺韧。消費者監(jiān)聽某些隊列,當有消息過來時缓淹,就立即處理消息哈打。

  • 提問
  • 交換機是如何根據(jù) key 來分配消息到隊列?
  • 隊列怎樣將消息發(fā)送給消費者讯壶?

第一個問題

  • RabbitMQ 的交換機有四種類型:direct, topic, headers, fanout

  • fanout

fanout 交換機就跟廣播一樣料仗,對消息不作選擇地發(fā)給所有綁定的隊列。以圖 1 為例伏蚊,兩個隊列都將收到消息立轧。

  • direct

file

圖 2 direct

direct 模式里,交換機和隊列之間綁定了一個 key躏吊,只有消息的 key 與綁定了的 key 相同時氛改,交換機才會把消息發(fā)給該隊列。如圖 2 所示比伏,消息的 keyorange 時胜卤,消息將進入隊列 Q1 ; keyblack 或者 green 時,消息將進入隊列 Q2赁项。若消息的 key 是其他字符串葛躏,被交換機直接遺棄。

file

圖 3 多重綁定

同時悠菜,交換機支持多重綁定舰攒,多個隊列可以以相同的 key 與交換機綁定。如圖 3 所示悔醋,當消息的 keyblack 時摩窃,消息將進入 Q1Q2

  • topic

topic 模式可以理解為主題模式,當 key 包涵某個主題時篙顺,即可進入該主題的隊列偶芍。topic 模式的 key 必須具有固定的格式:以 . 作為間隔的一串單詞;比如:quick.orange.rabbit德玫,key 最多不能超過 255byte匪蟀。
交換機和隊列的key可以以類似正則表達式的方式存在,有兩種語法:

  1. ** "*" 可以替代一個單詞 **
  2. "#" 可以替代 0 個或多個單詞

file

圖4 topic

圖 4宰僧。圖中材彪,Q1 與交換機綁定的 kye 為:“*.orange.*”,故當消息的 key 為三個單詞,且中間的單詞為 orange 時段化,消息將進入 Q1嘁捷。Q2exchange 綁定的 key”rabbit.#”,當消息的 keyrabbit 開頭時显熏,消息將進入 Q2 雄嚣。

  • headers

官網(wǎng)沒介紹這個模式呀,大概不常用吧喘蟆。

第二個問題

file

圖5 Round-robin Dispatching

  • 循環(huán)發(fā)放(Round-robin dispatching)

隊列分發(fā)消息給消費者的方式采用循環(huán)發(fā)放缓升。舉例來說,若隊列里有四個消息 w, x, y, z蕴轨,則 C1 將得到消息 zx , C2 將得到消息 yw 港谊。即每個消費者按順序每人發(fā)一個消息。
注意橙弱,在這種分配方式下歧寺,消息其實在剛進入隊列的時候就已經(jīng)內(nèi)定好將要被分發(fā)的消費者。即 z, x 一定是給 C1 . y, w 一定是給 C2 棘脐。
這種方式存在一些隱患斜筐,如果 zx 都是耗時的命令、y , z 都是簡單的命令荆残,C1 將不停地工作奴艾,而 C2 就比較空閑,造成資源浪費内斯。

  • 公平發(fā)放(fair dispatching)

公平發(fā)放解決了上述問題蕴潦。這種方式下,隊列只會把消息給空閑的消費者俘闯。如果它看到某個消費者正忙潭苞,就查找下一個空閑消費者。

  • 消息的確認(Message acknowledgment)

若沒有特別設(shè)定真朗,消息一旦被隊列分發(fā)給消費者此疹,就被 Rabbitmq 從內(nèi)存中刪除。
在這種情況下遮婶,如果將一個正在處理消息的消費者強行關(guān)閉蝗碎,那么,消息將未被完全處理旗扑,且 RabbitMQ 完全不知情蹦骑。
為了解決上述問題,可以配置使得消息處理完后臀防,向 RabbitMQ 返回一個 Acknowledgment眠菇。RabbitMQ 直到收到Acknowledgment 后边败,才將消息刪除。
當消費者死亡時(its channel is closed, connection is closed, or TCP connection is lost)捎废,RabbitMQ 會知道這個消費者發(fā)生問題了笑窜,將重新發(fā)送消息給空閑的消費者。
消息沒有 TimeOut登疗,即使消費者處理很長很長時間排截,乃至無窮無盡,RabbmitMQ 也認為消費者正在處理谜叹。

其實匾寝,消息的確認是默認開啟的,不需要特地設(shè)置荷腊。

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市急凰,隨后出現(xiàn)的幾起案子女仰,更是在濱河造成了極大的恐慌,老刑警劉巖抡锈,帶你破解...
    沈念sama閱讀 223,207評論 6 521
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件疾忍,死亡現(xiàn)場離奇詭異,居然都是意外死亡床三,警方通過查閱死者的電腦和手機一罩,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 95,455評論 3 400
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來撇簿,“玉大人聂渊,你說我怎么就攤上這事∷奶保” “怎么了汉嗽?”我有些...
    開封第一講書人閱讀 170,031評論 0 366
  • 文/不壞的土叔 我叫張陵,是天一觀的道長找蜜。 經(jīng)常有香客問我饼暑,道長,這世上最難降的妖魔是什么洗做? 我笑而不...
    開封第一講書人閱讀 60,334評論 1 300
  • 正文 為了忘掉前任弓叛,我火速辦了婚禮,結(jié)果婚禮上诚纸,老公的妹妹穿的比我還像新娘撰筷。我一直安慰自己,他們只是感情好咬清,可當我...
    茶點故事閱讀 69,322評論 6 398
  • 文/花漫 我一把揭開白布闭专。 她就那樣靜靜地躺著奴潘,像睡著了一般。 火紅的嫁衣襯著肌膚如雪影钉。 梳的紋絲不亂的頭發(fā)上画髓,一...
    開封第一講書人閱讀 52,895評論 1 314
  • 那天,我揣著相機與錄音平委,去河邊找鬼奈虾。 笑死,一個胖子當著我的面吹牛廉赔,可吹牛的內(nèi)容都是我干的肉微。 我是一名探鬼主播,決...
    沈念sama閱讀 41,300評論 3 424
  • 文/蒼蘭香墨 我猛地睜開眼蜡塌,長吁一口氣:“原來是場噩夢啊……” “哼碉纳!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起馏艾,我...
    開封第一講書人閱讀 40,264評論 0 277
  • 序言:老撾萬榮一對情侶失蹤劳曹,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后琅摩,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體铁孵,經(jīng)...
    沈念sama閱讀 46,784評論 1 321
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 38,870評論 3 343
  • 正文 我和宋清朗相戀三年房资,在試婚紗的時候發(fā)現(xiàn)自己被綠了蜕劝。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 40,989評論 1 354
  • 序言:一個原本活蹦亂跳的男人離奇死亡轰异,死狀恐怖岖沛,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情溉浙,我是刑警寧澤烫止,帶...
    沈念sama閱讀 36,649評論 5 351
  • 正文 年R本政府宣布,位于F島的核電站戳稽,受9級特大地震影響馆蠕,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜惊奇,卻給世界環(huán)境...
    茶點故事閱讀 42,331評論 3 336
  • 文/蒙蒙 一互躬、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧颂郎,春花似錦吼渡、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,814評論 0 25
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽坎背。三九已至,卻和暖如春寄雀,著一層夾襖步出監(jiān)牢的瞬間得滤,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 33,940評論 1 275
  • 我被黑心中介騙來泰國打工盒犹, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留懂更,地道東北人。 一個月前我還...
    沈念sama閱讀 49,452評論 3 379
  • 正文 我出身青樓急膀,卻偏偏與公主長得像沮协,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子卓嫂,可洞房花燭夜當晚...
    茶點故事閱讀 45,995評論 2 361

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

  • 1 RabbitMQ安裝部署 這里是ErLang環(huán)境的下載地址http://www.erlang.org/down...
    Bobby0322閱讀 2,243評論 0 11
  • 一 . MQ:message queue 消息隊列的作用: 1 通信解耦 2 高峰限流 原理分析: 一開始,認證系...
    Java架構(gòu)_師閱讀 462評論 0 0
  • RabbitMQ簡介 AMQP慷暂,即Advanced Message Queuing Protocol,高級消息隊列...
    AI喬治閱讀 993評論 0 3
  • 昨天很忙碌命黔,中午要開會呜呐,開會內(nèi)容是教育局要來檢查,各班主任要安排學(xué)生打掃衛(wèi)生悍募,把學(xué)生的學(xué)習(xí)資料收起來,不能被...
    尊重生命_b83e閱讀 81評論 0 0
  • Docker入門筆記(一) 前言 Docker隨著微服務(wù)已經(jīng)流行起來一段時間洋机。最近公司來了一個新的同事坠宴,在他的建議...
    蕭矢式閱讀 544評論 0 1