前面的章節我們建立了乙個簡單的日誌系統,可以把訊息廣播到許多接收者。本節我們將增加乙個特性——只訂閱一部分訊息。比如只把錯誤日誌輸出到檔案,同時把所有日誌輸出到螢幕。
繫結 前面的例子裡我們已經建立過繫結。繫結就是交換機和佇列間的一種關係,簡單解讀為佇列關注該交換機的訊息。
建立繫結時可以增加乙個引數routing_key,為了避免跟basic_publish的引數混淆,我們先把它叫做binding key。
channel.queue_bind(exchange=exchange_name,queue=queue_name, routing_key='black')
binding key的意義與交換機型別有關,fanout型別的交換機直接忽略該引數值。
direct交換機
之前的日誌系統把所有的訊息廣播給所有的消費者。現在我們希望根據訊息的安全級別進行過濾。比如只講錯誤日誌寫入磁碟,而不為告警日誌和資訊日誌浪費磁碟空間。
fanout交換機不能提供這種靈活性,它只會廣播。
這裡我們需要direct交換機,其路由規則也很簡單——訊息將發往滿足條件的佇列:佇列的binding key嚴格匹配訊息的routing key。
multiple bindings
用同樣的binding key繫結多個佇列是可以的。
提交日誌
使用direct交換機,把日誌的安全級別作為訊息的routing key。接收端可以按級別接收。
import pika
import sys
connection = pika.blockingconnection(pika.connectionparameters(host='localhost'))
channel = connection.channel()
channel.exchange_declare(exchange='direct_logs', type='direct')
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()
訂閱
根據級別建立不同的繫結。
import pika
import sys
connection = pika.blockingconnection(pika.connectionparameters(host='localhost'))
channel = connection.channel()
channel.exchange_declare(exchange='direct_logs', type='direct')
result = channel.queue_declare(exclusive=true)
queue_name = result.method.queue
severities = sys.argv[1:]
if not severities:
sys.stderr.write("usage: %s [info] [warning] [error]\n" % sys.argv[0])
sys.exit(1)
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()
RabbitMQ 實戰教程(四) 路由
channel.queuebind queuename,exchange name,繫結是建立交換器和佇列之間的關係。這可以簡單地理解 佇列對該交換器上的訊息感興趣。為了避免與 basicpublish 方法的引數混淆,我們將其稱為繫結鍵。下面是我們如何用乙個繫結鍵建立乙個繫結 channel.qu...
RabbitMQ 原文譯04 路由
在前一篇文章中我們構建了乙個簡單的日誌系統,我們可以向多個接受者廣播訊息。在這篇文章我,我們將要新增一些功能使得針對部分訊息的接受成為可能,例如我們只對錯誤的訊息進行磁碟記錄,同時又可以把所有的訊息列印到螢幕上。在之前的案例中,我們已經建立了乙個繫結,可以重新呼叫如下的 channel.queueb...
REST on Rails指南4 路由
通過上一講我們了解到,restful設計的關鍵就是定義系統中的資源,這一講我們將學習在rails中,如何將請求路由到我們的資源,以及我們應該如何來處理它。不過,有一點需要先說明 rest並不是rails的一部分,在rails出現之前,rest的概念已經存在很多年了,並且rest的應用也並不侷限於we...