rabbitmq中文教程python版 - 介紹

源碼:https://github.com/ltoddy/rabbitmq-tutorialpython

介紹

RabbitMQ是一個消息代理:它接受和轉發消息。你能夠把它想象成一個郵局:當你把你想要發佈的郵件放在郵箱中時,你能夠肯定郵差先生最終將郵件發送給你的收件人。在這個比喻中,RabbitMQ是郵政信箱,郵局和郵遞員。git

RabbitMQ和郵局的主要區別在於它不處理紙張,而是接受,存儲和轉發二進制數據塊 -- 消息。github

請注意,生產者,消費者和消息代理沒必要駐留在同一主機上; 實際上在大多數應用程序中它們不是同一主機上。小程序

Hello World!

(using the Pika Python client)服務器

pip3 install pika

在本教程的這一部分,咱們將使用Python編寫兩個小程序; 發送單個消息的生產者(發送者),以及接收消息並將其打印出來的消費者(接收者)。這是一個消息傳遞的「Hello World」。網絡

在下圖中,「P」是咱們的生產者,「C」是咱們的消費者。中間的盒子是一個隊列 - RabbitMQ表明消費者保存的消息緩衝區。函數

咱們的總體設計將以下所示:工具

image

生產者將消息發送到「hello」隊列,消費者接收來自該隊列的消息。

發送

image

咱們的第一個程序 send.py 會向隊列發送一條消息。咱們須要作的第一件事是與RabbitMQ服務器創建鏈接。spa

#!/usr/bin/env python
import pika

connection = pika.BlockingConnection(pika.ConnectionParameters('localhost'))
channel = connection.channel()

咱們如今鏈接到本地上的的代理 - 所以是 'localhost'。若是咱們想鏈接到另外一臺機器上的代理,咱們只需在此指定其名稱或IP地址。設計

接下來,在發送以前,咱們須要確保收件人隊列存在。若是咱們發送消息到不存在的位置,RabbitMQ將只刪除該消息。咱們來建立一個將傳遞消息的 hello 隊列:

channel.queue_declare(queue='hello')

此時咱們準備發送消息。咱們的第一條消息將只包含一個字符串 "Hello World!"咱們想把它發送給咱們的 hello 隊列。

在RabbitMQ中,消息永遠不會直接發送到隊列,它老是須要通過交換。咱們如今須要知道的是如何使用由空字符串標識的默認交換。這種交換是特殊的 - 它容許咱們準確地指定消息應該到達哪一個隊列。隊列名稱須要在routing_key參數中指定:

channel.basic_publish(exchange='',
                      routing_key='hello',
                      body='Hello World!')
print(" [x] Sent 'Hello World!'")

在退出程序以前,咱們須要確保網絡緩衝區被刷新,而且咱們的消息被實際傳送到RabbitMQ。咱們能夠經過輕輕關閉鏈接來完成。

connection.close()

接收

image

咱們的第二個程序 receive.py 將接收隊列中的消息並將它們打印在屏幕上。

再次,咱們首先須要鏈接到RabbitMQ服務器。負責鏈接到Rabbit的代碼與之前相同。

下一步,就像之前同樣,要確保隊列存在。使用queue_declare建立一個隊列是冪等的 - 咱們能夠根據須要屢次運行該命令,而且只會建立一個。

channel.queue_declare()

您可能會問爲何咱們再次聲明隊列 - 咱們已經在以前的代碼中聲明瞭它。若是咱們確信隊列已經存在,咱們能夠避免這種狀況。例如,若是 send.py 程序以前運行過。但咱們還不肯定首先運行哪一個程序。在這種狀況下,重複在兩個程序中重複聲明隊列是一種很好的作法。

列出隊列

您可能但願看到RabbitMQ有什麼隊列以及它們中有多少條消息。您可使用rabbitmqctl工具(做爲特權用戶)執行此操做:

> sudo rabbitmqctl list_queues

在Windows上,省略sudo:

> rabbitmqctl.bat list_queues

從隊列接收消息更爲複雜。它經過向隊列訂閱 回調函數 來工做。每當咱們收到一條消息,這個回調函數就被皮卡庫調用。在咱們的例子中,這個函數會在屏幕上打印消息的內容。

def callback(ch, method, propertites, body):
    print(" [x] Received {}".format(body))

接下來,咱們須要告訴RabbitMQ這個特定的回調函數應該從咱們的hello隊列接收消息:

channel.basic_consume(callable, queue='hello', no_ack=True)

爲了讓這個命令成功,咱們必須確保咱們想要訂閱的隊列存在。幸運的是,咱們對此有信心 - 咱們已經使用queue_declare建立了一個隊列。

NO_ACK參數,後面(幾篇以後)會有解釋。

最後,咱們進入一個永無止境的循環,等待數據並在必要時運行回調。

print(' [*] Waiting for messages. To exit press CTRL+C')
channel.start_consuming()

把它放在一塊兒

send.py的完整代碼:

#!/usr/bin/env python
import pika

connection = pika.BlockingConnection(pika.ConnectionParameters(host='localhost'))
channel = connection.channel()


channel.queue_declare(queue='hello')

channel.basic_publish(exchange='',
                      routing_key='hello',
                      body='Hello World!')
print(" [x] Sent 'Hello World!'")
connection.close()

receive.py的完整代碼:

#!/usr/bin/env python
import pika

connection = pika.BlockingConnection(pika.ConnectionParameters('localhost'))
channel = connection.channel()

channel.queue_declare(queue='hello')


def callback(ch, method, propertites, body):
    print(" [x] Received {}".format(body))


channel.basic_consume(callable,
                      queue='hello',
                      no_ack=True)

print(' [*] Waiting for messages. To exit press CTRL+C')
channel.start_consuming()

如今咱們能夠在終端上試用咱們的程序。首先,讓咱們開始一個消費者,它將持續運行等待交付:

python receive.py
# => [*] Waiting for messages. To exit press CTRL+C
# => [x] Received 'Hello World!'

如今開始製做。生產者計劃將在每次運行後中止:

python send.py
# => [x] Sent 'Hello World!'

歡呼!咱們可以經過RabbitMQ發送咱們的第一條消息。正如您可能已經注意到的,receive.py 程序不會退出。它會隨時準備接收更多消息,並可能會被Ctrl-C中斷。

嘗試在新終端中再次運行 send.py

image

相關文章
相關標籤/搜索