模塊十六_RabbitMQ

序言:

文章內容輸出來源:拉勾教育Java高薪訓練營。
本篇文章是學習課程中的一部分課后筆記

一、RabbitMQ介紹、概念、基本架構

1. RabbitMQ介紹

RabbitMQ,俗稱“兔子MQ”(可見其輕巧,敏捷),是目前非常熱門的一款開源消息中間件,不管是互聯網行業還是傳統行業都廣泛使用(最早是為了解決電信行業系統之間的可靠通信而設計)。

    1. 高可靠性、易擴展、高可用、功能豐富等
    1. 支持大多數(甚至冷門)的編程語言客戶端。
    1. RabbitMQ遵循AMQP協議,自身采用Erlang(一種由愛立信開發的通用面向并發編程的語言)編寫。
    1. RabbitMQ也支持MQTT等其他協議。
2. RabbitMQ整體邏輯架構
整體邏輯架構.png
3. RabbitMQ Exchange類型 :
  • RabbitMQ常用的交換器類型有: fanout 、 direct 、 topic 、 headers 四種。

fanout
會把所有發送到該交換器的消息路由到所有與該交換器綁定的隊列中.

direct
把消息路由到那些BindingKey和RoutingKey完全匹配的隊列中

topic

topic類型的交換器在direct匹配規則上進行了擴展,也是將消息路由到BindingKey和RoutingKey相匹配的隊列中,這里的匹配規則稍微不同,它約定:
BindingKey和RoutingKey一樣都是由"."分隔的字符串;
BindingKey中可以存在兩種特殊字符“”和“#”,用于模糊匹配,其中""用于匹配一個單詞,"#"用于匹配多個單詞(可以是0個)。

headers

headers類型的交換器不依賴于路由鍵的匹配規則來路由信息,而是根據發送的消息內容中的headers屬性進行匹配。
在綁定隊列和交換器時指定一組鍵值對,當發送的消息到交換器時,RabbitMQ會獲取到該消息的headers,對比其中的鍵值對是否完全匹配隊列和交換器綁定時指定的鍵值對,如果匹配,消息就會路由到該隊列。headers類型的交換器性能很差,不實用。

4.RabbitMQ數據存儲

RabbitMQ消息有兩種類型:
持久化消息非持久化消息(這兩種消息都會被寫入磁盤)

  • 持久化消息在到達隊列時寫入磁盤,同時會內存中保存一份備份,當內存吃緊時,消息從內存中清除。這會提高一定的性能。
  • 非持久化消息一般只存于內存中,當內存壓力大時數據刷盤處理,以節省內存空間。
5.持久化存儲機制

持久化是提高RabbitMQ可靠性的基礎,否則當RabbitMQ遇到異常時(如:重啟、斷電、停機等)數據將會丟失。主要從以下幾個方面來保障消息的持久性:

  1. Exchange的持久化。通過定義時設置durable 參數為ture來保證Exchange相關的元數據不不丟失。
  2. Queue的持久化。也是通過定義時設置durable 參數為ture來保證Queue相關的元數據不不丟失。
  3. 消息的持久化。通過將消息的投遞模式 (BasicProperties 中的 deliveryMode 屬性)設置為 2 即可實現消息的持久化,保證消息自身不丟失。
    隊列索引
    索引維護隊列的落盤消息的信息,如存儲地點、是否已被給消費者接收、是否已被消費者ack等。每個隊列都有相對應的索引。
    消息存儲
    消息以鍵值對的形式存儲到文件中,一個虛擬主機上的所有隊列使用同一塊存儲,每個節點只有一個。存儲分為持久化存儲(msg_store_persistent)和短暫存儲(msg_store_transient)。持久化存儲的內容在broker重啟后不會丟失,短暫存儲的內容在broker重啟后丟失。

二、RabbitMQ工作流程詳解

1.生產者發送消息的流程
  1. 生產者連接RabbitMQ,建立TCP連接( Connection),開啟信道(Channel)
  2. 生產者聲明一個Exchange(交換器),并設置相關屬性,比如交換器類型、是否持久化等
  3. 生產者聲明一個隊列井設置相關屬性,比如是否排他、是否持久化、是否自動刪除等
  4. 生產者通過 bindingKey (綁定Key)將交換器和隊列綁定( binding )起來
  5. 生產者發送消息至RabbitMQ Broker,其中包含 routingKey (路由鍵)、交換器等信息
  6. 相應的交換器根據接收到的 routingKey 查找相匹配的隊列。
  7. 如果找到,則將從生產者發送過來的消息存入相應的隊列中。
  8. 如果沒有找到,則根據生產者配置的屬性選擇丟棄還是回退給生產者
  9. 關閉信道。
  10. 關閉連接。
2.消費者接收消息的過程
  1. 消費者連接到RabbitMQ Broker ,建立一個連接(Connection ) ,開啟一個信道(Channel) 。
  2. 消費者向RabbitMQ Broker 請求消費相應隊列中的消息,可能會設置相應的回調函數, 以及做一些準備工作
  3. 等待RabbitMQ Broker 回應并投遞相應隊列中的消息, 消費者接收消息。
  4. 消費者確認( ack) 接收到的消息。
  5. RabbitMQ 從隊列中刪除相應己經被確認的消息。
  6. 關閉信道。
  7. 關閉連接。

三、RabbitMQ特性

1.TTL機制

TTL,Time to Live 的簡稱,即過期時間。
RabbitMQ 可以對消息和隊列兩個維度來設置TTL。
任何消息中間件的容量和堆積能力都是有限的,如果有一些消息總是不被消費掉,那么需要有一種過期的機制來做兜底。
目前有兩種方法可以設置消息的TTL。

  1. 通過Queue屬性設置,隊列中所有消息都有相同的過期時間。
  2. 對消息自身進行單獨設置,每條消息的TTL 可以不同。

如果兩種方法一起使用,則消息的TTL 以兩者之間較小數值為準。通常來講,消息在隊列中的生存時間一旦超過設置的TTL 值時,就會變成“死信”(Dead Message),消費者默認就無法再收到該消息。

2.死信隊列

在定義業務隊列時可以考慮指定一個 死信交換機,并綁定一個死信隊列。當消息變成死信時,該消息就會被發送到該死信隊列上,這樣方便我們查看消息失敗的原因。

  • DLX,全稱為Dead-Letter-Exchange,死信交換器。消息在一個隊列中變成死信(Dead Letter)之后,被重新發送到一個特殊的交換器(DLX)中,同時,綁定DLX的隊列就稱為“死信隊列”。
    以下幾種情況導致消息變為死信:
    1. 消息被拒絕(Basic.Reject/Basic.Nack),并且設置requeue參數為false;
    2. 消息過期;
    3. 隊列達到最大長度。

對于RabbitMQ 來說,DLX 是一個非常有用的特性。它可以處理異常情況下,消息不能夠被消費者正確消費(消費者調用了Basic.Nack 或者Basic.Reject)而被置入死信隊列中的情況,后續分析程序可以通過消費這個死信隊列中的內容來分析當時所遇到的異常情況,進而可以改善
和優化系統。

3.延遲隊列
  • 延遲消息是指的消息發送出去后并不想立即就被消費,而是需要等(指定的)一段時間后才觸發消費。

例如下面的業務場景:在支付寶上面買電影票,鎖定了一個座位后系統默認會幫你保留15分鐘時間,如果15分鐘后還沒付款那么不好意思系統會自動把座位釋放掉。怎么實現類似的功能呢?

  1. 可以用定時任務每分鐘掃一次,發現有占座超過15分鐘還沒付款的就釋放掉。但是這樣做很低效,很多時候做的都是些無用功;
  2. 可以用分布式鎖、分布式緩存的被動過期時間,15分鐘過期后鎖也釋放了,緩存key也不存在了;
  3. 還可以用延遲隊列,鎖座成功后會發送1條延遲消息,這條消息15分鐘后才會被消費,消費的過程就是檢查這個座位是否已經是“已付款”狀態;

死信實現延遲隊列

  1. 生產者將消息(msg)和路由鍵(routekey)發送指定的延時交換機(exchange)上
  2. 延時交換機(exchange)存儲消息等待消息到期根據路由鍵(routekey)找到綁定自己的隊列(queue)并把消息給它
  3. 隊列(queue)再把消息發送給監聽它的消費者(customer)
最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市,隨后出現的幾起案子,更是在濱河造成了極大的恐慌,老刑警劉巖,帶你破解...
    沈念sama閱讀 228,443評論 6 532
  • 序言:濱河連續發生了三起死亡事件,死亡現場離奇詭異,居然都是意外死亡,警方通過查閱死者的電腦和手機,發現死者居然都...
    沈念sama閱讀 98,530評論 3 416
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人,你說我怎么就攤上這事。” “怎么了?”我有些...
    開封第一講書人閱讀 176,407評論 0 375
  • 文/不壞的土叔 我叫張陵,是天一觀的道長。 經常有香客問我,道長,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 62,981評論 1 312
  • 正文 為了忘掉前任,我火速辦了婚禮,結果婚禮上,老公的妹妹穿的比我還像新娘。我一直安慰自己,他們只是感情好,可當我...
    茶點故事閱讀 71,759評論 6 410
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著,像睡著了一般。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發上,一...
    開封第一講書人閱讀 55,204評論 1 324
  • 那天,我揣著相機與錄音,去河邊找鬼。 笑死,一個胖子當著我的面吹牛,可吹牛的內容都是我干的。 我是一名探鬼主播,決...
    沈念sama閱讀 43,263評論 3 441
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了?” 一聲冷哼從身側響起,我...
    開封第一講書人閱讀 42,415評論 0 288
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后,有當地人在樹林里發現了一具尸體,經...
    沈念sama閱讀 48,955評論 1 336
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內容為張勛視角 年9月15日...
    茶點故事閱讀 40,782評論 3 354
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發現自己被綠了。 大學時的朋友給我發了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 42,983評論 1 369
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖,靈堂內的尸體忽然破棺而出,到底是詐尸還是另有隱情,我是刑警寧澤,帶...
    沈念sama閱讀 38,528評論 5 359
  • 正文 年R本政府宣布,位于F島的核電站,受9級特大地震影響,放射性物質發生泄漏。R本人自食惡果不足惜,卻給世界環境...
    茶點故事閱讀 44,222評論 3 347
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧,春花似錦、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 34,650評論 0 26
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至,卻和暖如春,著一層夾襖步出監牢的瞬間,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 35,892評論 1 286
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人。 一個月前我還...
    沈念sama閱讀 51,675評論 3 392
  • 正文 我出身青樓,卻偏偏與公主長得像,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 47,967評論 2 374

推薦閱讀更多精彩內容