(轉載)RabbitMQ介紹

一基本原理

  MQ全稱爲Message Queue, 是一種分佈式應用程序的的通訊方法,它是消費-生產者模型的一個典型的表明,producer往消息隊列中不斷寫入消息,而另外一端consumer則能夠讀取或者訂閱隊列中的消息。RabbitMQ是MQ產品的典型表明,是一款基於AMQP協議可複用的企業消息系統。業務上,能夠實現服務提供者和消費者之間的數據解耦,提供高可用性的消息傳輸機制,在實際生產中應用至關普遍。本文意在介紹Rabbitmq的基本原理,包括rabbitmq基本框架,概念,通訊過程等。html

二系統架構

  Rabbitmq系統最核心的組件是Exchange和Queue,下圖是系統簡單的示意圖。Exchange和Queue是在rabbitmq server(又叫作broker)端,producer和consumer在應用端。算法

1 producer&Consumer

  producer指的是消息生產者,consumer消息的消費者。緩存

2 Queue

  消息隊列,提供了FIFO的處理機制,具備緩存消息的能力。rabbitmq中,隊列消息能夠設置爲持久化,臨時或者自動刪除。安全

  (1)設置爲持久化的隊列,queue中的消息會在server本地硬盤存儲一份,防止系統crash,數據丟失。服務器

  (2)設置爲臨時隊列,queue中的數據在系統重啓以後就會丟失。網絡

  (3)設置爲自動刪除的隊列,當不存在用戶鏈接到server,隊列中的數據會被自動刪除。架構

3 Exchange

  Exchange相似於數據通訊網絡中的交換機,提供消息路由策略。rabbitmq中,producer不是經過信道直接將消息發送給queue,而是先發送給Exchange。一個Exchange能夠和多個Queue進行綁定,producer在傳遞消息的時候,會傳遞一個ROUTING_KEY,Exchange會根據這個ROUTING_KEY按照特定的路由算法,將消息路由給指定的queue。和Queue同樣,Exchange也可設置爲持久化,臨時或者自動刪除。app

Exchange有4種類型:direct(默認),fanout, topic, 和headers,不一樣類型的Exchange轉發消息的策略有所區別:框架

  (1)Direct分佈式

    直接交換器,工做方式相似於單播,Exchange會將消息發送徹底匹配ROUTING_KEY的Queue。

  (2)fanout

    廣播是式交換器,無論消息的ROUTING_KEY設置爲何,Exchange都會將消息轉發給全部綁定的Queue。

  (3)topic

    主題交換器,工做方式相似於組播,Exchange會將消息轉發和ROUTING_KEY匹配模式相同的全部隊列,好比,ROUTING_KEY爲user.stock的Message會轉發給綁定匹配模式爲 * .stock,user.stock, * . * 和#.user.stock.#的隊列。( * 表是匹配一個任意詞組,#表示匹配0個或多個詞組)。

  (4)headers

    消息體的header匹配(ignore)

4 Binding

  所謂綁定就是將一個特定的 Exchange 和一個特定的 Queue 綁定起來。Exchange 和Queue的綁定能夠是多對多的關係。

5 virtual host

  在RabbitMQ server上能夠建立多個虛擬的message broker,又叫作virtual hosts (vhosts)。每個vhost本質上是一個mini-rabbitmq server,分別管理各自的exchange,和bindings。vhost至關於物理的server,能夠爲不一樣app提供邊界隔離,使得應用安全的運行在不一樣的vhost實例上,相互之間不會干擾。producer和consumer鏈接rabbit server須要指定一個vhost。

三 通訊過程

  假設P1和C1註冊了相同的Broker,Exchange和Queue。P1發送的消息最終會被C1消費。基本的通訊流程大概以下所示:

  (1)P1生產消息,發送給服務器端的Exchange。

  (2)Exchange收到消息,根據ROUTINKEY,將消息轉發給匹配的Queue1。

  (3)Queue1收到消息,將消息發送給訂閱者C1。

  (4)C1收到消息,發送ACK給隊列確認收到消息。

  (5)Queue1收到ACK,刪除隊列中緩存的此條消息。

  Consumer收到消息時須要顯式的向rabbit broker發送basic.ack消息或者consumer訂閱消息時設置auto_ack參數爲true。在通訊過程當中,隊列對ACK的處理有如下幾種狀況:

  (1)若是Consumer接收了消息,發送ack,rabbitmq會刪除隊列中這個消息,發送另外一條消息給Consumer。

  (2)若是Consumer接受了消息, 但在發送ack以前斷開鏈接,RabbitMQ會認爲這條消息沒有被deliver,在Consumer在次鏈接的時候,這條消息會被redeliver。

  (3)若是Consumer接受了消息,可是程序中有bug,忘記了ack,RabbitMQ不會重複發送消息。

  (4)RabbitMQ2.0.0和以後的版本支持consumer reject某條(類)消息,能夠經過設置requeue參數中的reject爲true達到目地,那麼rabbitmq將會把消息發送給下一個註冊的consumer。

原文連接http://www.javashuo.com/article/p-bgzeufdz-by.html,僅對格式作整理。

相關文章
相關標籤/搜索