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_key
爲fast.rabbit.white
,那麼帶有這樣binding_key
的幾個隊列都會接收這條消息:
- fast..
- ..white
- fast.#
- ……
這個圖是網上找的,感覺對主題交換機的描述比較到位:
主題交換機
當一個隊列的綁定鍵爲#
的時候,這個隊列將會無視消息的路由鍵,接收所有的消息。
首部交換機
首部交換機是忽略routing_key
的一種路由方式。路由器和交換機路由的規則是通過Headers
信息來交換的,這個有點像HTTP
的Headers
。將一個交換機聲明成首部交換機,綁定一個隊列的時候,定義一個Hash
的數據結構,消息發送的時候,會攜帶一組hash數據結構的信息,當Hash
的內容匹配上的時候,消息就會被寫入隊列。
綁定交換機和隊列的時候,Hash結構中要求攜帶一個鍵“x-match”,這個鍵的Value
可以是any
或者all
,這代表消息攜帶的Hash
是需要全部匹配(all),還是僅匹配一個鍵(any)就可以了。相比直連交換機,首部交換機的優勢是匹配的規則不被限定爲字符串(string)。
--轉載