RabbitMQ 相關(guān)基本概念

RabbitMQ優(yōu)異性

RabbitMQ發(fā)展到今天,被越來越多的人認(rèn)可勒虾,這和它在易用性纺阔、擴(kuò)展性、可靠性和高可用性等方面的卓著表現(xiàn)是分不開的修然。RabbitMQ的具體特點(diǎn)可以概括為以下幾點(diǎn)笛钝。

  • 可靠性:RabbitMQ使用一些機(jī)制來保證可靠性,如持久化愕宋、傳輸確認(rèn)及發(fā)布確認(rèn)等玻靡。
  • 靈活的路由:在消息進(jìn)入隊(duì)列之前,通過交換器來路由消息中贝。對于典型的路由功能囤捻,RabbitMQ已經(jīng)提供了一些內(nèi)置的交換器來實(shí)現(xiàn)。針對更復(fù)雜的路由功能邻寿,可以將多個(gè)交換器綁定在一起蝎土,也可以通過插件機(jī)制來實(shí)現(xiàn)自己的交換器视哑。
  • 擴(kuò)展性:多個(gè)RabbitMQ節(jié)點(diǎn)可以組成一個(gè)集群,也可以根據(jù)實(shí)際業(yè)務(wù)情況動(dòng)態(tài)地?cái)U(kuò)展集群中節(jié)點(diǎn)誊涯。
  • 高可用性:隊(duì)列可以在集群中的機(jī)器上設(shè)置鏡像黎炉,使得在部分節(jié)點(diǎn)出現(xiàn)問題的情況下隊(duì)列仍然可用。
  • 多種協(xié)議:RabbitMQ除了原生支持AMQP協(xié)議醋拧,還支持STOMP、MQTT等多種消息中間件協(xié)議淀弹。
  • 多語言客戶端:RabbitMQ幾乎支持所有常用語言丹壕,比如Java、Python薇溃、Ruby菌赖、PHP、C#沐序、JavaScript等琉用。
  • 管理界面:RabbitMQ提供了一個(gè)易用的用戶界面,使得用戶可以監(jiān)控和管理消息策幼、集群中的節(jié)點(diǎn)等邑时。
  • 插件機(jī)制:RabbitMQ提供了許多插件,以實(shí)現(xiàn)從多方面進(jìn)行擴(kuò)展特姐,當(dāng)然也可以編寫自己的插件晶丘。

RabbitMQ常見名詞解釋

Broker: 服務(wù)節(jié)點(diǎn)。如下圖唐含,Broker實(shí)際上是一個(gè)消息的中轉(zhuǎn)站浅浮,負(fù)責(zé)接收、存儲(chǔ)和轉(zhuǎn)發(fā)消息

RabbitMQ-Broker

Queue: 隊(duì)列捷枯。RabbitMQ的內(nèi)部對象滚秩,用于存儲(chǔ)消息。RabbitMQ的生產(chǎn)者生產(chǎn)消息并最終投遞到隊(duì)列中淮捆,消費(fèi)者可以從隊(duì)列中獲取消息并消費(fèi)郁油。但是當(dāng)多個(gè)消費(fèi)者訂閱了同一個(gè)隊(duì)列后,此時(shí)隊(duì)列中的消息會(huì)被分?jǐn)?輪詢)給多個(gè)消費(fèi)者進(jìn)行處理争剿,而非每個(gè)消費(fèi)者都會(huì)收到所有的消息已艰。所以當(dāng)有廣播消費(fèi)的需求時(shí),建議在交換器層級(jí)進(jìn)行處理蚕苇,生產(chǎn)多個(gè)隊(duì)列哩掺,而不是在隊(duì)列層級(jí)做廣播處理。

Exchange: 交換器涩笤。生產(chǎn)者將消息發(fā)送到Exchange(交換器嚼吞,通常也可以用大寫的“X”來表示)盒件,由交換器將消息路由到一個(gè)或者多個(gè)隊(duì)列中。如果路由不到舱禽,或許會(huì)返回給生產(chǎn)者炒刁,或許直接丟棄。交換器由生產(chǎn)者聲明誊稚,并設(shè)置相關(guān)屬性(如交換機(jī)類型翔始,是否持久化等)。

RoutingKey: 路由鍵里伯。生產(chǎn)者將消息發(fā)給交換器的時(shí)候城瞎,消息一般會(huì)攜帶一個(gè)RoutingKey,用來指定這個(gè)消息的路由規(guī)則疾瓮,而這個(gè)Routing Key需要與交換器類型和綁定鍵(BindingKey)聯(lián)合使用才能最終生效脖镀。在交換器類型和綁定鍵(BindingKey)固定的情況下,生產(chǎn)者可以在發(fā)送消息給交換器時(shí)狼电,通過指定RoutingKey來決定消息流向哪里蜒灰。

BindingKey: 綁定鍵。當(dāng)BindingKey和RoutingKey相匹配時(shí)肩碟,消息會(huì)被路由到對應(yīng)的隊(duì)列中强窖。BindingKey并不是在所有的情況下都生效,它依賴于交換器類型削祈,比如fanout類型的交換器就會(huì)無視BindingKey毕骡,而是將消息路由到所有綁定到該交換器的隊(duì)列中。

Binding: 綁定岩瘦。RabbitMQ中通過綁定將交換器與隊(duì)列關(guān)聯(lián)起來未巫,在綁定的時(shí)候一般會(huì)指定一個(gè)綁定鍵(BindingKey),這樣RabbitMQ就知道如何正確地將消息路由到隊(duì)列了启昧。

Connection: 連接叙凡。無論是消息的生產(chǎn)者還是消費(fèi)者,都需要和RabbitMQ Broker建立起連接來密末,這個(gè)連接就是一條TCP連接握爷。

Channel: 信道。信道可以看作是連接的子集严里,是一個(gè)建立在Connection上的虛擬連接新啼。客戶端在建立起Connection后可以創(chuàng)建一個(gè)AMQP信道刹碾,每個(gè)信道都會(huì)被指派一個(gè)唯一的ID燥撞,每條AMQP指令都是通過信道完成處理的。信道主要是用來解決TCP連接創(chuàng)建和銷毀太過耗費(fèi)資源的問題,當(dāng)出現(xiàn)請求高峰的時(shí)候物舒,使用信道實(shí)現(xiàn)對TCP連接的復(fù)用可以有效降低性能瓶頸的到來色洞。

RabbitMQ交換器類型

RabbitMQ交換器有以下幾種:

  • fanout: 此類型交換器會(huì)將所有發(fā)送到該交換器的消息路由到與該交換器綁定的隊(duì)列中。主要用于廣播消息冠胯。
  • direct:此類型交換器會(huì)將消息路由到BindingKey與RoutingKey完全匹配的隊(duì)列中火诸。主要用于指定匹配。
  • topic: 此類型的交換器可以看作是在direct的基礎(chǔ)上做的再次擴(kuò)展荠察,由于嚴(yán)格的完全匹配在很多情況下不能完全滿足實(shí)際業(yè)務(wù)的需求置蜀,topic交換器支持做一定的模糊匹配,將消息按照模糊匹配的規(guī)則發(fā)送到對應(yīng)的隊(duì)列中悉盆。主要用于消息多發(fā)盾碗。
    • RoutingKey應(yīng)為一個(gè)點(diǎn)號(hào)“.”分隔的字符串(被點(diǎn)號(hào)“.”分隔開的每一段獨(dú)立的字符串稱為一個(gè)單詞),如“com.rabbitmq.client”舀瓢、“java.util.concurrent”、“com.hidden.client”
    • BindingKey和RoutingKey一樣也是點(diǎn)號(hào)“.”分隔的字符串耗美,但是BindingKey可以存在兩種特殊字符"*" 和 “#”做模糊匹配京髓,其中 "*"可以匹配一個(gè)字詞,"#"可以用戶匹配任意(含0)個(gè)單詞。
  • headers: 此類型交換器不依賴于RoutingKey和BindingKey的匹配規(guī)則來路由消息商架,而是依據(jù)發(fā)送消息內(nèi)容中的headers屬性進(jìn)行匹配堰怨。該header屬性是一組鍵值對,且在隊(duì)列和消息中同時(shí)存在蛇摸,只有在隊(duì)列和消息中的header屬性(鍵值對)完全匹配的時(shí)候备图,該消息會(huì)被路由到該隊(duì)列中。性能較差赶袄,不常見揽涮,不常用。
  • 自定義

RabbitMQ消息交換方法

生產(chǎn)者生產(chǎn)消息

  • 生產(chǎn)者連接到RabbitMQ Broker饿肺,建立一個(gè)連接(Connection)蒋困,開啟一個(gè)信道(Channel)。
  • 生產(chǎn)者聲明一個(gè)交換器敬辣,并設(shè)置相關(guān)屬性雪标,比如交換機(jī)類型、是否持久化等溉跃。
  • 生產(chǎn)者聲明一個(gè)隊(duì)列并設(shè)置相關(guān)屬性村刨,比如是否排他、是否持久化撰茎、是否自動(dòng)刪除等嵌牺。
  • 生產(chǎn)者通過路由鍵將交換器和隊(duì)列綁定起來。
  • 生產(chǎn)者發(fā)送消息至RabbitMQ Broker,其中包含路由鍵髓梅、交換器等信息拟蜻。
  • 相應(yīng)的交換器根據(jù)接收到的路由鍵查找相匹配的隊(duì)列。
  • 如果找到枯饿,則將從生產(chǎn)者發(fā)送過來的消息存入相應(yīng)的隊(duì)列中酝锅。
  • 如果沒有找到,則根據(jù)生產(chǎn)者配置的屬性選擇丟棄還是回退給生產(chǎn)者奢方。
  • 關(guān)閉信道搔扁。
  • 關(guān)閉連接。

消費(fèi)者消費(fèi)消息

  • 消費(fèi)者連接到RabbitMQ Broker蟋字,建立一個(gè)連接(Connection)稿蹲,開啟一個(gè)信道(Channel)。
  • 消費(fèi)者向RabbitMQ Broker請求消費(fèi)相應(yīng)隊(duì)列中的消息鹊奖,可能會(huì)設(shè)置相應(yīng)的回調(diào)函數(shù)苛聘,以及做一些準(zhǔn)備工作。
  • 等待RabbitMQ Broker回應(yīng)并投遞相應(yīng)隊(duì)列中的消息忠聚,消費(fèi)者接收消息设哗。
  • 消費(fèi)者確認(rèn)(ack)接收到的消息。
  • RabbitMQ從隊(duì)列中刪除相應(yīng)已經(jīng)被確認(rèn)的消息两蟀。
  • 關(guān)閉信道网梢。
  • 關(guān)閉連接。
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末赂毯,一起剝皮案震驚了整個(gè)濱河市战虏,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌党涕,老刑警劉巖烦感,帶你破解...
    沈念sama閱讀 217,509評(píng)論 6 504
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異膛堤,居然都是意外死亡啸盏,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,806評(píng)論 3 394
  • 文/潘曉璐 我一進(jìn)店門骑祟,熙熙樓的掌柜王于貴愁眉苦臉地迎上來回懦,“玉大人,你說我怎么就攤上這事次企∏釉危” “怎么了?”我有些...
    開封第一講書人閱讀 163,875評(píng)論 0 354
  • 文/不壞的土叔 我叫張陵缸棵,是天一觀的道長舟茶。 經(jīng)常有香客問我,道長,這世上最難降的妖魔是什么吧凉? 我笑而不...
    開封第一講書人閱讀 58,441評(píng)論 1 293
  • 正文 為了忘掉前任隧出,我火速辦了婚禮,結(jié)果婚禮上阀捅,老公的妹妹穿的比我還像新娘胀瞪。我一直安慰自己,他們只是感情好饲鄙,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,488評(píng)論 6 392
  • 文/花漫 我一把揭開白布凄诞。 她就那樣靜靜地躺著,像睡著了一般忍级。 火紅的嫁衣襯著肌膚如雪帆谍。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 51,365評(píng)論 1 302
  • 那天轴咱,我揣著相機(jī)與錄音汛蝙,去河邊找鬼。 笑死朴肺,一個(gè)胖子當(dāng)著我的面吹牛窖剑,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播宇挫,決...
    沈念sama閱讀 40,190評(píng)論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼酪术!你這毒婦竟也來了器瘪?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 39,062評(píng)論 0 276
  • 序言:老撾萬榮一對情侶失蹤绘雁,失蹤者是張志新(化名)和其女友劉穎橡疼,沒想到半個(gè)月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體庐舟,經(jīng)...
    沈念sama閱讀 45,500評(píng)論 1 314
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡欣除,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,706評(píng)論 3 335
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了挪略。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片历帚。...
    茶點(diǎn)故事閱讀 39,834評(píng)論 1 347
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖杠娱,靈堂內(nèi)的尸體忽然破棺而出挽牢,到底是詐尸還是另有隱情,我是刑警寧澤摊求,帶...
    沈念sama閱讀 35,559評(píng)論 5 345
  • 正文 年R本政府宣布禽拔,位于F島的核電站,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏睹栖。R本人自食惡果不足惜硫惕,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,167評(píng)論 3 328
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望野来。 院中可真熱鬧恼除,春花似錦、人聲如沸梁只。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,779評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽搪锣。三九已至秋忙,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間构舟,已是汗流浹背灰追。 一陣腳步聲響...
    開封第一講書人閱讀 32,912評(píng)論 1 269
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留狗超,地道東北人弹澎。 一個(gè)月前我還...
    沈念sama閱讀 47,958評(píng)論 2 370
  • 正文 我出身青樓,卻偏偏與公主長得像努咐,于是被迫代替她去往敵國和親苦蒿。 傳聞我的和親對象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,779評(píng)論 2 354

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

  • http://liuxing.info/2017/06/30/Spring%20AMQP%E4%B8%AD%E6%...
    sherlock_6981閱讀 15,910評(píng)論 2 11
  • 什么叫消息隊(duì)列渗稍? 消息(Message)是指在應(yīng)用間傳送的數(shù)據(jù)佩迟。消息可以非常簡單,比如只包含文本字符串竿屹,也可以更復(fù)...
    Agile_dev閱讀 2,373評(píng)論 0 24
  • 什么是消息中間件报强? 定義一:消息(Message)是指在應(yīng)用間傳送的數(shù)據(jù)。 定義二:消息隊(duì)列中間件(Message...
    RainyBlossom閱讀 396評(píng)論 0 1
  • 文章首次整理自 個(gè)人博客:RabbitMQ在iOS中的應(yīng)用 引言 隨著公司業(yè)務(wù)的需要拱燃,原來的推送秉溉,不能滿足現(xiàn)有的要...
    阿木攝影閱讀 6,580評(píng)論 27 10
  • 在這年的尾巴上,我面臨著一個(gè)巨大的問題碗誉,我將離開那個(gè)不知今夕何夕的地方—大學(xué)召嘶,讓我不知疾苦的學(xué)校生活從此與我形成天...
    嘻兮西閱讀 268評(píng)論 0 1