RabbitMQ(python實現)學習之一:簡單兩點傳輸“Hello World”的實現

來源:互聯網
上載者:User

標籤: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”的實現

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.