RocketMQ 是一個純 Java、分散式、隊列模型的開源消息中間件;前身是 MetaQ,是阿裡參考 Kafka 研發的一個隊列模型的消息中間件,後開源給 Apache 基金會併成為 Apache 的頂級項目,具有高性能、高可靠、高實時、分散式的特點。 1、基本概念 1.1、主題(Topic) A ...
RocketMQ 是一個純 Java、分散式、隊列模型的開源消息中間件;前身是 MetaQ,是阿裡參考 Kafka 研發的一個隊列模型的消息中間件,後開源給 Apache 基金會併成為 Apache 的頂級項目,具有高性能、高可靠、高實時、分散式的特點。
1、基本概念
1.1、主題(Topic)
Apache RocketMQ 中消息傳輸和存儲的頂層容器,用於標識同一類業務邏輯的消息。主題通過 TopicName 來做唯一標識和區分。
1.2、消息類型(MessageType)
Apache RocketMQ 中按照消息傳輸特性的不同而定義的分類,用於類型管理和安全校驗。 Apache RocketMQ 支持的消息類型有普通消息、順序消息、事務消息和定時/延時消息。
註:Apache RocketMQ 從 5.0 版本開始,支持強制校驗消息類型,即每個主題 Topic 只允許發送一種消息類型的消息,這樣可以更好的運維和管理生產系統,避免混亂。但同時保證向下相容 4.x 版本行為,強制校驗功能預設關閉,推薦通過服務端參數 enableTopicMessageTypeCheck 手動開啟校驗。
1.3、消息隊列(MessageQueue)
隊列是 Apache RocketMQ 中消息存儲和傳輸的實際容器,也是消息的最小存儲單元。 Apache RocketMQ 的所有主題都是由多個隊列組成,以此實現隊列數量的水平拆分和隊列內部的流式存儲。隊列通過QueueId 來做唯一標識和區分。
1.4、消息(Message)
消息是 Apache RocketMQ 中的最小數據傳輸單元。生產者將業務數據的負載和拓展屬性包裝成消息發送到服務端,服務端按照相關語義將消息投遞到消費端進行消費。
1.5、消息視圖(MessageView)
消息視圖是 Apache RocketMQ 面向開發視角提供的一種消息只讀介面。通過消息視圖可以讀取消息內部的多個屬性和負載信息,但是不能對消息本身做任何修改。
1.6、消息標簽(MessageTag)
消息標簽是 Apache RocketMQ 提供的細粒度消息分類屬性,可以在主題層級之下做消息類型的細分。消費者通過訂閱特定的標簽來實現細粒度過濾。
1.7、消息位點(MessageQueueOffset)
消息是按到達 Apache RocketMQ 服務端的先後順序存儲在指定主題的多個隊列中,每條消息在隊列中都有一個唯一的 Long 類型坐標,這個坐標被定義為消息位點。
1.8、消費位點(ConsumerOffset)
一條消息被某個消費者消費完成後不會立即從隊列中刪除,Apache RocketMQ 會基於每個消費者分組記錄消費過的最新一條消息的位點,即消費位點。
1.9、消息索引(MessageKey)
消息索引是 Apache RocketMQ 提供的面向消息的索引屬性。通過設置的消息索引可以快速查找到對應的消息內容。
1.10、生產者(Producer)
生產者是 Apache RocketMQ 系統中用來構建並傳輸消息到服務端的運行實體。生產者通常被集成在業務系統中,將業務消息按照要求封裝成消息併發送至服務端。
1.11、事務檢查器(TransactionChecker)
Apache RocketMQ 中生產者用來執行本地事務檢查和異常事務恢復的監聽器。事務檢查器應該通過業務側數據的狀態來檢查和判斷事務消息的狀態。
1.12、事務狀態(TransactionResolution)
Apache RocketMQ 中事務消息發送過程中,事務提交的狀態標識,服務端通過事務狀態控制事務消息是否應該提交和投遞。事務狀態包括事務提交、事務回滾和事務未決。
1.13、消費者分組(ConsumerGroup)
消費者分組是 Apache RocketMQ 系統中承載多個消費行為一致的消費者的負載均衡分組。和消費者不同,消費者分組並不是運行實體,而是一個邏輯資源。在 Apache RocketMQ 中,通過消費者分組內初始化多個消費者實現消費性能的水平擴展以及高可用容災。
1.14、消費者(Consumer)
消費者是 Apache RocketMQ 中用來接收並處理消息的運行實體。消費者通常被集成在業務系統中,從服務端獲取消息,並將消息轉化成業務可理解的信息,供業務邏輯處理。
1.15、消費結果(ConsumeResult)
Apache RocketMQ 中 PushConsumer 消費監聽器處理消息完成後返回的處理結果,用來標識本次消息是否正確處理。消費結果包含消費成功和消費失敗。
1.16、訂閱關係(Subscription)
訂閱關係是 Apache RocketMQ 系統中消費者獲取消息、處理消息的規則和狀態配置。訂閱關係由消費者分組動態註冊到服務端系統,併在後續的消息傳輸中按照訂閱關係定義的過濾規則進行消息匹配和消費進度維護。
1.17、消息過濾
消費者可以通過訂閱指定消息標簽(Tag)對消息進行過濾,確保最終只接收被過濾後的消息合集。過濾規則的計算和匹配在 Apache RocketMQ 的服務端完成。
1.18、重置消費位點
以時間軸為坐標,在消息持久化存儲的時間範圍內,重新設置消費者分組對已訂閱主題的消費進度,設置完成後消費者將接收設定時間點之後,由生產者發送到 Apache RocketMQ 服務端的消息。
1.19、消息軌跡
在一條消息從生產者發出到消費者接收並處理過程中,由各個相關節點的時間、地點等數據匯聚而成的完整鏈路信息。通過消息軌跡,您能清晰定位消息從生產者發出,經由 Apache RocketMQ 服務端,投遞給消費者的完整鏈路,方便定位排查問題。
1.20、消息堆積
生產者已經將消息發送到 Apache RocketMQ 的服務端,但由於消費者的消費能力有限,未能在短時間內將所有消息正確消費掉,此時在服務端保存著未被消費的消息,該狀態即消息堆積。
1.21、事務消息
事務消息是 Apache RocketMQ 提供的一種高級消息類型,支持在分散式場景下保障消息生產和本地事務的最終一致性。
1.22、定時/延時消息
定時/延時消息是 Apache RocketMQ 提供的一種高級消息類型,消息被髮送至服務端後,在指定時間後才能被消費者消費。通過設置一定的定時時間可以實現分散式場景的延時調度觸發效果。
1.23、順序消息
順序消息是 Apache RocketMQ 提供的一種高級消息類型,支持消費者按照發送消息的先後順序獲取消息,從而實現業務場景中的順序處理。
2、領域模型
Apache RocketMQ 是一款典型的分散式架構下的中間件產品,使用非同步通信方式和發佈訂閱的消息傳輸模型。 Apache RocketMQ 產品具備非同步通信的優勢,系統拓撲簡單、上下游耦合較弱,主要應用於非同步解耦,流量削峰填谷等場景。
2.1、Apache RocketMQ 領域模型
Apache RocketMQ 中消息的生命周期主要分為消息生產、消息存儲、消息消費這三部分。生產者生產消息併發送至 Apache RocketMQ 服務端,消息被存儲在服務端的主題中,消費者通過訂閱主題消費消息。
2.1.1、消息生產
生產者(Producer):Apache RocketMQ 中用於產生消息的運行實體,一般集成於業務調用鏈路的上游。生產者是輕量級匿名無身份的。
2.1.2、消息存儲
主題(Topic):Apache RocketMQ 消息傳輸和存儲的分組容器,主題內部由多個隊列組成,消息的存儲和水平擴展實際是通過主題內的隊列實現的。
隊列(MessageQueue):Apache RocketMQ 消息傳輸和存儲的實際單元容器,類比於其他消息隊列中的分區。 Apache RocketMQ 通過流式特性的無限隊列結構來存儲消息,消息在隊列內具備順序性存儲特征。
消息(Message):Apache RocketMQ 的最小傳輸單元。消息具備不可變性,在初始化發送和完成存儲後即不可變。
2.1.3、消息消費
消費者分組(ConsumerGroup):Apache RocketMQ 發佈訂閱模型中定義的獨立的消費身份分組,用於統一管理底層運行的多個消費者(Consumer)。同一個消費組的多個消費者必須保持消費邏輯和配置一致,共同分擔該消費組訂閱的消息,實現消費能力的水平擴展。
消費者(Consumer):Apache RocketMQ 消費消息的運行實體,一般集成在業務調用鏈路的下游。消費者必須被指定到某一個消費組中。
訂閱關係(Subscription):Apache RocketMQ 發佈訂閱模型中消息過濾、重試、消費進度的規則配置。訂閱關係以消費組粒度進行管理,消費組通過定義訂閱關係控制指定消費組下的消費者如何實現消息過濾、消費重試及消費進度恢復等。Apache RocketMQ 的訂閱關係除過濾表達式之外都是持久化的,即服務端重啟或請求斷開,訂閱關係依然保留。
2.2、通信方式介紹
分散式系統架構思想下,將複雜系統拆分為多個獨立的子模塊,例如微服務模塊。此時就需要考慮子模塊間的遠程通信,典型的通信模式分為以下兩種,一種是同步的 RPC 遠程調用;一種是基於中間件代理的非同步通信方式。
2.2.1、同步RPC調用模型
同步 RPC 調用模型下,不同系統之間直接進行調用通信,每個請求直接從調用方發送到被調用方,然後要求被調用方立即返迴響應結果給調用方,以確定本次調用結果是否成功。
註意:此處的同步並不代表 RPC 的編程介面方式,RPC 也可以有非同步非阻塞調用的編程方式,但本質上仍然是需要在指定時間內得到目標端的直接響應。
2.2.2、非同步通信模型
非同步消息通信模式下,各子系統之間無需強耦合直接連接,調用方只需要將請求轉化成非同步事件(消息)發送給中間代理,發送成功即可認為該非同步鏈路調用完成,剩下的工作中間代理會負責將事件可靠通知到下游的調用系統,確保任務執行完成。該中間代理一般就是消息中間件。
非同步通信的優勢如下:
1、系統拓撲簡單。由於調用方和被調用方統一和中間代理通信,系統是星型結構,易於維護和管理。
2、上下游耦合性弱。上下游系統之間弱耦合,結構更靈活,由中間代理負責緩衝和非同步恢復。 上下游系統間可以獨立升級和變更,不會互相影響。
3、容量削峰填谷。基於消息的中間代理往往具備很強的流量緩衝和整形能力,業務流量高峰到來時不會擊垮下游。
2.2.3、消息傳輸模型介紹
主流的消息中間件的傳輸模型主要為點對點模型和發佈訂閱模型。
A、點對點模型
點對點模型也叫隊列模型,具有如下特點:
1、消費匿名:消息上下游溝通的唯一的身份就是隊列,下游消費者從隊列獲取消息無法申明獨立身份。
2、一對一通信:基於消費匿名特點,下游消費者即使有多個,但都沒有自己獨立的身份,因此共用隊列中的消息,每一條消息都只會被唯一一個消費者處理。因此點對點模型只能實現一對一通信。
B、點對點模型
發佈訂閱模型具有如下特點:
1、消費獨立:相比隊列模型的匿名消費方式,發佈訂閱模型中消費方都會具備的身份,一般叫做訂閱組(訂閱關係),不同訂閱組之間相互獨立不會相互影響。
2、一對多通信:基於獨立身份的設計,同一個主題內的消息可以被多個訂閱組處理,每個訂閱組都可以拿到全量消息。因此發佈訂閱模型可以實現一對多通信。
C、傳輸模型對比
點對點模型和發佈訂閱模型各有優勢,點對點模型更為簡單,而發佈訂閱模型的擴展性更高。 Apache RocketMQ 使用的傳輸模型為發佈訂閱模型,因此也具有發佈訂閱模型的特點。
參考:https://rocketmq.apache.org/zh/docs/。