天天看點

RabbitMQ基本概念和使用一、helloworld例子二、RabbitMQ基本概念三、交換機四、隊列五、指令

rabbitmq是一個消息代理,核心原理:發送消息,接收消息。

rabbitmq主要用于元件之間的解耦,消息發送者無需知道消息使用者的存在,反之亦然。

RabbitMQ基本概念和使用一、helloworld例子二、RabbitMQ基本概念三、交換機四、隊列五、指令
RabbitMQ基本概念和使用一、helloworld例子二、RabbitMQ基本概念三、交換機四、隊列五、指令

              單向解耦                                        雙向解耦(如:rpc)

例如一個日志系統,很容易使用rabbitmq簡化工作量,一個consumer進行消息的正常處理,另一個consumer複制對消息進行日志記錄,隻要在程式中指定兩個consumer所監聽的queue以相同的方式綁定到同一個exchange即可,剩下的消息分發工作由rabbitmq完成。

首先通過一個非常簡單的”hello world“例子介紹如何使用rabbitmq,然後再介紹其涉及的基本概念并對交換機和隊列多做點介紹。

本例非常簡單——發送一個消息”hello world“,然後擷取它并輸出到螢幕。

總共需要兩個程式,一個發送消息叫send.py,一個接受消息并列印消息内容叫receive.py。

RabbitMQ基本概念和使用一、helloworld例子二、RabbitMQ基本概念三、交換機四、隊列五、指令

該圖為helloworld例子的原理圖:生産者send.py(productor)把消息(”hello world“)發送到一個名為”queue“的隊列中,消費者receive.py從這個隊列中擷取消息。接下來看代碼:

send.py(發送消息)

RabbitMQ基本概念和使用一、helloworld例子二、RabbitMQ基本概念三、交換機四、隊列五、指令
RabbitMQ基本概念和使用一、helloworld例子二、RabbitMQ基本概念三、交換機四、隊列五、指令

receive.py(擷取資料)

RabbitMQ基本概念和使用一、helloworld例子二、RabbitMQ基本概念三、交換機四、隊列五、指令
RabbitMQ基本概念和使用一、helloworld例子二、RabbitMQ基本概念三、交換機四、隊列五、指令

現在在終端運作程式。首先,用send.py發送一條消息:

生産者(producer)程式send.py每次運作後就會停止。現在運作receive.py來接收消息:

成功了!現在已經通過rabbitmq發送了第一條消息。但是receive.py程式并沒有退出,它一直在準備擷取消息,可以通過ctrl-c來中斷它。

總結一下發送接收消息的過程:

RabbitMQ基本概念和使用一、helloworld例子二、RabbitMQ基本概念三、交換機四、隊列五、指令

通過上面例子對rabbitmq有一個感性認識後,現在來介紹rabbitmq中的基本概念。

broker:消息隊列伺服器實體

消息:每個消息都有一個路由鍵(routing key)的屬性。就是一個簡單的字元串。

connection:應用程式與broker的網絡連接配接。

channel:幾乎所有的操作都在channel中進行,channel是進行消息讀寫的通道。用戶端可建立多個channel,每個channel代表一個會話任務。

交換機:接收消息,根據路由鍵轉發消息到綁定的隊列。

綁定:一個綁定就是基于路由鍵将交換機和隊列連接配接起來的路由規則,是以交換機不過就是一個由綁定構成的路由表。

舉例:一個具有路由鍵“key1”的消息要發送到兩個隊列,queuea和queueb。要做到這點就要建立兩個綁定,每個綁定連接配接一個交換機和一個隊列。兩者都是由路由鍵“key1”觸發,這種情況,交換機會複制一份消息并把它們分别發送到兩個隊列中。

隊列:消息的容器,也是消息的終點。一個消息可投入一個或多個隊列。消息一直在隊列裡面,等待消費者連接配接到這個隊列将其取走。

交換機用來接收消息,轉發消息到綁定的隊列,是rabbitmq中的核心。

交換機共有4種類型:direct,topic,headers和fanout。

為什麼不建立一種交換機來處理所有類型的路由規則?因為每種規則比對時的cpu開銷是不同的,是以根據不同需求選擇合适交換機。

舉例:一個"topic"類型的交換機會将消息的路由鍵與類似“dog.*”的模式進行比對。一個“direct”類型的交換機會将路由鍵與“dogs”進行比較。比對末端通配符比直接比較消耗更多的cpu,是以如果用不到“topic”類型交換機帶來的靈活性,就通過“direct”類型交換機獲得更高的處理效率。

routingkey與隊列名完全比對,如果一個隊列綁定到交換機要求路由鍵為“dog”,則隻轉發routingkey标記為dog的消息,不會轉發dog.puppy,也不會轉發dog.guard等。

RabbitMQ基本概念和使用一、helloworld例子二、RabbitMQ基本概念三、交換機四、隊列五、指令

 topic類型交換機通過模式比對配置設定消息的routing-key屬性。将路由鍵和某個模式進行比對,此時隊列需要綁定到一個模式上。

它将routing-key和binding-key的字元串切分成單詞。這些單詞之間用點隔開。它同樣也會識别兩個通配符:符号“#”和符号“*”。#比對0個或多個單詞,*比對不多不少一個單詞。

例如,binding key:*.stock.#比對routing key: usd.stock和eur.stock.db,但是不比對stock.nana。

例如,“audit.#”能夠比對到“audit.irs.corporate”,但是“audit.*”隻會比對到“audit.irs”。

RabbitMQ基本概念和使用一、helloworld例子二、RabbitMQ基本概念三、交換機四、隊列五、指令

fanout交換機不處理路由鍵,簡單的将隊列綁定到交換機上,每個發送到交換機的消息都會被轉發到與該交換機綁定的所有隊列上。

很像子網廣播,每台子網内的主機都獲得了一份複制的消息。fanout交換機轉發消息是最快的。

RabbitMQ基本概念和使用一、helloworld例子二、RabbitMQ基本概念三、交換機四、隊列五、指令

如果沒有隊列綁定在交換機上,則發送到該交換機上的消息會丢失。

一個交換機可以綁定多個隊列,一個隊列可以被多個交換機綁定。

還有一些其他類型的交換機類型,如header、failover、system等,現在在目前的rabbitmq版本中均未實作。

因為交換機是命名實體,聲明一個已經存在的交換機,但是試圖賦予不同類型是會導緻錯誤。用戶端需要删除這個已經存在的交換機,然後重新聲明并且賦予新的類型。

交換機的屬性:

持久性:如果啟用,交換機将會在server重新開機前都有效。

自動删除:如果啟用,那麼交換機将會在其綁定的隊列都被删掉之後删除自身。

惰性:如果沒有聲明交換機,那麼在執行到使用的時候會導緻異常,并不會主動聲明。

隊列的屬性:

持久性:如果啟用,隊列将在server服務重新開機前都有效。

自動删除:如果啟用,那麼隊列将會在所有的消費者停止使用之後自動删除自身。

惰性:如果沒有聲明隊列,那麼在執行到使用的時候會導緻異常,并不會主動聲明。

排他性:如果啟用,隊列隻能被聲明它的消費者使用。  

可以利用http://ip:15672檢視界面狀态

RabbitMQ基本概念和使用一、helloworld例子二、RabbitMQ基本概念三、交換機四、隊列五、指令

以上指令參考自:http://www.cnblogs.com/kaituorensheng/p/4985767.html

深入了解可參考:

<a href="http://langyu.iteye.com/blog/759663">amqp協定</a>

官網教程

<a href="http://adamlu.net/rabbitmq/tutorial-one-python">hello world</a>

<a href="http://adamlu.net/rabbitmq/tutorial-two-python">工作隊列</a>

上面兩篇是翻譯成中文的,剩下的都沒有翻譯,可參考英文版

<a href="http://www.rabbitmq.com/getstarted.html">rabbitmq tutorials</a>

<a href="http://www.01happy.com/python-pika-rabbitmq-summary/">python采用pika庫使用rabbitmq總結,多篇筆記和示例</a>