Apache RocketMQ 中Message (消息)的核心概念

好的,我們來深入理解一下 Apache RocketMQ 中 Message (消息) 這個核心概念。這份文檔詳細闡述了消息的定義、在模型中的位置、內部屬性、約束和使用建議。

你可以將 Message 看作是 RocketMQ 系統中數據傳輸和處理的最小原子單位。它承載了業務數據,并附帶了豐富的元信息,是生產者、Broker 和消費者之間通信的載體。


1. Message 的本質定義

  • 最小傳輸單元 (Smallest Unit of Data Transmission)

    • Message 是 RocketMQ 中數據傳輸的基本單元。生產者將業務數據(負載)和擴展屬性封裝成 Message,發送給 Broker;Broker 再根據訂閱關系將 Message 傳遞給消費者。
  • 核心特性 (Characteristics)

    • 不可變性 (Immutability)
      • 消息一旦生成,其內容(特別是系統屬性和負載)在傳輸和存儲過程中不會改變。它被視為一個“已發生的事件”。
      • 消費者獲取到的消息是只讀的 (read-only)。在 5.x 版本中,這是強約束;在 3.x/4.x 版本中雖無強約束,但最佳實踐也建議不要修改。
      • 最佳實踐:如果需要基于收到的消息發送新消息,應該創建一個新消息(例如 MessageBuilder.buildFrom(m)),而不是直接修改原消息。
    • 持久性 (Persistence)
      • 默認情況下,RocketMQ 會將接收到的消息持久化存儲在 Broker 的存儲文件中。這是保證消息不丟失、支持消息追溯和系統故障恢復的基礎。

2. Message 在模型中的位置

在這里插入圖片描述

  • 生命周期流程
    1. 生產 (Produced):由生產者 (Producer) 創建并初始化。
    2. 發送 (Sent):生產者將消息發送到 Apache RocketMQ Broker
    3. 存儲 (Stored):Broker 接收到消息后,將其按接收順序存儲在特定 Topic 的某個 Queue 中。
    4. 消費 (Consumed)消費者 (Consumer) 根據訂閱關系,從 Broker 的相應 Queue 中拉取 (pull) 消息進行消費。

3. Message 的核心內部屬性

這些屬性分為系統保留屬性 (System retention attributes)可選屬性 (Optional attributes),以及負載 (Load)

系統保留屬性 (由系統或生產者設置)
  • Topic 名稱 (Topic name)

    • 作用:標識該消息屬于哪個邏輯主題。在集群內必須唯一。
    • 來源:由生產者 SDK 設置。
  • 消息類型 (Message type)

    • 作用:定義消息的語義和處理方式。RocketMQ 支持多種類型:
      • Normal:普通消息,無特殊語義。
      • FIFO:順序消息,保證同一消息組 (Message Group) 內的消息按發送順序被消費。實現依賴于 Queue 的有序性。
      • Delay:延遲消息,可以指定延遲時間(最大40天),延遲時間到后才對消費者可見。
      • Transaction:事務消息,用于實現分布式事務,確保本地數據庫操作和消息發送的最終一致性。
  • 消息隊列 (Message queue)

    • 作用:指明該消息最終被存儲在哪個具體的 Queue 中(屬于哪個 Topic 的哪個 Queue)。
    • 來源:由 Broker 在消息到達后,根據路由策略(如輪詢、哈希等)指定并填充
  • 消息 Offset (Message offset)

    • 作用:標識該消息在其所屬 Queue 內部的物理存儲位置(偏移量)。是 Broker 內部管理消息順序和消費者消費進度的關鍵。
    • 來源:由 Broker 指定并填充。從 0 開始遞增。
  • 消息 ID (Message ID)

    • 作用:消息的全局唯一標識符。在集群內絕對唯一,用于消息追蹤、排查問題。
    • 來源:由生產者客戶端自動生成(通常是 32 位的數字和大寫字母組成的字符串)。
可選屬性 (由生產者設置)
  • (可選) 消息 Keys (Message keys)

    • 作用:為消息設置一個或多個索引鍵。主要用于消息查詢(通過 Message IDMessage Key 在控制臺或通過 API 查找特定消息)和去重(結合業務邏輯)。
    • 來源:由生產者客戶端定義。
  • (可選) 消息 Tag (Message tag)

    • 作用:消息的標簽,用于消費者進行消息過濾。消費者可以訂閱特定的 Tag,從而只接收帶有該 Tag 的消息,實現簡單的消息分類。
    • 來源:由生產者客戶端定義。
    • 約束:每個消息只能設置一個 Tag
  • (可選) 定時時間 (Scheduled time)

    • 作用:配合 Delay 消息類型使用,指定消息延遲的具體時間戳(毫秒級),而不是延遲時長。
    • 來源:由消息生產者定義。
    • 約束:最大延遲時間 40 天
時間戳屬性
  • 消息發送時間 (Message sending time)

    • 作用:記錄消息在生產者客戶端本地被發送出去的時間戳(毫秒級)。
    • 來源:由生產者客戶端填充
    • 注意:這是客戶端時間,可能與 Broker 時間有偏差。
  • 消息存儲時間 (Message store timestamp)

    • 作用:記錄消息被Broker 成功寫入存儲(落盤)的時間戳(毫秒級)。對于延遲消息和事務消息,消費者感知到的“有效時間”通常基于此時間。
    • 來源:由Broker 填充
    • 注意:這是 Broker 時間,是消息在服務端的“出生”時間。
重試與自定義
  • 重試次數 (Retry times)

    • 作用:記錄該消息被 Broker 重新投遞給消費者的次數。每次消費失敗觸發重試,次數加一。第一次消費時為 0。
    • 來源:由 Broker 標記。消費者可以獲取此信息以進行冪等處理或特殊邏輯。
  • 自定義屬性 (Custom attributes)

    • 作用:生產者可以添加任意的 Key-Value (字符串類型) 對作為擴展信息,供業務邏輯使用。
    • 來源:由生產者根據需要指定。
  • 消息負載 (Message load)

    • 作用:消息的實際業務數據內容,即有效載荷 (Payload)。
    • 來源:由生產者序列化成二進制字節流后設置。
    • 約束:大小不能超過系統限制。

4. Message 的行為約束

  • 大小限制 (Size Limit)
    • 核心約束:單條消息的大小不能超過上限,否則發送會失敗。
    • 默認限制4 MB。這是非常重要的參數,直接影響網絡傳輸、存儲和處理性能。

5. Message 的使用建議與最佳實踐

  • 避免單條消息過大 (Overloaded transmission)

    • 原因:RocketMQ 是事件驅動的中間件。過大的消息會:
      • 加重網絡傳輸負擔,增加延遲。
      • 影響錯誤重試:重試大消息成本高。
      • 影響流控 (Throttling):流控粒度可能不夠精細。
    • 建議
      1. 嚴格控制單條消息的數據量,使其盡可能小。
      2. 如果業務上必須傳輸大量數據,強烈建議
        • 拆分消息:將大數據按固定大小拆分成多條小消息。
        • 使用外部存儲:將實際數據(如文件、圖片)存放到對象存儲(如 OSS)、文件系統或數據庫中,然后在消息的 loadcustom attributes只傳遞數據的訪問鏈接 (URL) 或 ID
  • 遵守消息不可變性原則 (Immutability)

    • 正確做法:收到消息后,如果需要轉發或基于它生成新消息,使用 MessageBuilder.buildFrom(m) 這樣的方法創建一個新消息實例,然后修改新實例的屬性(如 Topic, Tag, Load 等)再發送。
    • 錯誤做法:直接調用 m.update() 修改收到的消息 m 的內容,然后發送。這違反了不可變性原則,可能導致不可預知的行為或在 5.x 版本中被拒絕。

總結與核心理解

  1. Message 是原子單元:它封裝了業務數據和元信息,是 RocketMQ 傳輸的最小單位。
  2. Message 是不可變的:內容一旦產生,在傳遞過程中不應被修改。最佳實踐是“讀取-創建-發送”新消息。
  3. Message 是持久化的:默認落盤存儲,保證可靠性。
  4. Message 擁有豐富的屬性
    • Topic/Queue/Offset 定義了其在系統中的位置和順序。
    • Message ID 提供全局唯一標識。
    • Keys/Tag 支持查詢和過濾。
    • Message Type 定義了語義(普通、順序、延遲、事務)。
    • Sending Time/Store Timestamp 記錄了關鍵時間點。
    • Retry Times 協助處理消費失敗。
    • Custom Attributes 提供擴展能力。
    • Load 承載實際業務數據。
  5. Message 有嚴格的大小限制默認 4MB避免大消息是關鍵設計原則,應通過拆分外鏈方式處理大數據。
  6. 最佳實踐
    • 合理使用 Tag 進行消息過濾。
    • 利用 Keys 進行消息追蹤。
    • 遵守不可變性,通過 buildFrom 創建新消息。
    • 絕對不要發送超過 4MB 的消息,采用拆分或外鏈方案。

簡而言之,Message 是 RocketMQ 的“信封”和“信件”本身。理解其結構、屬性、約束和最佳實踐,對于設計高效、可靠、可維護的消息系統至關重要。記住:小消息、不可變、善用屬性、規避大負載

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/bicheng/91891.shtml
繁體地址,請注明出處:http://hk.pswp.cn/bicheng/91891.shtml
英文地址,請注明出處:http://en.pswp.cn/bicheng/91891.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

C 語言問題

1. C語言中 union 與 struct 的區別類型structunion內存分配機制編譯器為每個成員?獨立分配內存空間,總內存大小 所有成員大小之和(考慮內存對齊)所有成員?共享同一段內存空間,總內存大小 ?最大成員的大小?數據存儲特性1. 所…

[ LeetCode優選算法專題一雙指針-----盛最多的水]

1.題目鏈接 LeetCode盛最多的水 2.題目描述 3.題目解析 問題本質分析 "盛最多水的容器" 問題可以抽象為:在坐標軸上有 n 條垂直線段,第 i 條線段的兩個端點分別是 (i, 0) 和 (i, height [i])。找到兩條線段,使得它們與 x 軸共同…

舊筆記本電腦如何安裝飛牛OS

01引言隨著電子產品的更新換代,我們有很多的電子產品已經滿足不了現在的工作需求和日常娛樂了,比如:用了很久厚重筆記本電腦放在現在辦公也是有點吃力了,我們現在換新了舊的還不想放在那里吃灰,怎么辦呢?我…

某金服Java面試終極指南:25題完整解析與場景化方案

涵蓋分布式鎖、緩存、事務、高并發等金融系統核心考點,附解決方案與抗風險設計一、分布式鎖深度解決方案 1. Redis分布式鎖完整實現 // 原子加鎖 防死鎖 String uuid UUID.randomUUID().toString(); Boolean locked redisTemplate.opsForValue().setIfAbsent(&qu…

MATLAB 2025a的下載以及安裝,安裝X310的測試附加功能(附加安裝包)

首先將安裝包下載到本地中之后解壓該文件夾,打開文件發現有兩個文件,其中crach文件夾中是破解matlab所用到的文件。而另一個壓縮包就是需要安裝的文件,要先解壓在安裝。在安裝之前將網絡斷開,不然可能破解不成功,先進入…

Scala實用編程(附電子書資料)

概述 Scala 是一種多范式編程語言,結合了面向對象編程(OOP)和函數式編程(FP)的特性電子書資料:https://pan.quark.cn/s/88737d4a680d Scala 的核心特點多范式融合 既支持面向對象編程(類、繼承、…

數據結構(8)雙向鏈表

目錄 一、概念與結構 二、雙向鏈表的實現 1、初始化 2、尾插 3、頭插 4、尾刪 5、頭刪 6、在指定位置之后插入結點 7、刪除指定位置的結點 三、完整參考代碼 一、概念與結構 這里的雙向鏈表是指帶頭的的雙向循環鏈表,這里的“帶頭”和之前所說的“頭結…

【DeepSeek-R1 】分詞系統架構解析

文章目錄 ??前言 ?? 1. SentencePiece Unigram 的核心原理 1.1 算法基礎框架 1.2 核心數學原理 1.3 與BPE/WordPiece的對比 ?? 2. DeepSeek-R1 分詞器實現細節 2.1 詞表結構設計 2.2 關鍵特性實現 ?? 3. 性能優化關鍵技術 3.1 加速策略對比 3.2 編碼過程偽代碼 ?? 4.…

Linux自主實現shell

以下是在Linux操作系統 centos7版本下實現的shell &#xff0c;該shell具備bash的基礎功能&#xff0c;無上下鍵輸入歷史命令功能&#xff0c;刪除字符或命令時按住Ctrl Back #include<stdio.h> #include<stdlib.h> #include<string.h> #include<unistd.…

vue+elementUI上傳圖片至七牛云組件封裝及循環使用

1.效果&#xff08;解決循環組件賦值問題&#xff09; 廢話不多說直接上代碼 2.下載七牛云依賴 npm install qiniu-js # 或者使用 yarn yarn add qiniu-js3.在vue組件中引入 import * as qiniu from qiniu-js4.在components文件夾下創建UploadImg1/uploadImg.vue組件 <templ…

2025年6月電子學會青少年軟件編程(C語言)等級考試試卷(一級)

答案和更多內容請查看網站&#xff1a;【試卷中心 -----> 電子學會 ----> C/C ----> 一級】 網站鏈接 青少年軟件編程歷年真題模擬題實時更新 一、編程題 第 1 題 希望如光 題目描述 在充滿挑戰的生活中&#xff0c;希望往往是支撐人們穿越黑暗的核心力量。這…

拒絕復雜,AI圖表制作簡單化

在信息爆炸的時代&#xff0c;數據可視化已成為傳遞信息的核心手段。無論是職場匯報中的業績分析&#xff0c;還是學術研究里的實驗數據呈現&#xff0c;一張清晰直觀的圖表往往能勝過千言萬語。而 AI 技術的介入&#xff0c;徹底改變了圖表制作的傳統模式 —— 它不僅讓零基礎…

easypoi生成多個sheet的動態表頭的實現

在使用 EasyPOI 導出 Excel 時&#xff0c;生成多個 Sheet 且每個 Sheet 的表頭是動態的&#xff08;即每個 Sheet 的列數和列名可能不同&#xff09;&#xff0c;可以通過如下方式實現&#xff1a;? 實現原理簡述 使用 Workbook workbook ExcelExportUtil.exportExcel(expor…

移除鏈表元素+反轉鏈表+鏈表的中間節點+合并兩個有序鏈表+環形鏈表約瑟夫問題+分割鏈表

一、移除鏈表元素 給你一個鏈表的頭節點 phead 和一個整數 val &#xff0c;請你刪除鏈表中所有滿足 Node.val val 的節點&#xff0c;并返回 新的頭節點 (列表中的節點數目在范圍 [0, 104] 內) 示例&#xff1a;輸入&#xff1a;head [1,2,6,3,4,5,6], val 6 …

vue3+arcgisAPI4示例:軌跡點模擬移動(附源碼下載)

demo源碼運行環境以及配置運行環境&#xff1a;依賴Node安裝環境&#xff0c;需要安裝Node。 運行工具&#xff1a;vscode或者其他工具。 配置方式&#xff1a;下載demo源碼&#xff0c;vscode打開&#xff0c;然后順序執行以下命令&#xff1a; &#xff08;1&#xff09;下載…

Design Compiler:Milkyway庫的創建與使用

相關閱讀 Design Compilerhttps://blog.csdn.net/weixin_45791458/category_12738116.html?spm1001.2014.3001.5482 DC Ultra推出了拓撲模式&#xff0c;在綜合時會對標準單元進行粗布局(Coarse Placement)并使用虛擬布線(Virtual Routing)技術計算互聯延遲&#xff0c;關于拓…

嵌入式教學的云端革命:高精度仿真如何重塑倒車雷達實驗與工程教育——深圳航天科技創新研究院賦能新一代虛實融合實訓平臺

一、嵌入式教學的困境與破局之道 在傳統嵌入式系統教學中&#xff0c;硬件依賴始終是核心痛點。以“倒車雷達實驗”為例&#xff0c;學生需操作STM32開發板、超聲波傳感器、蜂鳴器等硬件&#xff0c;面臨設備損耗、接線錯誤、調試效率低等問題。更關鍵的是&#xff0c;物理硬件…

flutter-boilerplate-project 學習筆記

項目地址&#xff1a; https://github.com/zubairehman/flutter_boilerplate_project/tree/master 樣板包含創建新庫或項目所需的最小實現。存儲庫代碼預加載了一些基本組件&#xff0c;例如基本應用程序架構、應用程序主題、常量和創建新項目所需的依賴項。通過使用樣板代碼…

集成電路學習:什么是CMSIS微控制器軟件接口標準

CMSIS,即Cortex Microcontroller Software Interface Standard(Cortex微控制器軟件接口標準),是由ARM公司與多家不同的芯片和軟件供應商緊密合作定義的一個標準。該標準旨在為基于ARM Cortex處理器的微控制器提供一套與供應商無關的硬件抽象層,從而簡化軟件的開發、重用,…

由淺入深使用LangGraph創建一個Agent工作流

創建一個簡單的工作流&#xff1a;Start ——> 節點1(固定輸入輸出) ——> Endfrom langchain_core.messages import SystemMessage, HumanMessage, AIMessage from langgraph.graph import StateGraph, START, END from typing_extensions import TypedDict from typing…