RabbitMQ 原文譯04 路由

2022-07-05 10:36:13 字數 3603 閱讀 3449

在前一篇文章中我們構建了乙個簡單的日誌系統,我們可以向多個接受者廣播訊息。

在這篇文章我,我們將要新增一些功能使得針對部分訊息的接受成為可能,例如我們只對錯誤的訊息進行磁碟記錄,同時又可以把所有的訊息列印到螢幕上。

在之前的案例中,我們已經建立了乙個繫結,可以重新呼叫如下的**:

channel.queuebind(queue: queuename,exchange: 

"logs

",routingkey:

"");

繫結是交換機和佇列之間的關係,可以簡單的理解為佇列對該交換機上的訊息感興趣。

繫結可以設定引數routingkey,為了避免和basicpublish 方法的引數混淆,我們暫且稱之為binding key,下面是我們建立乙個帶有指定binding key的繫結:

channel.queuebind(queue: queuename,exchange: "

direct_logs

",routingkey:

"black

");

我們之前的日誌系統,把接受到的訊息廣播給所有的接受者,我們將要擴充套件它使得其能夠根據訊息的級別來過濾傳送訊息,例如我們想讓記錄日誌的接受者僅僅接受嚴重性級別的錯誤訊息,而不用在警告和資訊級別的訊息上浪費磁碟空間。

fanout沒有辦法提供給我們這樣的靈活性,它只能對接受到的訊息進行直接廣播,而不去關心 routing key.

這裡我們使用direct型別的交換機去代替,direct型別的交換機的實現思想非常簡單--訊息將會被傳送到其binding key 和訊息的routing key 完全匹配的佇列上。

為了說明這個問題,考慮下面的設定:

在這個交換機上繫結了兩個佇列,第乙個佇列繫結的bingding key 為"orange",第二個佇列繫結了兩個binding key,乙個是"black",另外乙個是"green",在這樣的配置下,如果乙個帶有routing key為"orange"的訊息,竟會被路由到佇列q1上,而帶有routing key為"black" 或 "green"的訊息將會被路由到佇列q2上。

使用乙個routing key 繫結多個佇列完全是合法的,在我們案例中我們可以在 路由x 和 佇列q1,q2中同時新增乙個binding key為"black"的繫結,在這種情況下路由 x 將會像 fanout交換機一樣幫匹配到的訊息傳送給所有的接受者:路由會把routing key 為"black"的訊息傳送給q1和q2。

我們使用這種模式來構建我們的日誌系統,代替fanout我們將會把我們的訊息傳送到direct型別的交換機,我們把日誌級別作為路由的rouing key,這樣接受者就可以根據日誌級別選擇接受其感興趣的日誌。

像往常一樣,首先我們需要建立乙個交換機:

channel.exchangedeclare(exchange: "

direct_logs

", type: "

direct

");

然後我們準備傳送訊息:

var body =encoding.utf8.getbytes(message);

channel.basicpublish(exchange:

"direct_logs

",routingkey: severity,basicproperties:

null

, body: body);

我們簡單的假設 severity 分為以下幾種:"info","warning","error".

接受訊息和之前的一樣,唯一的區別就是我們將會為我們感興趣的每乙個級別的訊息新建繫結:

編譯執行**:

例如:如果你僅僅想儲存"warning"和"error"的訊息,開啟控制台輸入:receivelogsdirect.exe warning error 

傳送乙個error訊息, 控制台輸入 emitlogdirect.exe error "run. run. or it will explode."

RabbitMQ 實戰教程(四) 路由

channel.queuebind queuename,exchange name,繫結是建立交換器和佇列之間的關係。這可以簡單地理解 佇列對該交換器上的訊息感興趣。為了避免與 basicpublish 方法的引數混淆,我們將其稱為繫結鍵。下面是我們如何用乙個繫結鍵建立乙個繫結 channel.qu...

RabbitMQ官網教程4 路由

前面的章節我們建立了乙個簡單的日誌系統,可以把訊息廣播到許多接收者。本節我們將增加乙個特性 只訂閱一部分訊息。比如只把錯誤日誌輸出到檔案,同時把所有日誌輸出到螢幕。繫結 前面的例子裡我們已經建立過繫結。繫結就是交換機和佇列間的一種關係,簡單解讀為佇列關注該交換機的訊息。建立繫結時可以增加乙個引數ro...

RabbitMQ 原文譯03 發布和訂閱

在之前的案例中我們建立了乙個工作佇列,這個工作佇列的實現思想就是乙個把每乙個任務平均分配給每乙個執行者,在這個篇文章我們會做一些不一樣的東西,把乙個訊息傳送給多個消費者,這種模式就被稱作 發布 訂閱 為了說明這個模式,我們將要建立乙個簡單的日誌系統,乙個負責發布訊息,另外乙個負責接收列印他們.在我們...