RabbitMQ是個訊息仲介(broker),主要是利用消息把生產者跟消費者解耦合
在RabbitMQ主要有以下角色
- 產生者(producer)
- 接收者(consumer)
- 佇列(Queue)
- 交換器(Exchange)
- 訊息(Message)
上面太抽象? 讓我來舉一個簡單點的例子
我們要寄信會把信投進郵筒,信件統一送到郵局,由分配至各個區域郵差去寄送信件
在此可把上面的角色對應在RabbitMQ上
- 產生者(producer)= 寄信人
- 接收者(consumer) = 收件人
- 佇列(Queue)= 郵差
- 交換器(Exchange) = 郵筒
- 訊息(Message) = 信件
RabbitMQ 腳色簡圖
- 產生者(P)
- 接收者(C)
- 佇列(Queue)
- 交換器(E)
[中間黑框]是RabbitMQ (Broker) 幫助 (P)和(C) 解耦合
Exchange 概念
生產者發送訊息時會經由Exchange來決定要給哪個Queue.
Exchange分發訊息根據類型的不同分發策略有區別
目前共四種類型:
- Direct
- Fanout
- Topic
- Headers
Direct
生產者傳送訊息中 RouteKey 必須跟 Queue binding key 一致 Exchange才會把資料送到Queue中.
如果一個Queue binding 到 Exchange 要求路由鍵為 "Daniel",只接收 Routing key 是 “Daniel”的訊息,不會轉發“Daniel1”,RouteKey需完全匹配.
使用 Direct 交換器 可當作寄信需要 RouteKey (標註) 要由哪個 Queue (郵差)接收轉送此訊息,Queue (郵差)會藉由此 RouteKey (標註) 找到相對應消費者
Fanout
fanout 交換器不處理Route Key,簡單來說就是輪流把消息放進每個Queue中.
使用 fanout 交換器 把 信件(Message) 給 所有 郵差(Queue) 每個消費者都會收到此 信件(Message)
在現實生活中有點類似經由 fanout交換器 (郵筒) 將傳單夾入所有信件中讓郵差發給所有人
Topic
Topic交換器和 Direct 交換器都需要查看 來分配訊息(RouteKey)和Binding中的binding key是否一致,但Topic交換器使用部分匹配比Direct 交換器多了更多彈性。
Topic交換器提供兩種方式
- # 匹配0個或多個單字
- * 匹配不多不少一個單字
例如 有兩個Queue (binding key)分別是 App.# 和 App.*
經由Topic交換器分配一個訊息RouteKey是 App.Daniel 則都會將資料塞入兩個 Queue (binding key) 為 App.# 和 App.*
但如果另一個訊息RouteKey是 App .Daniel.Test 只會塞入 Queue (binding key) 為 App.# ,另一個 Queue (binding key) 是 App.* 不被匹配
在現實生活中有點類似 發送 信件(Message) 經由 Topic交換器 (郵筒) 會依照上面的區域 (例如台北縣,宜蘭縣) 來分配相對應的區域信件轉交給 Queue (郵差) 給消費者
參考來源:
https://www.jianshu.com/p/79ca08116d57
如果本文對您幫助很大,可街口支付斗內鼓勵石頭^^