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

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

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

同學(xué)們可以根據(jù)上述步驟,結(jié)合流程圖進(jìn)行學(xué)習(xí)和驗(yàn)證。
4. 小結(jié)

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