標籤:callback rabbitmq 通訊 傳輸 學習
一.基本配置
注意 RabbitMQ支援python、Java、Ruby、PHP、C#等語言的支援,本部落客要是針對python講解。本部落格安裝配置是基於ubuntu系統的。
1.1安裝配置epel源
$ rpm -Uvh http://dl.fedoraproject.org/pub/ ... ease-6-8.noarch.rpm
1.2安裝erlang
$: yum -y install erlang 或者$:sudo apt-get install erlang
1.3安裝rabbitmq-server
$: yum -y install rabbitmq-server 或者$: sudo apt-get install rabbitmq-server
1.4啟動/停止rabbitmq-server
$: sudo service rabbitmq-server start$: sudo service rabbitmq-server stop
1.5安裝RabbitMQ libraries
RabbitMQ遵循AMQP協議,為了使用rabbitmq,你需要一個庫來解讀這個協議,對於python來說,你需要安裝下面庫函數中的任意一個即可:
>py-amqplib>txAMQP>pika
本博文以pika庫為例,安裝如下:
$:sudo pip install pika==0.9.8 或者
$:sudo apt-get install pika==0.9.8
注意:以下內容是在rabbitmq-server啟動,運行在標準連接埠5672的前提下進行的。
二.對英文版的翻譯
2.1簡介
RabbitMQ相當於一個訊息代理,他完成接收和轉寄訊息的功能,你可以把它想成一個郵局,起到中轉作用。RabbitMQ會用到一些專業術語,如下:
>Producer:用來發送訊息的程式被稱為一個producer,我們用‘P’表示:
>Queue:隊列,相當於郵箱的作用,他在建立後一直存活與RabbitMQ中,雖然訊息可以在你的程式之間流動,但是在這中間的過程中,訊息必須存在queue中,一下queue沒有大小限制,你可以存無數的訊息,(前提你必須預留1GB的硬碟空間),他就相當於一個沒有限制的緩衝。多個Producer可以發送訊息到同一個queue,多個Consumer也可以從同一個queue中接收訊息。一個queue可以用下面的圖表示,圖的上面是queue的名字。
>Consumer:一個用來接收訊息的程式稱之為Consumer,我們用下面的圖表示:
注意,對於Producer和Consumer可以不在同一台host上面,後續博文會做介紹。
2.2兩點傳輸“Hello World!”
需要兩個程式,一個用來發送“Hello World!”,一個程式用來接收“Hello World!”並列印到螢幕上面。模型如下:
我們建立一個名字為hello的queue。Producer發送訊息到hello的queue,Consumer從名為hello的queue中接收訊息。
2.3sending(發送代碼實現)
模型如下:
首先我們需要編寫一個send.py程式,這個程式將向queue中發送一個訊息,第一件事,我們要做的就是與rabbitmq-server建立串連,代碼如下:
import pikaconnection = pika.BlockingConnection(pika.ConnectionParameters(host=‘localhost‘))channel = connection.channel()
如果我們想與不同的host建立串連,只需將‘localhost’換成IP地址。
接下來,我們需要確定接納訊息的queue的存在,如果我們把訊息發送給不存在的queue,那麼rabbitmq自動將訊息丟棄,讓我們建立一個訊息佇列queue,命名為‘hello’
channel.queue_declare(queue=‘hello‘)
在Rabbitmq中,一個訊息不能直接發送給queue,需要經過一個exchange,後續博文會講到,現在我們只需將exchange設定為空白字串。
exchange很特別,他會識別我們的訊息要發送給哪個訊息佇列queue,queue的名字需要用routing_key來標識,exchange通過routing_key確定訊息發送至哪個訊息佇列queue。代碼如下:
channel.basic_publish(exchange=‘‘,routing_key=‘hello‘,body=‘Hello World!‘)print "[X] Sent ‘Hello World!‘"
在退出程式之前,我們需要清理緩衝,並且確定我們的訊息“Hello World!”真的發送給RabbitMQ了,我們可以通過關閉串連來完成,代碼如下:
connection.close()
完整的send.py的代碼如下:
import pikaconnection = 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()
2.4Receiving(接收代碼實現)
模型如下所示:
我們的接收程式receive.py將接收訊息,並將它列印在螢幕上。
同樣首先,我們需要與rabbitmq-server建立串連,代碼和send.py基本一致,代碼如下:
import pikaconnection = pika.BlockingConnection(pika.ConnectionParameters(host=‘localhost‘))channel=connection.channel()
接下來,和前面一樣,要確定去隊列queue的存在,用queue_declare()建立隊列,對於這個命令我們可以運行很多次,但只有一個名字為hello的queue存在。代碼如下:
channel.queue_declare(queue=‘hello‘)
或許你會問,為什麼我們要再次建立名字為hello的queue,前面我們已經建立了啊,當然,如果我們確定隊列queue已經存在了,我們可以不加這段代碼。例如,如果send.py程式在之前已經運行過了,但是我們不確定哪個程式時先啟動並執行,這時候,我們在兩個程式中同時聲明queue就是必須的。
對於receive.py,我們要定義一個callback函數,在我們接受到訊息的時候,pika庫會調用callback函數,在我們的程式裡,callback函數就是將接收到的訊息列印在螢幕上。函數代碼如下:
def callback(ch,method,properties,body): print"[x] Received %r" %(body)
接下來我們需要告訴Rabbitmq,這個特殊的函數callback()的功能,就是從hello的queue中接收訊息,代碼如下:
channel.basic_consume(callback,queue=‘hello‘,no_ack=True)
對於代碼中的 no_ack,後續的部落格會提到。
最後,我們開啟一個永不停止的線程來等待訊息,在需要的時候運行callback()函數。代碼如下:
print ‘[*] Waiting for message. To exit press CTRL+C‘channel.start_consuming()
完整的receive.py的代碼如下:
import pikaconnection = pika.BlockingConnection(pika.ConnectionParameters( host=‘localhost‘))channel = connection.channel()channel.queue_declare(queue=‘hello‘)print ‘ [*] Waiting for messages. To exit press CTRL+C‘def callback(ch, method, properties, body): print " [x] Received %r" % (body,)channel.basic_consume(callback, queue=‘hello‘, no_ack=True)channel.start_consuming()
2.5代碼測試
首先開啟一個命令列視窗,運行send.py代碼,運行及結果如下:
$ :python send.py [x] Sent ‘Hello World!‘
send.py每次運行完就停止,接下來讓我們運行接收的代碼receive.py,運行及結果如下:
$: python receive.py [*] Waiting for messages. To exit press CTRL+C [x] Received ‘Hello World!‘
你會看到,received.py運行起來後,不會停止,一直在那等待訊息的傳入,如果想停止,CTRL+C。
在一個新命令列視窗中繼續運行send.py,運行receive.py的命令列視窗會繼續輸出相應資訊。
2.6部分rabbitmq-server的命令列操作命令
1)查看各個queue的名稱以及queue中的訊息數
$: sudo rabbitmqctl list_queues
例如
$: sudo rabbitmqctl list_queuesListing queues ...hello 0...done.
2)查看各exchange的名稱
$: sudo rabbitmqctl list_exchanges
RabbitMQ(python實現)學習之一:簡單兩點傳輸“Hello World”的實現