Python操作RabbitMQ伺服器實現訊息佇列的路由功能,pythonrabbitmq

來源:互聯網
上載者:User

Python操作RabbitMQ伺服器實現訊息佇列的路由功能,pythonrabbitmq

Python使用Pika庫(安裝:sudo pip install pika)可以操作RabbitMQ訊息佇列伺服器(安裝:sudo apt-get install rabbitmq-server),這裡我們來看一下MQ相關的路由功能。

路由鍵的實現

比如有一個需要給所有接收端發送訊息的情境,但是如果需要自由定製,有的訊息發給其中一些接收端,有些訊息發送給另外一些接收端,要怎麼辦呢?這種情況下就要用到路由鍵了。

路由鍵的工作原理:每個接收端的訊息佇列在綁定交換器的時候,可以設定相應的路由鍵。發送端通過交換器發送資訊時,可以指明路由鍵 ,交換器會根據路由鍵把訊息發送到相應的訊息佇列,這樣接收端就能接收到訊息了。

這邊繼上一篇,還是用send.py和receive.py來類比實現路由鍵的功能。send.py表示發送端,receive.py表示接收端。執行個體的功能就是將info、warning、error三種層級的資訊發送到不同的接收端。

send.py程式碼分析

#!/usr/bin/env python#coding=utf8import pika connection = pika.BlockingConnection(pika.ConnectionParameters(        'localhost'))channel = connection.channel() #定義交換器,設定類型為directchannel.exchange_declare(exchange='messages', type='direct') #定義三個路由鍵routings = ['info', 'warning', 'error'] #將訊息依次發送到交換器,並設定路由鍵for routing in routings:  message = '%s message.' % routing  channel.basic_publish(exchange='messages',             routing_key=routing,             body=message)  print message connection.close()

receive.py程式碼分析

#!/usr/bin/env python#coding=utf8import pika, sys connection = pika.BlockingConnection(pika.ConnectionParameters(        'localhost'))channel = connection.channel() #定義交換器,設定類型為directchannel.exchange_declare(exchange='messages', type='direct') #從命令列擷取路由鍵參數,如果沒有,則設定為inforoutings = sys.argv[1:]if not routings:  routings = ['info'] #產生暫存佇列,並綁定到交換器上,設定路由鍵result = channel.queue_declare(exclusive=True)queue_name = result.method.queuefor routing in routings:  channel.queue_bind(exchange='messages',            queue=queue_name,            routing_key=routing) def callback(ch, method, properties, body):  print " [x] Received %r" % (body,) channel.basic_consume(callback, queue=queue_name, no_ack=True) print ' [*] Waiting for messages. To exit press CTRL+C'channel.start_consuming()

開啟兩個終端,一個運行代碼python receive.py info warning,表示只接收info和warning的訊息。另外一個終端運行send.py,可以觀察到接收終端只接收到了info和warning的訊息。如果開啟多個終端運行receive.py,並傳入不同的路由鍵參數,可以看到更明顯的效果。

當接收端正在運行時,可以使用rabbitmqctl list_bindings來查看綁定情況。

路由鍵模糊比對
路由鍵模糊比對,就是可以使用Regex,和常用的正則表示式不同,這裡的話“#”表示所有、全部的意思;“*”只匹配到一個詞。看完樣本就能明白了。

這邊繼上面的例子,還是用send.py和receive.py來實現路由鍵模糊比對的功能。send.py表示發送端,receive.py表示接收端。執行個體的功能大概是這樣:比如你有個知心好朋友,不管開心、傷心、工作上的還是生活上的事情都可以和她說;還有一些朋友可以分享開心的事情;還有一些朋友,你可以把不開心的事情和她說。

send.py程式碼分析

因為要進行路由鍵模糊比對,所以交換器的類型要設定為topic,設定為topic,就可以使用#,*的匹配符號了。

#!/usr/bin/env python#coding=utf8import pika connection = pika.BlockingConnection(pika.ConnectionParameters(        'localhost'))channel = connection.channel() #定義交換器,設定類型為topicchannel.exchange_declare(exchange='messages', type='topic') #定義路由鍵routings = ['happy.work', 'happy.life', 'sad.work', 'sad.life'] #將訊息依次發送到交換器,並設定路由鍵for routing in routings:  message = '%s message.' % routing  channel.basic_publish(exchange='messages',             routing_key=routing,             body=message)  print message connection.close()

上例中定義了四種類型的訊息,容易理解,就不解釋了,然後依次發送出去。

receive.py程式碼分析

同樣,交換器的類型要設定為topic就可以了。從命令列接收參數的功能稍微調整了一下,就是沒有參數時報錯退出。

#!/usr/bin/env python#coding=utf8import pika, sys connection = pika.BlockingConnection(pika.ConnectionParameters(        'localhost'))channel = connection.channel() #定義交換器,設定類型為topicchannel.exchange_declare(exchange='messages', type='topic') #從命令列擷取路由參數,如果沒有,則報錯退出routings = sys.argv[1:]if not routings:  print >> sys.stderr, "Usage: %s [routing_key]..." % (sys.argv[0],)  exit() #產生暫存佇列,並綁定到交換器上,設定路由鍵result = channel.queue_declare(exclusive=True)queue_name = result.method.queuefor routing in routings:  channel.queue_bind(exchange='messages',            queue=queue_name,            routing_key=routing) def callback(ch, method, properties, body):  print " [x] Received %r" % (body,) channel.basic_consume(callback, queue=queue_name, no_ack=True) print ' [*] Waiting for messages. To exit press CTRL+C'channel.start_consuming()

開啟四個終端,一個運行如下,表示任何事情都可以和她說:

python receive.py "#"

另外一個終端 運行如下,表示可以和她分享開心的事:

python receive.py "happy.*"

第三個運行如下,表示工作上的事情可以和她分享:

python receive.py "*.work"

最後一個運行python send.py。結果不難想象出來,就不貼出來了。

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在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.