RabbitMQ官網教程4 路由

2021-07-28 03:05:35 字數 2191 閱讀 7200

前面的章節我們建立了乙個簡單的日誌系統,可以把訊息廣播到許多接收者。本節我們將增加乙個特性——只訂閱一部分訊息。比如只把錯誤日誌輸出到檔案,同時把所有日誌輸出到螢幕。

繫結 前面的例子裡我們已經建立過繫結。繫結就是交換機和佇列間的一種關係,簡單解讀為佇列關注該交換機的訊息。

建立繫結時可以增加乙個引數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...