RabbitMQ 主要概念
RabbitMQ 是基于 Erlang 實作 AMQP 協議的訊息中間件,
RabbitMQ 整體上是一個生產者消費者模型,如下圖,

為了便于理解,可以將圖中拆分為生產環節和消費環節,
對于生產環節 ,有這3個概念:
Producer: 生產者,將其理解為攜帶信封的人,
RoutingKey: 郵箱的地址,
Exchange: 郵箱,
三者結合理解起來為:一個攜帶信封的人,沿著郵箱地址行走,將信投遞到某一個郵箱中,
對于消費環節,同樣有3個概念:
BindingKey: 收件地址
Queue: 菜鳥驛站
Consumer: 收件人
三者結合起來理解:信件根據收件地址,投遞到了某個菜鳥驛站,驛站里存放了各種各樣的信件,收件人可以從驛站中取走自己的信件,
以上就是一種比較簡單形象地理解生產者消費者模型的方式,有了上面初步的感性認知,那么下面就對于幾個角色做更詳盡的說明,
Broker
圖中虛線框部分,可以將其看作是一個 RabbitMQ 服務實體,
Producer
Producer 負責將訊息投遞到 Exchange 中,訊息的主體是 payload,一般業務資料會以json字串形式放入 payload 中,
Exchange
Exchange 也稱為交換機,在 RabbitMQ 中有四種型別,其中默認為 “direct”,另外三種分別是"topic",“fanout”,“head”,交換機需要將訊息路由到指定的佇列,如果找不到指定的佇列,則訊息會丟失,路由佇列的方法,對于不同型別的交換機,有不同的方式,具體可以參照這里
RoutingKey
Producer 需要指定 RoutingKey 將訊息投遞到 Exchange 中,
BindingKey
BindingKey 負責將 Exchange 和 Queue 關聯起來,
Queue
佇列,對于 RabbitMQ 來說,訊息主要存盤到佇列中
訊息生產流程
Producer 連接到 Broker,建立一個 Connection,并開啟一個 Channel,(需要注意,Connection 可以復用,即一個 Connection 可以建立多個 Channel),具體細節如圖

Producer 將 Protocol Header 0-9-1 報文頭部發送到 Broker,后者回傳 Connection.Start 表明開始建立連接,
當 Produer 收到 Channel.Open-Ok 時,表明 Channel已建立完畢,可以開始發送訊息了,
通過 Basic.Pubish 將訊息投遞到 Exchange 中,
當需要關閉時,則需要依次關閉 Channel, 和 Connection,
訊息消費流程

和生產環境類似,Consumer 首先需要和 Brocker 建立連接,開啟通道,
Consumer 向 Broker 發送 Basic.Consume,之后收到來自 Broker的回復 Basic.Consume-Ok,表面準備完成,即將推送訊息,(這里注明一下,消費訊息存在推 和 拉兩種模式,該圖場景是使用推模式,還有另一種拉模式是 Consumer 主動向 Broker 拉取訊息,而不是建立連接后等待訊息的自動推送)
類似于 TCP 連接收到訊息后有 ACK 應答,Consumer 消費完訊息后,也需要 ACK 告知 Broker 訊息已消費,可以從 Queue 中洗掉,對于實際開發來說,可以設定為自動 ACK,也可以處理完業務后再手動 ACK,
和生產流程,消費完成后,Consumer 和 Broker 斷開連接依次經歷 Channel 和 Connection 的關閉,
AMQP
AMQP 全稱 Advanced Message Queuing Protocol,是一個通信協議,
協議本身包含三層結構
- Module Layer:位于最頂層,提供一些客戶端可呼叫的指令,
- Session Layer:中間層,主要處理服務端與客戶端的互動通信,
- Transport Layer: 最底層,主要傳輸二進制資料流,提供幀處理能力,信道復用等功能,
它的模型架構即上述所演示,涉及 Producer, Consumer,Exchange, Queue 等,報文的互動即上述的兩張圖,
值得注意的是 AMQP 就類似于 FTP, 屬于應用層協議,它規范了訊息傳遞方和接收方的行為,以使訊息在不同的具體實作中能夠互相識別,
小結
本文通過圖解方式,簡單介紹了 RabbitMQ 的一些核心概念,熟知這些概念,再查閱相關客戶端開發檔案,即可快速上手 RabbitMQ 的業務開發,如需再深入,可以進一步閱讀以下參考資料,
參考資料
- 《RabbitMQ實戰指南》
- https://www.rabbitmq.com/tutorials/amqp-concepts.html
- https://en.wikipedia.org/wiki/Advanced_Message_Queuing_Protocol
轉載請註明出處,本文鏈接:https://www.uj5u.com/ruanti/287366.html
標籤:其他
上一篇:ASP.NET MVC5 采用Unity(代碼和組態檔兩種方式)實作IOC
下一篇:kotlin-協程(上篇)
