RabbitMQ是實現AMQP(高級消息隊列協議)的消息中間件的一種,最初起源於金融系統,用於在分布式系統中存儲轉發消息,在易用性、擴展性、高可用性等方面表現不俗。消息中間件主要用於組件之間的解耦,消息的發送者無需知道消息使用者的存在,反之亦然。
消息(Message)由Client發送,RabbitMQ接收到消息之后通過交換機轉發到對應的隊列上面。Worker會從隊列中獲取未被讀取的數據處理。
交換機
RabbitMQ包含四種不同的交換機類型:
Direct exchange:直連交換機,轉發消息到routigKey指定的隊列
Fanout exchange:扇形交換機,轉發消息到所有綁定隊列(速度最快)
Topic exchange:主題交換機,按規則轉發消息(最靈活)
Headers exchange:首部交換機 (未接觸)
Fanout扇形交換機
扇形交換機是最基本的交換機類型,它做的事情很簡單--廣播信息。Fanout交換機會把接收到的消息全部轉發到綁定的隊列上。因為廣播不需要“思考”,所以Fanout交換機是四種交換機中速度最快的。
適用場景:需要隨時增加減少業務處理的隊列,例如注冊、下單等功能需要增加送積分功能,只需要增加一個綁定到交換機的隊列去處理新業務,無需修改舊的業務邏輯,從而達到業務解耦,非常容易擴展。
Direct直連交換機:
直連交換機是一種帶路由功能的交互機,一個隊列通過routing_key與一個交換機綁定,當消息被發送的時候,需要指定一個routing_key,這個消息被送達交換機的時候,就會被交換機送到指定的隊列里面去。同樣一個routing_key也是支持應用到多個隊列中的,當一個交換機綁定多個隊列時,消息就會被送到對應的隊列去處理。
適用場景:有優先級的任務,根據任務的優先級把消息發送到對應的隊列,這樣可以指派更多的資源去處理高優先級的隊列。
Topic主題交換機:
直連交換機的routing_key方案非常簡單,如果我們希望一條消息發送給多個隊列,那么這個交換機需要綁定上非常多的routing_key,假設每個交換機上都綁定一堆的routing_key連接到各個隊列上。那么消息隊列的管理就會異常的困難。
所以RabbitMQ提供了一種主題交換機,發送到主題交換機上的消息需要攜帶指定規則的routing_key,主題交換機會根據這個規則將數據發送到對應的(多個)隊列上。
主題交換機的routing_key需要有一定的規則,交換機和隊列的binding_key需要采用*.#.*.....的格式,每個部分用.分開,其中:
*表示一個單詞
#表示任意數量(零個或多個)單詞。
假設有一條消息的routing_key為fast.rabbit.white,那么帶有這樣binding_key的幾個隊列都會接收這條消息:
fast..
..white
fast.#
……
下圖來源於網上,感覺對主題交換機的描述比較到位:
適用場景:消息需要基於多重條件進行路由到達對應隊列,例如:日志系統,不僅可以根據日志的級別而且能根據日志的來源進行訂閱。
---------------------
作者:yeomenChan
來源:CSDN
原文:https://blog.csdn.net/u011466674/article/details/51971180?utm_source=copy
版權聲明:本文為博主原創文章,轉載請附上博文鏈接!
