天天看點

RabbitMQ (消息隊列)專題學習05 routing(路由)

(使用java用戶端)

一、概述

在前面的學習中,建構了一個簡單的日志記錄系統,能夠廣播所有的日志給多個接收者,在該部分學習中,将添加一個新的特點,就是可以隻訂閱一個特定的消息源,也就是說能夠直接把關鍵的錯誤日志消息發送到日志檔案儲存起來,不重要的日志資訊檔案不儲存在磁盤中,但是仍然能夠在控制台輸出,那麼這便是我們這部分要學習的消息的路由分發機制。

二、路由功能實作

2.1、綁定(bindings)

在前面的學習中已經建立了綁定(bindings),代碼如下:

一個綁定就是一個關于exchange和queue的關系,它可以簡單的被了解為:隊列是從這個exchange中擷取消息的。

綁定可以采取一個額外的routingkey的參數,為了避免與basicpublish參數沖突,稱之為一個綁定key,這是如何建立一個帶routingkey的綁定的關鍵。

一個綁定key依賴于exchange的類型,像之前使用fanout類型的exchange,完全忽略了該綁定key的值。

2.2、直接交換(direct exchange)

前面實作的日志記錄系統中廣播所有的消息給所有的消費者,現在對其進行擴充,允許根據資訊的嚴重程度來對消息進行過濾,比如,希望一個程式寫入到磁盤的日志消息隻接收錯誤的消息,而不是浪費磁盤儲存所有的日志消息。

為了實作這個目标,使用一個fanout類型的exchange,顯然是不能夠滿足這樣的需求的,因為它隻能廣播所有的消息。

為此将使用一個direct exchange來代替fanout exchange,direct exchange使用簡單的路由算法,将消息通過綁定的key比對将要到達的隊列。

RabbitMQ (消息隊列)專題學習05 routing(路由)

圖-1

從上面的結構圖中可以看出direct exchange x綁定着兩個queue(q1,q2),第一個queue綁定的routingkey為orange,第二個有兩個routingkey被綁定,一個routingkey為black,另外一個routingkey為green.

說明:發送帶有routingkey為orange的消息到x(exchange)中,x将該消息路由到q1中,發送帶有routingkey為black和green的消息都将被路由到q2中,其他所有消息将會被丢棄。

2.3、多綁定(multiple bindings)

RabbitMQ (消息隊列)專題學習05 routing(路由)

圖-2

多個隊列綁定相同的routingkey是允許的,在上述執行個體中,可以把x和q1用routingkey:black綁定起來,這種情況下,direct exchange将像fanout類型的exchange一樣會将消息廣播都到所有比對的queues中,即一個routingkey為black的消息将會被發送到q1和q2中。

2.4、發送的日志

使用direct代替fanout類型的exchange,發送消息到一個direct exchange中,将根據消息的重要程度作為routingkey,這樣接收程式能夠選擇它想要接收的日志資訊,首先必須先建立一個exchange.

其次,發送一條資訊:

為了簡化程式,将severity設定為info、warning、error三種類型中的一種。

2.5、訂閱消息(subscribing message)

接收者根據自己感興趣的severity來建立一個新到的綁定。

2.6、代碼實作

RabbitMQ (消息隊列)專題學習05 routing(路由)

圖-3

emitlogdirect.java代碼清單如下:

receivelogsdirect代碼清單如下:

2.7、測試routing

根據上述代碼清單,接收者我們需要做一些修改,改為receivelogsdirectinfo、receivelogsdirectwarning、receivelogsdirectall、receivelogsdirecterror,分别用來接收消息、警告、所有、錯誤等類型的消息。

1、分别啟動receivelogsdirectinfo、receivelogsdirectwarning、receivelogsdirectall、receivelogsdirecterror類。

RabbitMQ (消息隊列)專題學習05 routing(路由)

2、啟動emitlogdirect類,此時serverity類型為info。

RabbitMQ (消息隊列)專題學習05 routing(路由)

此時隻有receivelogsdirectinfo和receivelogsdirectall接收到了資訊。

RabbitMQ (消息隊列)專題學習05 routing(路由)

其他的兩個類型的接收者沒有接收到消息:

RabbitMQ (消息隊列)專題學習05 routing(路由)

其他兩種類型的消息不再示範,有興趣的朋友下載下傳源碼自己研究。隻要将emitlogdirect類稍微改造一下代碼即可。

消息發送者會根據serverity類型來将要發送的消息路由到指定的隊列中,消費者會同樣根據指定的serverity類型比對對應的queue中取出相對應的消息。達到了準确的路由消息傳遞功能。

源碼下載下傳: