1. 程式人生 > >rabbitmq系列四 之主題交換機

rabbitmq系列四 之主題交換機

靈活 操作 執行 兔子 其中 ont 他還 消息 有關

1、主題

  在前面的例子中,我們對日誌系統進行了改進。使用了direct交換機代替了fanout交換機,從只能盲目的廣播消息改進為有可能選擇性的接收日誌。

  盡管直接交換機能夠改善我們的日誌系統,但是它也有它的限制——沒辦法基於多個標準執行路由操作。

  在我們的日誌系統中,我們不只希望訂閱基於日誌級別,同時還希望訂閱基於日誌來源。其中unix工具syslog是同時基於日誌的級別(info/warn/error)和設備-facility (auth/cron/kern...)來路由日誌的。

  如果這樣的話,將會給予我們非常大的靈活性,我們既可以監聽來源於“cron”的嚴重程度為“critical errors”的日誌,也可以監聽來源於“kern”的所有日誌。

  為了實現這個目的,接下來我們學習如何使用另一種更復雜的交換機 —— 主題交換機。

2、主題交換機

  發送到主題交換機(topic exchange)的消息不可以攜帶隨意什麽樣子的路由鍵(routing_key),它的路由鍵必須是一個由.分隔開的詞語列表。這些單詞隨便是什麽都可以,但是最好是跟攜帶它們的消息有關系的詞匯。以下是幾個推薦的例子:"stock.usd.nyse", "nyse.vmw", "quick.orange.rabbit"。詞語的個數可以隨意,但是不要超過255字節。

  綁定鍵也必須擁有同樣的格式。主題交換機背後的邏輯跟直連交換機很相似 —— 一個攜帶著特定路由鍵的消息會被主題交換機投遞給綁定鍵與之想匹配的隊列。但是它的綁定鍵和路由鍵有兩個特殊應用方式:

    * (星號) 用來表示一個單詞.

     # (井號) 用來表示任意數量(零個或多個)單詞

  下邊用圖說明:

                  技術分享圖片

  這個例子裏,我們發送的所有消息都是用來描述小動物的。發送的消息所攜帶的路由鍵是由三個單詞所組成的,這三個單詞被兩個.分割開。路由鍵裏的第一個單詞描述的是動物的手腳的利索程度,第二個單詞是動物的顏色,第三個是動物的種類。所以它看起來是這樣的: <celerity>.<colour>.<species>

  我們創建了三個綁定:Q1的綁定鍵為 *.orange.*,Q2的綁定鍵為 *.*.rabbit

lazy.#

這三個綁定鍵被可以總結為:

    Q1 對所有的桔黃色動物都感興趣。

    Q2 則是對所有的兔子所有懶惰的動物感興趣。

  一個攜帶有 quick.orange.rabbit 的消息將會被分別投遞給這兩個隊列。攜帶著 lazy.orange.elephant 的消息同樣也會給兩個隊列都投遞過去。另一方面攜帶有 quick.orange.fox 的消息會投遞給第一個隊列,攜帶有 lazy.brown.fox 的消息會投遞給第二個隊列。攜帶有 lazy.pink.rabbit 的消息只會被投遞給第二個隊列一次,即使它同時匹配第二個隊列的兩個綁定。攜帶著 quick.brown.fox 的消息不會投遞給任何一個隊列。

  如果我們違反約定,發送了一個攜帶有一個單詞或者四個單詞("orange" or "quick.orange.male.rabbit")的消息時,發送的消息不會投遞給任何一個隊列,而且會丟失掉。

  但是另一方面,即使 "lazy.orange.male.rabbit" 有四個單詞,他還是會匹配最後一個綁定,並且被投遞到第二個隊列中。

  註意:

  主題交換機是很強大的,它可以表現出跟其他交換機類似的行為

  當一個隊列的綁定鍵為 "#"(井號) 的時候,這個隊列將會無視消息的路由鍵,接收所有的消息。

  當 * (星號) 和 # (井號) 這兩個特殊字符都未在綁定鍵中出現的時候,此時主題交換機就擁有的直連交換機的行為。

3、組合在一起

  接下來我們會將主題交換機應用到我們的日誌系統中。在開始工作前,我們假設日誌的路由鍵由兩個單詞組成,路由鍵看起來是這樣的:<facility>.<severity>。

  代碼跟上一篇教程差不多。

rabbitmq系列四 之主題交換機