消息中間件漫談:RocketMQ系統架構及元素

​消息中間件是後端架構中非常重要的技術組件之一,普遍用於系統解耦、異步通信和高併發流量下的削峰填谷等場景。

典型的應用場景

典型的消息中間件系統一般具備良好的讀寫性能和吞吐量,系統引入消息中間件後典型的拓撲結構如下圖所示,消息中間件充當不同系統間信息交互的媒介,實現數據流的中轉。

消息中間件漫談:RocketMQ系統架構及元素

消息中間件的本質決定了天然的可以用於如下場景:

解耦

原來多系統間基於RPC或HTTP等方式進行直接通信,方式雖然直接,但帶來了上下游系統間的天然耦合,而基於消息中間件則將耦合轉移至第三方,極大了降低了原有系統間的耦合。

異步

原有業務場景下的系統通信可能基於同步方式等待下游系統返回,引入消息中間件後,系統將消息以可靠的方式投遞到消息系統就可以返回,這種異步化處理能夠極大提高上游系統的吞吐量和性能。

削峰

基於高耦合方式的直接通信在面對高併發請求時力不從心,基於消息中間件出色的吞吐量,將高併發請求導入的消息系統中,上游系統直接返回,下游系統異步消費,實現將流量洪峰打平。常見消息模型FIFO隊列模型這種消息模型基於先進先出的隊列模型,生產生生產併發送消息到隊列後進行入隊操作,消費者從隊列拉取或推送消息進行出隊操作。該種消息模型的關鍵點在於:隊列中的消息消費進行出隊操作,同一條消息只能被一個消費者消費到。

消息中間件漫談:RocketMQ系統架構及元素

發佈-訂閱模式發佈-訂閱模式由消息發佈者、主題和消息訂閱者組成,消息發佈者發送消息到特定主題,消息訂閱者訂閱特定主題,並接收主題中的消息。主題是個邏輯概念,用作消息容器。發佈-訂閱模式解決了基於FIFO隊列的“同一條消息只能被一個消費者消費”的問題。

消息中間件漫談:RocketMQ系統架構及元素

RocketMQ 的消息模型RocketMQ的消息模型基於發佈-訂閱模式,如下圖所示:

消息中間件漫談:RocketMQ系統架構及元素

RocketMQ主要由生產者、主題、消費者 三部分組成,其中Producer 負責生產消息,Consumer 負責消費消息,主題是消息的邏輯存儲容器,主題下劃分為不同的隊列,用於存儲消息的物理地址,每個Topic中的消息地址存儲於多個 Message Queue 中。同時,引入了“組”的概念,生產者和消費者可以劃分到不同的組,每個消費組由多個消費實例構成。

消息生產者(Producer)

負責生產消息,把業務應用系統裡產生的消息發送到broker服務器。RocketMQ支持同步發送、異步發送、順序發送、單向發送。同步和異步方式均需要Broker返回確認信息,單向發送不需要。

消息消費者(Consumer)

負責消費消息,一個消息消費者會從Broker服務器拉取消息、並將其提供給應用程序。從用戶應用的角度而言提供了兩種消費形式:拉取式消費、推動式消費。

主題(Topic)表示一類消息的集合,每個主題包含若干條消息,每條消息只能屬於一個主題,是RocketMQ進行消息訂閱的基本單位。

拉取式消費(Pull Consumer)Consumer消費的一種類型,應用通常主動調用Consumer的拉消息方法從Broker服務器拉消息、主動權由應用控制。一旦獲取了批量消息,應用就會啟動消費過程。

推動式消費(Push Consumer)Consumer消費的一種類型,該模式下Broker收到數據後會主動推送給消費端,該消費模式一般實時性較高。

生產者組(Producer Group)同一類Producer的集合,這類Producer發送同一類消息且發送邏輯一致。如果發送的是事務消息且原始生產者在發送之後崩潰,則Broker服務器會聯繫同一生產者組的其他生產者實例以提交或回溯消費。

消費者組(Consumer Group)同一類消費者的集合,這類消費者通常消費同一類消息且消費邏輯一致。消費者組使得在消息消費方面,實現負載均衡和容錯的目標變得非常容易。RocketMQ 支持兩種消息模式:集群消費(Clustering)和廣播消費(Broadcasting)。

消息(Message)消息系統所傳輸信息的物理載體,生產和消費數據的最小單位,每條消息必須屬於一個主題。RocketMQ中每個消息擁有唯一的Message ID,且可以攜帶具有業務標識的Key。

標籤(Tag)為消息設置的標誌,用於同一主題下區分不同類型的消息。來自同一業務單元的消息,可以根據不同業務目的在同一主題下設置不同標籤。RocketMQ的技術架構RocketMQ的技術架構如下圖所示,涉及Producer、Consumer、NameServer、BrokerServer等架構元素。

消息中間件漫談:RocketMQ系統架構及元素


Producer:生產者支持分佈式集群部署,通過負載均衡的方式將消息投遞到Broker集群隊列。

Consumer:消費者同樣支持分佈式集群部署,支持以推或拉模式消費消息

NameServer:與Kafka基於Zookeeper不同,RocketMQ使用自己的NameServer,它是一個輕量級的Topic路由註冊中心,支持Broker的動態註冊與發現。

BrokerServer:Broker主要負責消息的存儲、投遞和查詢以及服務高可用保證。RocketMQ的部署架構

消息中間件漫談:RocketMQ系統架構及元素

NameServer是一個幾乎無狀態節點,可集群部署,節點之間無任何信息同步。

Broker是物理概念,可以採取主從方式部署,分為Master Broker與Slave Broker,二者之間是一對多關係。通過指定相同的BrokerName映射Master與Slave 的對應關係。Master Broker的ID為0,Slave Broker的ID為非0。每個Broker與NameServer集群中的所有節點建立長連接,定時註冊Topic信息到所有NameServer。

Producer

生產者與NameServer集群中的其中一個節點建立長連接,定期從NameServer獲取Topic路由信息,並向提供Topic 服務的Master建立長連接,且定時向Master發送心跳。

Consumer

消費者與NameServer集群中的其中一個節點建立長連接,定期從NameServer獲取Topic路由信息,並向提供Topic服務的Master、Slave建立長連接,且定時向Master、Slave發送心跳。

RocketMQ集群工作流程:

  1. 啟動NameServer,等待Broker、Producer、Consumer連接
  2. Broker啟動,跟所有的NameServer保持長連接,定時發送心跳包。
  3. 創建Topic
  4. Producer發送消息,啟動時先跟NameServer集群中的其中一臺建立長連接,並從NameServer中獲取當前發送的Topic存在哪些Broker上,輪詢從隊列列表中選擇一個隊列,然後與隊列所在的Broker建立長連接從而向Broker發消息。
  5. Consumer與NameServer建立長連接,獲取當前訂閱Topic的Broker信息,並與Broker建立連接通道,開始消費消息。


分享到:


相關文章: