RabbitMQ訊息通訊,生產者傳送訊息給指定的消費者的訊息佇列
阿新 • • 發佈:2019-01-05
上一篇文章描述了,通過使用廣播式的通訊方式,讓生產者把訊息廣播給每一個消費者,本節我們介紹另外一個方式,生產者可以指定消費者,把訊息傳送給它:
client.py
#!/usr/bin/env python
import pika
import sys
connection = pika.BlockingConnection(pika.ConnectionParameters(host='localhost'))
channel = connection.channel()
#這裡指定exchange的名字為direct_log,型別為direct(直接的,指定的)
channel.exchange_declare(exchange='direct_logs',
exchange_type='direct')
#在這裡我們建立一個變數用於介紹routing_key的名字,
#這樣我們在傳送訊息的時候可以指定把訊息傳送給某一個消費者對應的訊息佇列
#預設的消費者繫結的訊息佇列為info
severity = sys.argv[1] if len(sys.argv) > 2 else 'info'
message = ' '.join(sys.argv[2:]) or 'Hello World!'
channel.basic_publish(exchange='direct_logs',
routing_key=severity,
body=message)
print(" [x] Sent %r:%r" % (severity, message))
connection.close()
server.py
#!/usr/bin/env python
import pika
import sys
connection = pika.BlockingConnection(pika.ConnectionParameters(host='localhost'))
channel = connection.channel()
#這裡的exchange轉換型別為direct(直接的,也可以理解為指定的)
channel.exchange_declare(exchange='direct_logs',
exchange_type='direct')
result = channel.queue_declare(exclusive=True)
queue_name = result.method.queue
#這裡設定需要從哪個訊息佇列裡面獲取訊息,任意字串即可
#這裡我們加入了提示,可以是info warning error也可以是其他的
severities = sys.argv[1:]
if not severities:
sys.stderr.write("Usage: %s [info] [warning] [error]\n" % sys.argv[0])
sys.exit(1)
#這裡指定exchange的名字為direct_log,與client相對應
#指定routint_key為執行時指定的訊息佇列的名稱
for severity in severities:
channel.queue_bind(exchange='direct_logs',
queue=queue_name,
routing_key=severity)
print(' [*] Waiting for logs. To exit press CTRL+C')
def callback(ch, method, properties, body):
print(" [x] %r:%r" % (method.routing_key, body))
channel.basic_consume(callback,
queue=queue_name,
no_ack=True)
channel.start_consuming()
最後我們通過現象更加深入的瞭解這種通訊方式:
在一個終端1執行python server.py info
在一個終端2執行python server.py warning
在一個終端3執行python server.py error
這樣就會有三個訊息佇列,分別是info warning error,
然後執行python client.py info test_message 或python client.py test_message,這樣終端1就會收到test_message訊息
然後執行python client.py warning test_message,這樣終端2就會收到test_message訊息
然後執行python client.py error test_message,這樣終端3就會收到test_message訊息
更多資訊請查詢RabbitMQ官網:http://www.rabbitmq.com