RabbitMQ 是一個基于 AMQP(Advanced Message Queuing Protocol) 協議的開源消息中間件,RabbitMQ的整體架構圍繞消息的生產、路由、存儲和消費設計,旨在實現高效、可靠的消息傳遞,它由多個核心組件協同工作。
核心組件
1. 生產者(Producer)
- 負責創建并向RabbitMQ服務器發送消息。消息可以包含任意數據(如 JSON、文本、二進制等。生產者不直接將消息發送到隊列,而是通過交換機進行消息的路由。
2. 交換機(Exchange)
- 接收生產者發送的消息,并根據路由規則將消息轉發到一個或多個隊列。交換機不存儲消息,如果沒有匹配的隊列,消息可能會被丟棄(取決于具體配置)。交換機的類型決定路由行為:
- 類型:
- Direct Exchange:精確匹配,根據消息的路由鍵(routing key)進行匹配。如果路由鍵與綁定隊列時指定的鍵完全匹配,消息就會被發送到該隊列。比如在一個物流系統中,根據訂單的配送地區作為路由鍵,將訂單消息發送到對應地區的處理隊列。
- Topic Exchange:支持通配符匹配的路由規則。使用
*
匹配一個單詞,#
匹配零個或多個單詞。比如在日志監控系統中,以系統名稱(如order.*
、user.#
)作為路由規則,將不同的日志消息發送到相應的隊列。 - Fanout Exchange:將接收到的消息廣播到所有與它綁定的隊列,不考慮路由鍵。適用于廣播消息的場景,如系統通知,所有訂閱通知的隊列都會收到消息。
- Headers Exchange:根據消息的headers屬性進行匹配,而不是路由鍵。這種類型相對較少使用。
3. 隊列(Queue)
- 存儲消息的地方,消費者從隊列中獲取消息進行處理。隊列是RabbitMQ中消息存儲的基本單元,多個消費者可以從同一個隊列中競爭獲取消息。隊列需與交換機通過 Binding Key 綁定,才能接收消息。
- 隊列可以設置持久化(服務器重啟后隊列依然存在)、排他性(僅創建它的連接可見且使用,連接關閉隊列自動刪除)、自動刪除(當所有消費者斷開連接后,隊列自動刪除)等屬性。
4. 消費者(Consumer)
- 從RabbitMQ服務器的隊列中獲取消息并進行處理。消費者可以訂閱一個或多個隊列,當隊列中有新消息時,消費者會收到并處理。
- 可以進行手動確認(ACK)或拒絕(NACK)消息,確保可靠性。
5. 消息代理(Broker)
- 即RabbitMQ服務器本身,它負責接收生產者發送的消息,根據交換機和綁定規則進行消息路由,并為消費者提供消息。Broker管理著交換機、隊列、綁定等各種資源,并保證消息的可靠傳遞。
- 集群模式:為了提高可靠性和性能,RabbitMQ可以組成集群。集群中的節點可以共享隊列、交換機等資源,當某個節點出現故障時,其他節點可以繼續提供服務。
- 鏡像隊列:是一種特殊的隊列集群方式,隊列會在多個節點上進行鏡像備份,確保即使某個節點故障,消息仍然可用。
輔助組件
1. 綁定(Binding)
- 建立交換機和隊列之間的關聯關系。通過綁定,交換機知道應該將哪些消息發送到哪個隊列。綁定可以指定一個路由鍵(在Direct和Topic交換機中),用于更精確的消息路由。
2. 連接與信道(Connection & Channel)
- Connection:生產者/消費者與 Broker 之間的 TCP 連接。
- Channel:復用連接中的邏輯通道,避免頻繁創建 TCP 連接的開銷。
3. 虛擬主機(Virtual Host)
- Virtual Host 是 RabbitMQ 中的一個邏輯概念,類似于數據庫中的“數據庫實例”。每個虛擬主機都有自己獨立的交換機、隊列、綁定等資源,它們之間相互隔離。虛擬主機為多租戶環境提供了支持,不同的應用或用戶可以在各自的虛擬主機中進行消息傳遞,互不干擾。
- 比如云服務提供商,可以為每個租戶分配一個獨立的虛擬主機,每個租戶在自己的虛擬主機內管理自己的消息隊列系統,不用擔心與其他租戶的資源沖突。
架構特點
- 解耦生產與消費
- 生產者無需知道消費者的存在,通過交換機和隊列實現松耦合。
- 靈活的路由機制
- 通過交換機類型和綁定規則支持多種消息分發模式(點對點、發布訂閱等)。
- 可靠性保證
- 支持消息持久化、手動確認(ACK)、死信隊列(Dead Letter Queue)等機制。
- 擴展性
- 支持集群部署、鏡像隊列(高可用)、負載均衡。