RocketMQ 入門實戰(1)--簡介

来源:https://www.cnblogs.com/wuyongyin/archive/2023/08/27/17568349.html
-Advertisement-
Play Games

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/


您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • ## 1 拉取鏡像 指定版本,在git查看相應版本,參考: https://github.com/openzipkin/zipkin 如2.21.7 ```bash docker pull openzipkin/zipkin:2.21.7 ``` ## 2 啟動 Zipkin預設埠為9411。啟動 ...
  • # Nacos集群搭建 # 1.集群結構圖 官方給出的Nacos集群圖: ![image-20210409210621117](https://img2023.cnblogs.com/blog/3014273/202308/3014273-20230827184442168-301140741.pn ...
  • 最近github上發現了一個庫(`plottable`),可以用簡單的方式就設置出花哨的 `DataFrame` 樣式。 github上的地址:[https://github.com/znstrider/plottable](https://github.com/znstrider/plottabl ...
  • Kafka 是一個基於發佈-訂閱模式的消息系統,它可以在多個生產者和消費者之間傳遞大量的數據。Kafka 的一個顯著特點是它的高吞吐率,即每秒可以處理百萬級別的消息。那麼 Kafka 是如何實現這樣高得性能呢?本文將從七個方面來分析 Kafka 的速度優勢。 - 零拷貝技術 - 僅可追加日誌結構 - ...
  • 在 gRPC 中使用 JWT(JSON Web Tokens)進行身份驗證是一種常見的做法,它可以幫助你確保請求方的身份和許可權。下麵是一種使用 gRPC 和 JWT 進行身份驗證的步驟: 1. **生成和簽發 JWT:** 在用戶登錄成功後,你需要生成一個 JWT 並將其簽發給用戶。JWT 中可以包 ...
  • 最近接觸到了 [github.com/json-iterator/go](https://github.com/json-iterator/go) , 是由滴滴開源的第三方json編碼庫,它同時提供Go和Java兩個版本。 > 文中大量內容來自 github 上的 wiki 文檔,有興趣的朋友可以直 ...
  • [原題](https://www.luogu.com.cn/problem/UVA908) ## 1.題意分析 題意就是給你很多組數,對於每組數,有三組小數據。第一組小數據先輸入一個n表示頂點數,然後再輸入n-1條邊表示初始邊數。其它組小數據先輸入一個數k,表示增加的邊的數量,然後再輸入k條邊,表示 ...
  • ## 概述 Spring Cloud Zuul 是 Spring Cloud Netflix 子項目的核心組件之一,可以作為微服務架構中的 API 網關使用,有以下用途: - 鑒權:對於訪問每個服務的請求進行鑒權,拒絕鑒權失敗的請求 - 監控:對系統的請求進行監控,記錄請求響應日誌,實時統計當前系統 ...
一周排行
    -Advertisement-
    Play Games
  • 示例項目結構 在 Visual Studio 中創建一個 WinForms 應用程式後,項目結構如下所示: MyWinFormsApp/ │ ├───Properties/ │ └───Settings.settings │ ├───bin/ │ ├───Debug/ │ └───Release/ ...
  • [STAThread] 特性用於需要與 COM 組件交互的應用程式,尤其是依賴單線程模型(如 Windows Forms 應用程式)的組件。在 STA 模式下,線程擁有自己的消息迴圈,這對於處理用戶界面和某些 COM 組件是必要的。 [STAThread] static void Main(stri ...
  • 在WinForm中使用全局異常捕獲處理 在WinForm應用程式中,全局異常捕獲是確保程式穩定性的關鍵。通過在Program類的Main方法中設置全局異常處理,可以有效地捕獲並處理未預見的異常,從而避免程式崩潰。 註冊全局異常事件 [STAThread] static void Main() { / ...
  • 前言 給大家推薦一款開源的 Winform 控制項庫,可以幫助我們開發更加美觀、漂亮的 WinForm 界面。 項目介紹 SunnyUI.NET 是一個基於 .NET Framework 4.0+、.NET 6、.NET 7 和 .NET 8 的 WinForm 開源控制項庫,同時也提供了工具類庫、擴展 ...
  • 說明 該文章是屬於OverallAuth2.0系列文章,每周更新一篇該系列文章(從0到1完成系統開發)。 該系統文章,我會儘量說的非常詳細,做到不管新手、老手都能看懂。 說明:OverallAuth2.0 是一個簡單、易懂、功能強大的許可權+可視化流程管理系統。 有興趣的朋友,請關註我吧(*^▽^*) ...
  • 一、下載安裝 1.下載git 必須先下載並安裝git,再TortoiseGit下載安裝 git安裝參考教程:https://blog.csdn.net/mukes/article/details/115693833 2.TortoiseGit下載與安裝 TortoiseGit,Git客戶端,32/6 ...
  • 前言 在項目開發過程中,理解數據結構和演算法如同掌握蓋房子的秘訣。演算法不僅能幫助我們編寫高效、優質的代碼,還能解決項目中遇到的各種難題。 給大家推薦一個支持C#的開源免費、新手友好的數據結構與演算法入門教程:Hello演算法。 項目介紹 《Hello Algo》是一本開源免費、新手友好的數據結構與演算法入門 ...
  • 1.生成單個Proto.bat內容 @rem Copyright 2016, Google Inc. @rem All rights reserved. @rem @rem Redistribution and use in source and binary forms, with or with ...
  • 一:背景 1. 講故事 前段時間有位朋友找到我,說他的窗體程式在客戶這邊出現了卡死,讓我幫忙看下怎麼回事?dump也生成了,既然有dump了那就上 windbg 分析吧。 二:WinDbg 分析 1. 為什麼會卡死 窗體程式的卡死,入口門檻很低,後續往下分析就不一定了,不管怎麼說先用 !clrsta ...
  • 前言 人工智慧時代,人臉識別技術已成為安全驗證、身份識別和用戶交互的關鍵工具。 給大家推薦一款.NET 開源提供了強大的人臉識別 API,工具不僅易於集成,還具備高效處理能力。 本文將介紹一款如何利用這些API,為我們的項目添加智能識別的亮點。 項目介紹 GitHub 上擁有 1.2k 星標的 C# ...