RabbitMQ系列(五):Routing

在前面的那個簡單日志系統(tǒng)中,我們已經(jīng)學(xué)會如何廣播一條消息。

這篇我們將會講到如何將部分消息發(fā)送到部分queue中。比如,我們會直接將錯誤的關(guān)鍵信息存入硬盤中,同時仍然在控制臺打印所有的日志信息。

Bindings

在前面我們已經(jīng)知道binding是exchange和queue之間的一種關(guān)系(將queue和exchange綁定在一起)。簡單解讀就是:某個queue對某個exchange(的消息)感興趣。

Bindings會引入一個額外的參數(shù)routing_key。為了避免混淆Channel.Publish里面的參數(shù),這里我們把它稱為binding key。

綁定key的意義取決于exchange type。之前我們用fanout exchange時,忽略了他的價值。

Direct exchange

之前我們的那個日志系統(tǒng)是將所有的消息廣播到所有的consumer,現(xiàn)在我們想根據(jù)日志的等級過濾部分消息。比如我們只想將error的日志存入硬盤,而不想將warning和info的日志存入硬盤。

fanout exchange并不是那樣的靈活,不能滿足我們的需求,因此這里我們需要使用direct exchange來代替,direct exchange的路由規(guī)則很簡單:binding key和routing key匹配時,消息將會被發(fā)送至queue中。

注:

(1)routing key是Channel.Publish是程序告訴exchange這條消息該發(fā)送到哪里。

(2)binding key是exchange和queue之間binding的名字。

(3)當(dāng)routing key和binding key相等時,exchange就知道根據(jù)binding key去將這條消息分發(fā)到下面的queue中;如果程序中的routing key的值不等于任何一個binding key,那么這條message即使發(fā)送至了exchange,由于沒有匹配的binding key,所以不能發(fā)送到任何一個queue中,最終的結(jié)果導(dǎo)致這條消息會被丟棄。

從這個流程圖中可知,direct exchange x上綁定了兩個queue,第一個queue的binding key是orange,第二個是black和green。

當(dāng)發(fā)送一個消息至x時使用的routing key為orange,那么這條消息將會被分發(fā)到Q1,如果routing key為black或green,將會被分發(fā)到Q2,其他的消息將會被忽略丟失。

Multiple bindings

這是用相同的binding key綁定多個queue的完美解決方案。在這里樣例中,我們可以在x和Q1之間增加binding key:black。direct exchange會表現(xiàn)得像fanout exchange一樣廣播所有的消息到匹配的queue中。routing key為black的消息將會被分發(fā)到Q1和Q2中。

Emitting logs

我們將會在我們的日志系統(tǒng)中使用這種模式。以日志的嚴(yán)重性作為routing key。這樣,接收腳本就能根據(jù)日志嚴(yán)重性接收自己想要接收的。

先看看發(fā)送消息端的代碼:

聲明一個exchange并發(fā)送消息

為了簡化樣例,假設(shè)日志錯誤等級只有"info","warning","error"。

Subscribing

接收message的代碼和前面樣例很相似,不過我們得做些修改以方便receiver.go在啟動時可以從命令行參數(shù)設(shè)置binding。

命令行設(shè)置binding參數(shù)。[info] [warning] [error]

接下來是receiver.go接收信息

現(xiàn)在我們啟動兩個receiver.go程序,但是他們的binding參數(shù)不同:

一個程序只關(guān)心error的日志,以將它存入disk:

另一個程序則關(guān)心info,warining和error的日志,以在控制臺打?。?/p>

這樣queue與exchange的binding結(jié)構(gòu)就是這樣的:

圖源于官網(wǎng),只是queue的隨機(jī)名不同罷了

現(xiàn)在我們在sender.go發(fā)送兩條消息,分別是info等級的和error等級的

看下C1(只binding了error)端的打印結(jié)果

以及C2(binding了info,warning和error)端的打印結(jié)果

再看下RabbitMQ Server的監(jiān)控頁面

binding了info,warning和error的queue:

只binding了error的queue:

這樣就完成了將日志按等級分類的做法,在現(xiàn)在開發(fā)中若需要將Message分類,用binding功能就是個不錯的選擇。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容