RabbitMQ 消息發(fā)送原理概述
1. 前言
Hello,大家好。今天會為同學們介紹 RabbitMQ 的消息發(fā)送原理,RabbitMQ 消息發(fā)送原理展開來說有太多內(nèi)容了,完全可以專門作為一門獨立的課程存在,所以,本節(jié)只會從宏觀層面來介紹 RabbitMQ 的消息發(fā)送原理,太深的概念并不會涉及。
在了解了如何使用 RabbitMQ 來發(fā)送消息之后,簡單了解 RabbitMQ 消息發(fā)送的原理是非常有必要的,它能夠幫助我們定位排查一些 RabbitMQ 出現(xiàn)的問題,所以就讓我們來看看 RabbitMQ 到底是如何來發(fā)送消息的吧。
本節(jié)主要內(nèi)容:
-
RabbitMQ 整體架構解析;
-
RabbitMQ 消息發(fā)送原理概述;
2. RabbitMQ 整體架構解析
RabbitMQ 整體架構是基于 AMQP 協(xié)議的,結合 AMQP 協(xié)議的架構模型,我們可以得出 RabbitMQ 的整體架構,RabbitMQ 整體架構如下圖所示:

消息這一元素在 RabbitMQ 中雖然至關重要,但消息只是 RabbitMQ 處理的目標,并不能作為 RabbitMQ Server 的組成部分,所以,在上圖中,我并沒有引入消息這一概念,目的就是讓各位同學能夠看清楚 RabbitMQ Server 的架構到底是什么樣的,即 RabbitMQ Server 都是由哪些元素或組件所組成的。
我們都知道,RabbitMQ Server 就是我們的 RabbitMQ 服務器,在 AMQP 協(xié)議中,RabbitMQ Server 又被稱為 Broker ,這點同學們需要了解。
由圖可知,RabbitMQ Server 由 Virtual Host 、Exchange 、Channel 、Queue 四大核心組件所組成。 在核心基礎概念小節(jié)中,我們已經(jīng)對這四大核心組件做了相應的介紹,這里就不再贅述了,如果有不清楚的同學,可以到核心基礎概念小節(jié)中做相應了解。
在一個 RabbitMQ Server 中,只有一個 Virtual Host ,在一個 Virtual Host 中,可以有多個不同名稱的 Exchange ,而一個 Exchange 可以與多個 Channel 進行綁定,同時,一個 Queue 也可以和多個 Channel 進行綁定。
即,在一個 RabbitMQ Server 中,有且只有一個 Virtual Host ,在一個 Virtual Host 中,存在多個 Exchange 和 Channel ,以及多個 Queue , 這個對應關系需要同學們知道。
Tips: 關于 RabbitMQ 的整體架構,我們只需要了解到這一層次即可,即我們只要知道了 RabbitMQ Server 都是由哪些元素構成的,以及這些元素的包含關系即可。
3. RabbitMQ 消息發(fā)送原理概述
在對 RabbitMQ 的整體架構有一個宏觀了解之后,我們還需要對 RabbitMQ 的消息發(fā)送原理也有所了解,知道消息在 RabbitMQ Server 是怎樣流轉的。
同樣地,RabbitMQ 消息的發(fā)送原理也是基于 AMQP 協(xié)議中消息的發(fā)送原理,結合 AMQP 消息的發(fā)送原理(同學們不需要知道),我們可以得出 RabbitMQ 消息的發(fā)送原理。
我們先來看一下,結合 RabbitMQ 整體架構而得出的 RabbitMQ 消息發(fā)送原理是怎樣的,如下圖所示:

由此圖,我們可以得出 RabbitMQ 消息發(fā)送的步驟:
第一步,生產(chǎn)者將消息生產(chǎn)出來,并將消息發(fā)送到 RabbitMQ Server 上,即我們發(fā)到 RabbitMQ 中的消息,會首先置于 RabbitMQ Server 中;
第二步,RabbitMQ Server 根據(jù)客戶端所發(fā)來的連接請求,判斷將消息傳遞到哪個 Virtual Host 中,如果我們在連接 RabbitMQ Server 時,沒有設置要連接的 Virtual Host 地址,則 RabbitMQ Server 會將我們的消息傳遞到地址為 “/” 的 Virtual Host 中去;
第三步,在將消息傳遞到對應的 Virtual Host 中后,Virtual Host 會繼續(xù)解析我們的連接請求,并在這一步解析出我們需要的 Exchange 的類型,以及 Channel 的名稱,Queue 的名稱,以及消息和 Exchange 之間是否有 routing_key ,Channel 和 Queue 之間是否有 bidding_key 這些信息;
第四步,Virtual Host 會根據(jù)解析出來的這些信息,將消息和 Exchange 進行匹配,相應的,Exchange 也會和對應的 Channel 進行匹配,并最終將 Queue 和 Channel 進行綁定,使消息進入到對應的消息隊列中去;
第五步,待消息進入到對應的消息隊列中之后,RabbitMQ Server 會返回給我們一個確認應答(確認應答后續(xù)會進行介紹),來通知我們,消息已經(jīng)成功被 RabbitMQ Server 所發(fā)送,于是,消費者變回根據(jù)一定的策略來從消息隊列中獲取消費,并最終將該消息消費掉,消息消費之后,也會給我們返回一個確認應答(確認應答后續(xù)會進行介紹),告訴我們消息已經(jīng)成功消費掉了。
以上就是 RabbitMQ 進行消息發(fā)送的先后步驟,為了更直觀地為各位同學呈現(xiàn) RabbitMQ 的消息發(fā)送原理,我做了一個流程圖給大家,如下圖所示:

同學們可以根據(jù)上述步驟,結合流程圖進行學習和驗證。
4. 小結

本小節(jié)為各位同學介紹了 RabbitMQ 的整體架構,以及 RabbitMQ 的消息發(fā)送原理,出于課程設計的初衷,本小節(jié)并沒有從源碼層面對 RabbitMQ 的消息發(fā)送原理做深入地剖析,同學們只需要對 RabbitMQ 的消息發(fā)送原理做宏觀層面上的了解即可。
通過介紹 RabbitMQ 的整體架構,同學們需要了解 RabbitMQ Server 都由哪些主要元素構成,以及他們之間的包含關系。了解 RabbitMQ 的整體結構以及 RabbitMQ Server 的消息發(fā)送步驟是應用好 RabbitMQ 的前提,希望同學們注意。