RabbitMQ 的四種Exchange?

   引言

     從機制上來講,rabbitmq也有queue和topic的概念,發消息的時候還要指定消息的key,這個key之後會做路由鍵用。但是,多了一個概念叫做交換器exchange。exchange有四種,direct、fanout、topic、header。也就是說,發消息給rabbitmq時,消息要有一個key,並告訴他發給哪個exchange。exchange收到之後,根據key分發或者廣播給queue。消費者是從queue裏拿消息的,並接觸不到交換機。

     在rabbitmq裏,有各種默認行爲,如果我們不指定exchange,會有個默認的direct類型的exchange,如果不指定隊列和交換器的綁定關係,默認就按消息的key綁定對應的queue。此時發一個消息,消息的key是什麼,就會被默認交換器送給對應的queue。

    fanout交換器。實際上就是廣播,發送到fanout交換器的消息,會被轉發給所有和這個交換器綁定的隊列。通常我們把隊列搞成臨時的,這樣就解耦了。

    總體來說fanout其實就是direct交換器實現的。把兩個queue都綁定到direct,綁定的時候指定同一個key,就變成fanout交換器了。

   topic型交換器的邏輯和direct型很相像——消息發送時會指定一個特別的路由鍵,並且會被路由到所有與綁定鍵相匹配的隊列。不過對綁定鍵有兩種特殊類型:*號和#號

    head交換器貌似是通過消息附帶的頭信息headers來路由的,不過官方對這個介紹的少之又少,平時也應該沒什麼人用,死信隊列貌似依賴於這個。

    最新版本的RabbitMQ有四種交換機類型,分別是Direct exchange、Fanout exchange、Topic exchange、Headers exchange。

1: Direct Exchange(直連)

    處理路由鍵。需要將一個隊列綁定到交換機上,要求該消息與一個特定的路由鍵完全匹配。這是一個完整的匹配。如果一個隊列綁定到該交換機上要求路由鍵 “abc”,則只有被標記爲“abc”的消息才被轉發,不會轉發abc.def,也不會轉發dog.ghi,只會轉發abc。


 

 

2: Fanout Exchange(扇形)

    不處理路由鍵。你只需要簡單的將隊列綁定到交換機上。一個發送到交換機的消息都會被轉發到與該交換機綁定的所有隊列上。很像子網廣播,每臺子網內的主機都獲得了一份複製的消息。Fanout交換機轉發消息是最快的。

 

3: Topic Exchange(主題)

   將路由鍵和某模式進行匹配。此時隊列需要綁定要一個模式上。符號“#”匹配一個或多個詞,符號“”匹配不多不少一個詞。因此“abc.#”能夠匹配到“abc.def.ghi”,但是“abc.” 只會匹配到“abc.def”。

  綁定鍵有兩種特殊類型:

  • *符號用來代替任意單詞
  • #符號可以代替0個或多個單詞

 備註:

      Topic型交換器比較強大跟其它交換器很相似。

       當一個隊列以”#”作爲綁定鍵時,它將接收所有消息,而不管路由鍵如何,類似於fanout型交換器。

       當特殊字符”*”、”#”沒有用到綁定時,topic型交換器就好比direct型交換器了。

 

4: Headers Exchanges

   不處理路由鍵。而是根據發送的消息內容中的headers屬性進行匹配。在綁定Queue與Exchange時指定一組鍵值對;當消息發送到RabbitMQ時會取到該消息的headers與Exchange綁定時指定的鍵值對進行匹配;如果完全匹配則消息會路由到該隊列,否則不會路由到該隊列。headers屬性是一個鍵值對,可以是Hashtable,鍵值對的值可以是任何類型。而fanout,direct,topic 的路由鍵都需要要字符串形式的。

匹配規則x-match有下列兩種類型:

  x-match = all :表示所有的鍵值對都匹配才能接受到消息

  x-match = any :表示只要有鍵值對匹配就能接受到消息

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章