【朝夕技術專刊】RabbitMQ路由解析(上篇)

朝夕Net社群發表於2020-06-02

歡迎大家閱讀《朝夕Net社群技術專刊》

我們致力於.NetCore的推廣和落地,為更好的幫助大家學習,方便分享乾貨,特創此刊!很高興你能成為忠實讀者,文末福利不要錯過哦!

 

上篇文章介紹瞭如何在C#控制檯基於RabbitMQ搭建生產者,消費者。這篇文章將會持續進階RabbitMQ的使用;這裡將會給大家聊聊RabbitMQ中的路由;

什麼是路由呢?就和你們家裡的路由器是一個概念,路由器就是把網路訊號做轉發、那麼RabbitMQ中的路由,就是把訊息做轉發;在本篇文章中,如果出現圖片不清晰的,請關注朝夕教育公眾號可獲取關於RabbitMQ的視訊錄播學習;

RabbitMQ一共提供了四種路由:

Ø Direct型別

Ø Fanout型別

Ø Topic型別

Ø Header型別

 


01PARTDirect型別的路由:

 

 

上一篇文章中寫的RabbitMQ的基本應用案例中使用的Exchange就是direct型別的,direct型別的exchange路由規則很簡單:

exchange在和queue進行binding時會設定routingkey(為了避免和下邊的routingKey混淆,很多時候把這裡的routingKey叫做BindingKey)

 

channel.QueueBind(queue:"Q1",exchange:"myexchange",routingKey:"orange");將訊息傳送到Broker時會設定對應的routingkey:channel.BasicPublish(exchange:"myexchange",routingKey:"orange",basicProperties: null, body: body);

 

只有RoutingKey和BindingKey完全相同時,exchange才會把訊息路由到繫結的queue中去

 

我們知道了direact型別的交換機只有routingKey和bindingKey相同的時候才會進行訊息路由,根據這一特點我們可以通過routingKey將訊息路由到不同的queue中。如在進行日誌處理時,需求是所有的日誌都儲存到文字檔案,出現錯誤日誌時則還需要簡訊通知以便及時處理。

 

我們可以建立兩個佇列:只接收錯誤日誌的log_error佇列和接收所有日誌資訊的log_all佇列。消費者C1處理log_error佇列中訊息,將這些訊息通過簡訊通知管理員,消費者C2處理log_all佇列的資訊,將這些資訊記錄到文字檔案。如下圖所示:

 

 

 

生產者用於傳送日誌訊息,程式碼下圖所示:

 

 

如果圖片不清晰,請關注朝夕net社群微信公眾號獲取視訊錄播

 

消費者C1用於處理log_error佇列中的訊息,錯誤訊息進行簡訊通知,程式碼如下:

 

 

 

消費者C2用於處理log_all佇列中的訊息,所有訊息記錄到文字檔案中,程式碼下圖所示:

 

 

 

生產者,消費者同時執行起來,結果如圖6:

 

 

 

 


02PARTFonout型別的路由:

fanout型別的exchange路由規則是最簡單的,交換機會把訊息廣播到與該Exchange繫結的所有queue中,即所有和該exchange繫結的佇列都會收到訊息。fanout型別exchange和佇列繫結時不需要指定routingKey,即使指定了routingKey也會被忽略掉。路由結構如下圖:

 

 

fanout型別交換機主要用於釋出/訂閱的一些場景,如使用者註冊了我們的網站後,我們通過簡訊和郵件兩種方式通知使用者;

 

程式碼如下圖:

這裡通過程式碼簡單演示將訊息同時使用簡訊和郵件兩種方式通知使用者的流程。首先宣告一個fanout型別的exchange,然後宣告兩個佇列 SMSqueue和EMAILqueue,這兩個佇列都和這個exchange繫結。消費者1處理EMAILqueue的訊息,通過郵件方式傳送通知;消費者2處理SMSqueue的訊息通過簡訊方式傳送通知。

生產者程式碼:

 

 

 

消費者1將EMAILqueue的訊息通過郵件方式傳送通知,程式碼如下圖:

 

 

 

消費者2將SMSqueue的訊息通過簡訊方式傳送通知,程式碼如下圖:

 

 

啟動這三個應用程式,執行結果如下圖

 

相關文章