RabbitMQ 的架構設計
Kafka、RocketMq、ActiveMQ、RabbitMQ 和 Apache Pulsar 都是現在使用的比較多的主流 MQ,下面我們來介紹 RabbitMQ 的架構設計。
RabbitMQ 使用 Erlang 語言開發消息隊列系統,基於 AMQP 協議(高級消息隊列協議)實現的一個開源的消息中間件,它允許應用程序之間進行異步通信,並且 RabbitMQ 提供了一種高效、可擴展、可靠的消息傳遞機制。
1、RabbitMQ 的架構
RabbitMQ 有生產者和消費者,並且生產者和消費者之間是通過 RabbitMQ Server 來進行連接的,這樣的異步通訊方式使得生產者和消費者之間沒有強關聯,RabbitMQ 的架構圖如下所示:
RabbitMQ 中有虛擬機(Virtual Host),虛擬機的作用是在一個完整的微服務架構可以使用同一個套 RabbitMQ 服務,在不同的微服務之間是根據虛擬機來進行區分的,如訂單系統使用一個虛擬機,商品系統使用自己的虛擬機,這樣不同的微服務使用它自己的虛擬機即可。
同時虛擬機與虛擬機之間的數據是相互隔離,並不會互相產生影響,在虛擬機裏面就存在了交換機(Exchange)和隊列(queue)。
RabbitMQ 與生產者、消費者之間的連接是通過多個信道實現的,信道是建立在 Connection 之上的虛擬連接,當應用程序與 RabbitMQ Broker 建立 TCP 連接的時候,客戶端緊接着可以創建一個 AMQP 信道 (Channel),每個信道都會被指派一個唯一的 ID,RabbitMQ 是使用長連接來處理請求。
2、RabbitMQ 的組件
2.1 生產者
生產者是消息的發送方,它主要是負責產生併發送消息到 RabbitMQ,生產者通常將消息發送到交換機(Exchange),如下圖所示:
爲什麼 RabbitMQ 將消息發送到交換機呢?假設 RabbitMQ 直接將消息投遞到隊列,如下圖所示:
在電商系統中如果用戶支付成功之後,需要通知訂單系統修改訂單的訂單狀態,通知商品系統扣減商品的庫存,此時支付系統的作爲消息的生產者就需要通知消費者訂單系統和商品系統。
如果採用直接將消息發送給隊列的方式,由於訂單系統、商品系統是消費的不同的隊列,此時支付系統就需要發送兩條訂單支付成功的 MQ 消息,爲了解決這樣的問題,在 RabbitMQ 裏面通常是先將消息發送到交換機,然後交換機再分發到不同的 queue 中。
2.2 交換機
交換機(Exchange)是消息的分發中心,負責將接收到的消息路由到一個或多個隊列,如下圖所示:
交換機定義了消息的傳遞規則,可以根據規則將消息發送到一個或多個隊列上,如下是 RabbitMQ 的交換機類型:
(1)直連交換機 (Direct Exchange):將消息路由到與消息中的路由鍵(Routing Key) 完全匹配的隊列。生產者在發送消息的時候可以添加一個 routing key,同時在隊列中也會設置一個 key,如果這兩個 key 完全匹配上了,纔會將消息路由到這個隊列中。
(2)主題交換機 (Topic Exchange):根據通配符匹配路由鍵,將消息路由到一個或多個隊列。
(3)扇出交換機 (Fanout Exchange):將消息廣播到所有與交換機綁定的隊列,忽略路由鍵。
(4)頭部交換機 (Headers Exchange):根據消息頭中的屬性進行匹配,將消息路由到與消息頭匹配的隊列。現在使用的比較少,因爲它的性能比較低。
RabbitMQ 的交換機推薦使用直連交換機和主題交換機和扇出交換機。
2.3 隊列
消息隊列介於生產者和消費者,本質上就是一個類似鏈表的獨立進程,列表裏的每個節點是一個消息,如下圖所示:
實際的業務中,消息也分很多種類,如訂單消息、用戶消息、支付消息等等,爲了更好的管理不同種類的消息數據進而提供多個隊列,生產者生產的消息根據需要被投遞到不同的隊列中。同時每個隊列都設計爲獨立的進程,某個進程掛了後不影響其他進程正常工作,如下圖所示:
消息最終會被消費者從隊列中取出並處理,每個隊列不僅有一個名稱,並且可以綁定到一個或多個交換機。
2.4 消費者
消費者是消息的接收方,負責從隊列中獲取消息並進行處理。消費者通過訂閱隊列來接收消息。
2.5 綁定
綁定是交換機和隊列之間的關聯關係。生產者將消息發送到交換機,隊列通過綁定與交換機關聯,從而接收到消息,如下圖所示:
2.6 虛擬主機
虛擬主機是 RabbitMQ 的基本工作單元,每個虛擬主機擁有自己獨立的用戶、權限、交換機、隊列等資源,完全隔離於其他虛擬主機。
2.7 連接
連接是指生產者、消費者與 RabbitMQ 之間的網絡連接。每個連接可以包含多個信道 (Channel),每個信道是一個獨立的會話通道,可以進行獨立的消息傳遞。
3、RabbitMQ 的消息生產和消費過程
RabbitMQ 中生產者通過長鏈接的方式連接到 Broker,然後生產的消息被髮送到對應的交換機上,此時交換機會將消息發送到對應的隊列上存儲,最後消費者就會來拉取消息來進行處理,處理成功之後就會將這個消息進行移除。
本文由 Readfog 進行 AMP 轉碼,版權歸原作者所有。
來源:https://mp.weixin.qq.com/s/PdyZ7L9lPsd_iNDuk72wNA