文章目錄
- RabbitMQ 工作流程
- 流程圖
- Producer 和 Consumer
- Connecting 和 Channel
- Virtual host
- Queue
- Exchange
- RabbitMQ 工作流程
RabbitMQ 工作流程
流程圖
RabbitMQ
就是一個生產者/消費者模型
Producer
就是生產者、Consumer
就是消費者Broker
是RabbitMQ
服務器- 生產者和消費者都是
RabbitMQ
服務器的客戶端
生產者客戶端需要通過 Connection
(連接)來和 RabbitMQ
服務器進行通信;RabbitMQ
服務器要通過 Connection
(連接)來和消費者客戶端進行通信
- 一個
Connection
有多個channel
channel
就是消息傳遞的方式
Brocker
(RabbitMQ
服務器)
- 一個
Brocker
可以有多個虛擬主機(虛擬機) - 多個虛擬機之間是邏輯上的隔離,并不是物理上的隔離
- 每個虛擬機中,會有多個
Exchange
(交換機)和Queue
(隊列)- 消息是先發送到交換機,然后由交換機進行消息的分發,然后到達隊列
- 在
RabbitMQ
服務器收到消息的時候,會帶上一些標簽(消息要發到哪里等等) - 隨后交換機拿到這個消息之后,會根據標簽或者一些設置的信息,把這個消息路由到一個或者兩個隊列
- 如果沒有匹配隊列,交換機就會將此消息丟掉,或者返回給生產者
- 在
- 消息是先發送到交換機,然后由交換機進行消息的分發,然后到達隊列
生產者和消費者使用的不是同一個 Connection
- 這個圖上的
Connection
顯示的是客戶端的連接- 包含生產者和消費者的連接
Producer 和 Consumer
Producer
:生產者,是RabbitMQ Server
的客戶端,向RabbitMQ
發送消息Consumer
:消費者,也是RabbitMQ Server
的客戶端,從RabbitMQ
接收消息Brocker
:就是RabbitMQ Server
,主要是接收和收發消息
-
生產者根據一定的邏輯創建消息,然后把消息發送到
Brocker
里面,發送的這個消息通常是帶有一定的業務邏輯結構的- 比如生產者是一個訂單服務,那發送的就是訂單相關信息
- 訂單
id
- 訂單金額
- 訂單數量
- 支付時間
- …
- 訂單
- 比如生產者是一個用戶注冊信息,那發送的就是用戶相關信息
- 用戶
id
- 用戶年齡
- 用戶性別
- …
- 用戶
- 比如生產者是一個訂單服務,那發送的就是訂單相關信息
-
在生產者發送消息的時候,通常還會帶上一些標簽,
Brocker
在收到消息的時候,交換機會根據這些標簽進行路由,最終把它放到隊列里面
-
消費的時候,標簽就會被丟掉。消費者只會收到消息,并不知道其他信息
- 消費者并不需要知道其他信息,只需要在收到消息之后,進行相應的邏輯處理即可
Connecting 和 Channel
Connection
:連接。是客戶端和RabbitMQ
服務器之間的一個TCP
連接,這個連接是建立消息傳遞的基礎,它負責傳輸客戶端和服務器之間的所有數據和控制信息Channel
:通道,信道。Channel
是在Connection
之上的一個抽象層。在RabbitMQ
中,一個TCP
連接可以有多個Channel
,每個Channel
都是獨立的虛擬連接,消息的發送和接收都是基于Channel
的
通道的主要作用是將消息的讀寫操作復用到一個 TCP
連接上,這樣可以減少建立和關閉連接的開銷,提高性能
Virtual host
Virtual host
:虛擬主機。這是一個虛擬概念,它為消息隊列提供了一種邏輯上的隔離機制,對于RabbitMQ
而言,一個BrokerServer
上可以存在多個Virtual host
。當多個不同的用戶使用同一個RabbitMQ Server
提供的服務時,可以虛擬劃分出多個vhost
,每個用戶在自己的vhost
創建exchange/queue
等
類似于
MySQL
的database
,是一個邏輯上的集合,一個MySQL
服務器可以有多個database
Queue
Queue
:隊列。RabbitMQ
的內部對象,用于存儲消息
消息經過一系列的轉發
- 先通過
Channel
到達Exchange
- 然后通過
Exchange
到達Queue
- 最終存儲的地方就是
Queue
隊列和消費者的關系,是多對多的
- 一個隊列,可以由多個消費者來訂閱
- 一個消費者也可以訂閱多個隊列
Exchange
Exchange
:交換機。message
到達Brocker
的第一站,它負責接收生產者發送的消息,并根據特定的規則把這些消息路由到一個或多個Queue
中
- 消息可能會發給多個隊列
- 可能發給一個隊列
- 也可能沒有隊列
RabbitMQ 工作流程
Producer
生產了一條消息Producer
連接到RabbitMQ Brocker
,建立一個連接(Connection
),開啟一個信道(Channel
)Producer
聲明一個交換機(Exchange
),路由消息Producer
聲明一個隊列(Queue
),存放信息Producer
發送消息至RabbitMQ Brocker
RabbitMQ Brocker
接收消息,并存入相應的隊列(Queue
)里面,如果未找到相應的隊列,則根據生產者的配置,選擇丟棄或者退回給生產者
如果我們把
RabbitMQ
比作一個物流公司,那么它的一些核心概念可以這樣理解:
Brocker
就類似整個物流公司的總部,它負責協調和管理所有的物流站點,確保包裹安全、高效地送達Virtual Host
可以看做是物流公司為不同客戶或業務部門劃分的獨立運營中心。每個運營中心都有自己的倉庫(Queue
),分揀規則(Exchange
)和運輸路線(Connection
和Channel
),這樣可以確保不同客戶的包裹處理不會相互干擾,同時提供定制化的服務Exchange
就像是站點里的分揀中心。當包裹到達時,分揀中心會根據包裹上的標簽來決定這個包裹應該送往那個目的地(隊列)。快遞站點可能有不同類型的分揀中心,有的按照具體地址分揀,有的將包裹復制給多個收件人等Queue
就是快遞站點里的一個個倉庫,用來臨時存放等待派送的包裹。每個倉庫都有一個或多個快遞員(消費者)負責從倉庫中取出包裹并派送給最終的收件人Connection
就像是快遞員與快遞站點之間的通信線路,快遞員需要通過這個線路來接收派送任務(消息)Channel
就像是快遞員在執行任務時使用的多個并行的通信線路。這樣,快遞員可以同時處理多個包裹,比如一遍派送包裹,一邊接收新的包裹