mq 探究

一 mq簡介(message queue)

消息隊列技術是分佈式應用間交互信息的一種技術。算法

消息隊列可駐留在內存或磁盤上,隊列存儲消息直到它們被應用程序讀走數組

經過消息隊列,應用程序可獨立地執行-它們不須要知道彼此的位置,或在繼續執行前不須要等待程序接收此消息緩存

它接受收據,存儲消息數據,轉發消息安全

使用場景: 解耦,提升峯值處理能力,送達和排序保證,緩衝等服務器

 

二 mq術語

1 producer

消息發送者,在mq稱爲生產者網絡

2 consumer

消息接收者,在mq稱爲消費者app

3 Queue

消息存儲在隊列(queue)中, 一個隊列不受任何限制,它能夠存儲你想要存儲的消息量,它本質上是一個無限的緩衝區。socket

多個生產者能夠向同一個隊列發送消息,多個消費者能夠嘗試從同一個隊列中接收數據分佈式

在rabbitmq中,隊列消息能夠設置爲持久化, 臨時或自動刪除編碼

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

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

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

4 Exchange

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

Exchange又下面4種類型,direct(默認),fanout, topic, headers,分別對應不用類型的轉發策略

(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)

5 Binding

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

6 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某條(類)消息,能夠設置參數中的reject爲true達到目的,那麼rabbitmq將會把消息發送給下一個註冊的consumer。

Exchange和Queue是最核心的組件,Exchange和Queue是在rabbitmq server端(又叫broker端),producer和consumer在應用端

 

生產者:

首先建立一個connection經過socket鏈接去和服務器鏈接起來(須要傳目的服務器的ip,用戶名,密碼)

接着建立一個channel,這是大部分要作的事情所在

要發送消息,必須聲明一個隊列,而後咱們能夠向隊列發佈消息

消息的內容是字節數組,在使用時,注意編碼問題。

消費者:

當隊列裏有消息時,消費者要隨時可以從隊列裏獲取消息,因此我須要一直運行它,讓它監聽消息

生產者要發送消息,必定要事先知道消費消息的程序的對列是哪一個。因此,在運行生產者程序前,須要先啓動消費者程序。所以聲明隊列,就應該在消費者程序中完成。

 

這個好好看下: 寫的好到爆

http://blog.csdn.net/lovesomnus/article/details/51776942 

相關文章
相關標籤/搜索