在上一個教程中,我們構(gòu)建了一個簡單的日志系統(tǒng),我們能夠向許多消息接受者廣播發(fā)送日志消息。
在本教程中,我們將為其添加一項功能 ,這個功能是我們將只訂閱消息的一個子集成為可能。 例如,我們可以只將關(guān)鍵的錯誤消息輸出到日志文件(以節(jié)省磁盤空間),同時仍然可以在控制臺上打印所有日志消息。
1、綁定
在以前的例子中,我們已經(jīng)創(chuàng)建了綁定。 你可能會記得如下代碼:
channel.QueueBind(queue: queueName, exchange: "logs", routingKey: "");
【綁定】是【消息交換機】和【隊列】之間的關(guān)系紐帶,通過綁定把二者關(guān)聯(lián)起來。 這可以簡單地理解為:隊列可以接收來自此【消息交換機】的消息。
【綁定】可以占用額外的路由選擇參數(shù)。 為了避免與BasicPublish參數(shù)混淆,我們將其稱為【綁定鍵】。 以下代碼就是如何用一個鍵值來創(chuàng)建一個綁定:
channel.QueueBind(queue: queueName, exchange: "direct_logs", routingKey: "black");
【綁定鍵】的含義取決于交換類型。 以前我們使用的【Fanout】類型的【消息交換機】忽略了它的取值。
2、直接交換
在上一個教程中,我們的日志記錄系統(tǒng)向所有【消費者】發(fā)送所有消息。 我們希望將其擴展為允許基于其嚴重性過濾消息。 例如,我們可能希望將寫入磁盤日志消息的腳本僅接受嚴重錯誤,而不會在警告或信息日志消息上浪費磁盤空間。
我們正在使用一個【Fanout】類型的【消息交換機】,它不會給我們帶來很大的靈活性 - 它只能無意識地發(fā)送。
我們將使用一個【Direct】類型的【消息交換機】。 直接轉(zhuǎn)換路由的背后的算法其實是很簡單的 - 把消息傳遞到【綁定鍵 binding key】和消息的【路由鍵 routing key】完全匹配的隊列中。
為了說明,請考慮以下設(shè)置:
在這個設(shè)置中,我們可以看到【Direct】類型的【消息交換機】X與兩個隊列相綁定。 第一個隊列與【綁定鍵】的值是Orange相綁定的,第二個隊列有兩個綁定,一個【綁定鍵】的值是black,另一個【綁定鍵】的值是green。
在這樣的設(shè)置中,發(fā)布到具有【路由鍵】為orange的【消息交換機】的消息將被路由到