RabbitMQ 就是一個(gè)用于傳遞消息的隊(duì)列中間件,幫你把消息從 A 傳給 B。主要的用途就是幫助應(yīng)用程序解耦、提高可靠性和擴(kuò)展性。
以一個(gè)最常見(jiàn)的場(chǎng)景為例
RMQ 的使用形式有多種,我們以最常用的為例,如下所示:

最常見(jiàn)的 RMQ 用法
- P 作為消息發(fā)布者(Publisher)將消息發(fā)送到 X 即交換機(jī)(Exchange),X 將消息分發(fā)到 Q1,Q2 兩個(gè)消息隊(duì)列(Queue)中。
- C1,C2 兩個(gè)消費(fèi)接收者即消費(fèi)者(Consumer),分別將自己以消費(fèi)者的身份注冊(cè)到 Q1,Q2 兩個(gè)隊(duì)列上——A.K.A. 訂閱/監(jiān)聽(tīng)。
- 當(dāng) Q1,Q2 內(nèi)有消息時(shí),就會(huì)將這些消息推送給他們的訂閱方,即消費(fèi)者 C1 和 C2。最終 C1 和 C2 可以根據(jù)收到的消息完成各種業(yè)務(wù)處理。
注:
- 例子為了簡(jiǎn)化,一個(gè)隊(duì)列 Q 只有一個(gè)消費(fèi)者 C,但其實(shí)同一個(gè) Q 是可以有多個(gè) C 訂閱的,實(shí)際運(yùn)用時(shí),后者也更常見(jiàn)。
- 我們能看到這里的消息發(fā)布者 P 和消息消費(fèi)者 C1,C2 不直接交互,消息是由隊(duì)列作為中間方異步傳遞的,P可以按照自己的節(jié)奏生產(chǎn)消息,C可以按照自己的節(jié)奏消費(fèi)消息,互不依賴,這就是解耦。
- C 因?yàn)?BUG 或者升級(jí)發(fā)生宕機(jī)或者下線時(shí),P 產(chǎn)生的消息是緩存在隊(duì)列 Q 中的,C 重新上線后可以繼續(xù)消費(fèi),所以這些消息并不會(huì)丟失。這就是可靠性。
- P 可能在短時(shí)間產(chǎn)生大量消息,但這并不會(huì)給 C 帶來(lái)任何壓力,因?yàn)檫@些消息會(huì)被緩存在隊(duì)列 Q 中,C 按照自己的節(jié)奏消費(fèi)處理消息即可。這也是可靠性。我們可以利用這一特性來(lái)處理業(yè)務(wù)的短時(shí)高并發(fā)。
- 當(dāng)一個(gè) C 消費(fèi) Q 消息的速度太慢時(shí),我們可以增加注冊(cè)更多的 C 一起來(lái)消費(fèi)。這就是擴(kuò)展性。
更多使用場(chǎng)景
理解本文的例子后,可以直接閱讀 RabbitMQ 官網(wǎng) tutorials,非常清晰易懂。