譯 RabbitMQ教程C 版 主題

2021-09-20 01:37:35 字數 4476 閱讀 7787

先決條件本教程假定rabbitmq已經安裝,並執行在localhost標準埠(5672)。如果你使用不同的主機、埠或證書,則需要調整連線設定。

從**獲得幫助

(使用.net客戶端)在 教程[4] 中,我們改進了我們日誌系統。我們用direct交換器替換了只能呆滯廣播訊息的fanout交換器,從而可以有選擇性的接收日誌。

雖然使用direct交換器改進了我們的系統,但它仍然有侷限性 - 不能基於多個標準進行路由。

在我們的日誌系統中,我們可能不僅要根據日誌的嚴重性訂閱日誌,可能還要根據日誌分發源來訂閱日誌。或許您可能從 unix syslog 工具中了解過這種概念,syslog 工具在路由日誌的時候是可以既基於嚴重性(info/warn/crit...)又基於裝置(auth/cron/kern...)的。

這種機制會給我們帶來極大的靈活性 - 我們可以僅監聽來自cron的關鍵錯誤日誌,與此同時,監聽來自kern的所有日誌。

要在我們的日誌系統中實現這一特性,我們需要學習更複雜的topic交換器。

傳送到topic交換器的訊息不能隨意指定routing key,它必須是乙個由點分割的單詞列表,這些單詞可以是任意內容,但通常會在其中指定一些與訊息相關的特性。請看一些合法的路由鍵示例:stock.usd.nysenyse.vmwquick.orange.rabbit,路由鍵可以包含任意數量的單詞,但不能超過255個位元組的上限。

binding key也必須是相同的形式,topic交換器的背後邏輯與direct交換器類似 - 使用指定路由鍵傳送的訊息會被分發到與其繫結鍵匹配的所有佇列中。不過對於繫結鍵來說,有兩個重要的特殊情況需要注意:

下圖示例是對上述內容最簡單的解釋:

在這個示例中,我們打算傳送的訊息全是用來描述動物的,這些訊息會使用由三個單詞(兩個點)組成的路由鍵來傳送。在路由鍵中,第乙個單詞用來描述行動速度、第二個是顏色、第三個是物種,即:..

我們建立了三個繫結:q1繫結了鍵.orange.,q2繫結了鍵*.*.rabbitlazy.#

這些繫結可以被概括為:

路由鍵為quick.orange.rabbit的訊息會被傳送到這兩個佇列,訊息lazy.orange.elephant也會被傳送到這兩個佇列。另外,quick.orange.fox只會進入第乙個佇列,lazy.brown.fox只會進入第二個佇列。lazy.pink.rabbit只會被傳送到第二個佇列一次,儘管它匹配了兩個繫結(避免了訊息重複)。quick.brown.fox沒有匹配的繫結,因此它將會被丟棄。

如果我們打破約定,傳送使用乙個或四個單詞(例如:orangequick.orange.male.rabbit)作路由鍵的訊息會發生什麼?答案是,這些訊息因為沒有匹配到任何繫結,將被丟棄。

但是,另外,例如路由鍵為lazy.orange.male.rabbit的訊息,儘管它有四個單詞,也會匹配最後乙個繫結,並將被傳送到第二個佇列。

topics 交換器topic交換器的功能是很強大的,它可以表現出一些其他交換器的行為。

當乙個佇列與鍵(雜湊)繫結時, 它會忽略路由鍵,接收所有訊息,這就像fanout交換器一樣。

當特殊字元*(星號)和(雜湊)未在繫結中使用時,topic交換器的行為就像direct交換器一樣。

我們將要在我們的日誌系統中使用topic交換器,首先假設日誌的路由鍵有兩個單詞組成:.

emitlogtopic.cs的**:

using system;

using system.linq;

using rabbitmq.client;

using system.text;

class emitlogtopic

; using(var connection = factory.createconnection())

using(var channel = connection.createmodel())

':''", routingkey, message);}}

}

receivelogstopic.cs的**:

using system;

using rabbitmq.client;

using rabbitmq.client.events;

using system.text;

class receivelogstopic

; using(var connection = factory.createconnection())

using(var channel = connection.createmodel())

[binding_key...]",

environment.getcommandlineargs()[0]);

console.writeline(" press [enter] to exit.");

console.readline();

environment.exitcode = 1;

return;

}foreach(var bindingkey in args)

console.writeline(" [*] waiting for messages. to exit press ctrl+c");

var consumer = new eventingbasicconsumer(channel);

consumer.received += (model, ea) =>

':''",

routingkey,

message);

};channel.basicconsume(queue: queuename,

autoack: true,

consumer: consumer);

console.writeline(" press [enter] to exit.");

console.readline();}}

}

請執行以下示例:要接收所有日誌:

cd receivelogstopic

dotnet run "#"

要接收來自裝置kern的所有日誌:

cd receivelogstopic

dotnet run "kern.*"

或者,如果您只想監聽級別為critical的日誌:

cd receivelogstopic

dotnet run "*.critical"

您可以建立多個繫結:

cd receivelogstopic

dotnet run "kern.*" "*.critical"

使用路由鍵kern.critical發出日誌:

cd emitlogtopic

dotnet run "kern.critical" "a critical kernel error"

希望執行這些程式能讓您玩得開心。要注意的是,這些**沒有針對路由鍵和繫結鍵做任何預設,您可以嘗試使用兩個以上的路由鍵引數。

( emitlogtopic.cs 和 receivelogstopic.cs 的完整原始碼)

接下來,在 教程[6] 中將了解如何將往返訊息作為遠端過程呼叫。

實驗環境:rabbitmq 3.7.4 、.net core 2.1.3、visual studio code

最後更新:2018-09-06

RabbitMQ系列教程 C

rabbitmq系列教程之七 rabbitmq的 c 客戶端 api 的簡介 rabbitmq系列教程之六 遠端過程呼叫 rpc rabbitmq系列教程之五 主題 topic rabbitmq系列教程之四 路由 routing rabbitmq系列教程之三 發布 訂閱 publish subscr...

WordPress 主題教程 5c 日誌元資料

同樣請開啟 xampp,主題資料夾,瀏覽器以及 index.php 檔案。先讓我們複習下,現在的 index.php 檔案應該有下面這些 了 把 postmetadata.txt 中的 複製到 下面。注意 在這部分,我們只需要複製和貼上。當我製作 wordpress 主題的時候,我也只是複製和貼上這...

WordPress 主題教程 5c 日誌元資料

同樣請開啟 xampp,主題資料夾,瀏覽器以及 index.php 檔案。先讓我們複習下,現在的 index.php 檔案應該有下面這些 了 把 postmetadata.txt 中的 複製到 下面。注意 在這部分,我們只需要複製和貼上。當我製作 wordpress 主題的時候,我也只是複製和貼上這...