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