RabbitMQ的四種交換機

RabbitMQ作爲一個消息隊列提供一個通用的消息發送和接收平臺,並且保證消息在傳輸過程中的安全可靠

消息(Message)由Client發送,RabbitMQ接收到消息之後通過交換機轉發到對應的隊列上面。Worker會從隊列中獲取未被讀取的數據處理。

消息處理的過程

交換機

有4種不同的交換機類型:

  • 直連交換機:Direct exchange
  • 扇形交換機:Fanout exchange
  • 主題交換機:Topic exchange
  • 首部交換機:Headers exchange

 

扇形交換機

扇形交換機是最基本的交換機類型,它所能做的事情非常簡單———廣播消息。扇形交換機會把能接收到的消息全部發送給綁定在自己身上的隊列。因爲廣播不需要“思考”,所以扇形交換機處理消息的速度也是所有的交換機類型裏面最快的。

扇形交換機

直連交換機

直連交換機是一種帶路由功能的交換機,一個隊列會和一個交換機綁定,除此之外再綁定一個routing_key,當消息被髮送的時候,需要指定一個binding_key,這個消息被送達交換機的時候,就會被這個交換機送到指定的隊列裏面去。同樣的一個binding_key也是支持應用到多個隊列中的。

這樣當一個交換機綁定多個隊列,就會被送到對應的隊列去處理。

直連交換機

適用場景:有優先級的任務,根據任務的優先級把消息發送到對應的隊列,這樣可以指派更多的資源去處理高優先級的隊列。

主題交換機

直連交換機的routing_key方案非常簡單,如果我們希望一條消息發送給多個隊列,那麼這個交換機需要綁定上非常多的routing_key,假設每個交換機上都綁定一堆的routing_key連接到各個隊列上。那麼消息的管理就會異常地困難。

所以RabbitMQ提供了一種主題交換機,發送到主題交換機上的消息需要攜帶指定規則的routing_key,主題交換機會根據這個規則將數據發送到對應的(多個)隊列上。

主題交換機的routing_key需要有一定的規則,交換機和隊列的binding_key需要採用*.#.*.....的格式,每個部分用.分開,其中:

  • *表示一個單詞
  • #表示任意數量(零個或多個)單詞。

假設有一條消息的routing_keyfast.rabbit.white,那麼帶有這樣binding_key的幾個隊列都會接收這條消息:

  1. fast..
  2. ..white
  3. fast.#
  4. ……

這個圖是網上找的,感覺對主題交換機的描述比較到位:

主題交換機

當一個隊列的綁定鍵爲#的時候,這個隊列將會無視消息的路由鍵,接收所有的消息。

首部交換機

首部交換機是忽略routing_key的一種路由方式。路由器和交換機路由的規則是通過Headers信息來交換的,這個有點像HTTPHeaders。將一個交換機聲明成首部交換機,綁定一個隊列的時候,定義一個Hash的數據結構,消息發送的時候,會攜帶一組hash數據結構的信息,當Hash的內容匹配上的時候,消息就會被寫入隊列。

綁定交換機隊列的時候,Hash結構中要求攜帶一個鍵“x-match”,這個鍵的Value可以是any或者all,這代表消息攜帶的Hash是需要全部匹配(all),還是僅匹配一個鍵(any)就可以了。相比直連交換機,首部交換機的優勢是匹配的規則不被限定爲字符串(string)。

--轉載

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