RabbitMQ 就是一個(gè)用于傳遞消息的隊(duì)列中間件,幫你把消息從 A 傳給 B锡搜。主要的用途就是幫助應(yīng)用程序解耦橙困、提高可靠性和擴(kuò)展性。
以一個(gè)最常見的場景為例
RMQ 的使用形式有多種耕餐,我們以最常用的為例凡傅,如下所示:
最常見的 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)者的身份注冊到 Q1槽华,Q2 兩個(gè)隊(duì)列上——A.K.A. 訂閱/監(jiān)聽壹蔓。
- 當(dāng) Q1,Q2 內(nèi)有消息時(shí)猫态,就會將這些消息推送給他們的訂閱方佣蓉,即消費(fèi)者 C1 和 C2。最終 C1 和 C2 可以根據(jù)收到的消息完成各種業(yè)務(wù)處理亲雪。
注:
- 例子為了簡化勇凭,一個(gè)隊(duì)列 Q 只有一個(gè)消費(fèi)者 C,但其實(shí)同一個(gè) Q 是可以有多個(gè) C 訂閱的义辕,實(shí)際運(yùn)用時(shí)虾标,后者也更常見。
- 我們能看到這里的消息發(fā)布者 P 和消息消費(fèi)者 C1终息,C2 不直接交互夺巩,消息是由隊(duì)列作為中間方異步傳遞的,P可以按照自己的節(jié)奏生產(chǎn)消息周崭,C可以按照自己的節(jié)奏消費(fèi)消息柳譬,互不依賴,這就是解耦续镇。
- C 因?yàn)?BUG 或者升級發(fā)生宕機(jī)或者下線時(shí)美澳,P 產(chǎn)生的消息是緩存在隊(duì)列 Q 中的,C 重新上線后可以繼續(xù)消費(fèi)摸航,所以這些消息并不會丟失制跟。這就是可靠性。
- P 可能在短時(shí)間產(chǎn)生大量消息酱虎,但這并不會給 C 帶來任何壓力雨膨,因?yàn)檫@些消息會被緩存在隊(duì)列 Q 中,C 按照自己的節(jié)奏消費(fèi)處理消息即可读串。這也是可靠性聊记。我們可以利用這一特性來處理業(yè)務(wù)的短時(shí)高并發(fā)。
- 當(dāng)一個(gè) C 消費(fèi) Q 消息的速度太慢時(shí)恢暖,我們可以增加注冊更多的 C 一起來消費(fèi)排监。這就是擴(kuò)展性。
更多使用場景
理解本文的例子后杰捂,可以直接閱讀 RabbitMQ 官網(wǎng) tutorials舆床,非常清晰易懂。