最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

RocketMQ?消息Message的結(jié)構(gòu)和使用方式詳解

 更新時間:2025年08月01日 10:46:20   作者:csdn_tom_168  
Message是RocketMQ的數(shù)據(jù)包,它不僅是業(yè)務(wù)數(shù)據(jù)的載體,更是路由、過濾、追蹤、延遲、事務(wù)等功能的基礎(chǔ),掌握Message,你就掌握了RocketMQ的語言,本文給大家介紹什么是?Message及理解Message的結(jié)構(gòu)、屬性、生命周期和使用方式,感興趣的朋友一起看看吧

?? RocketMQ 消息(Message)詳解

在 Apache RocketMQ 中,消息(Message) 是數(shù)據(jù)傳輸?shù)淖钚卧巧a(chǎn)者與消費者之間通信的“載體”。理解 Message 的結(jié)構(gòu)、屬性、生命周期和使用方式,是掌握 RocketMQ 的核心基礎(chǔ)。

推薦閱讀:深入理解Apache RocketMQ 中Message 消息的核心概念

一、什么是 Message?

? 定義:

Message 是 RocketMQ 中封裝實際業(yè)務(wù)數(shù)據(jù)的對象,包含消息體(Body)和一系列元數(shù)據(jù)(如 Topic、Tag、Key、Properties 等),用于在生產(chǎn)者與消費者之間傳遞信息。

類比:就像一封信,信紙是內(nèi)容(Body),信封上寫著收件人(Topic)、標簽(Tag)、編號(Key)等信息。

二、Message 的核心結(jié)構(gòu)

一個 Message 對象主要由以下幾個部分組成:

字段類型是否必填說明
TopicString? 必填消息所屬的主題,用于路由和分類
Bodybyte[]? 必填消息的實際內(nèi)容,通常為序列化后的 JSON、Protobuf 等
TagsString? 可選子分類標簽,用于消費者過濾(如 CREATE, CANCEL
KeysString? 可選消息的唯一鍵或業(yè)務(wù)主鍵(如訂單號),用于排查、索引
Flagint? 可選消息標志位(如是否壓縮)
DelayTimeLevelint? 可選延遲消息級別(1~18),實現(xiàn)定時投遞
PropertiesMap<String, String>? 可選自定義屬性,RocketMQ 內(nèi)部也使用它存儲系統(tǒng)屬性

三、Message 各字段詳解

1.Topic(主題)

  • 消息的邏輯分類,決定消息被發(fā)送到哪個隊列。
  • 必須提前創(chuàng)建或允許自動創(chuàng)建。
  • 示例:ORDER_TOPIC, USER_LOG_TOPIC
new Message("ORDER_TOPIC", ...);

2.Body(消息體)

  • 實際傳輸?shù)臄?shù)據(jù),必須是字節(jié)數(shù)組。
  • 通常通過 JSON、Protobuf、Hessian 等序列化框架編碼。
String content = "{\"orderId\":\"1001\",\"userId\":10086}";
Message msg = new Message(topic, tag, content.getBytes(StandardCharsets.UTF_8));

?? 注意:

  • 單條消息大小默認最大 4MB(可配置)
  • 過大消息會影響性能,建議拆分或使用外部存儲(如上傳文件后傳 URL)

3.Tags(標簽)

  • 用于對同一 Topic 下的消息進行二次分類。
  • 消費者可通過 subscribe("Topic", "TagA || TagB") 進行過濾。
// 發(fā)送
new Message("ORDER_TOPIC", "CREATE", "創(chuàng)建訂單".getBytes());
new Message("ORDER_TOPIC", "PAY", "支付完成".getBytes());
// 訂閱 CREATE 類型消息
consumer.subscribe("ORDER_TOPIC", "CREATE");

? 優(yōu)勢:輕量級過濾,避免消費者接收無關(guān)消息。

?? 注意:Tags 是字符串匹配,不支持正則(但支持 * 通配和 || 多選)

4.Keys(消息鍵)

  • 為消息設(shè)置唯一標識或業(yè)務(wù)主鍵(如訂單號、用戶ID)。
  • 支持通過 mqadmin queryMsgByKey 命令查詢消息。
  • 支持索引,便于問題排查。
Message msg = new Message(...);
msg.setKeys("ORDER_20240501001");

? 建議:關(guān)鍵業(yè)務(wù)消息務(wù)必設(shè)置 Keys,便于追蹤。

5.Properties(屬性)

  • 鍵值對形式的擴展字段,可用于:
    • 存儲自定義上下文(如 traceId、tenantId)
    • RocketMQ 內(nèi)部使用(如 RECONSUME_TIME、DELAYTRAN_MSG
msg.putUserProperty("traceId", "abc123");
msg.putUserProperty("source", "web");

?? 注意:系統(tǒng)屬性以 PREFIX_SYS_PROP 開頭,不要沖突。

6.DelayTimeLevel(延遲級別)

  • 設(shè)置消息延遲投遞時間,實現(xiàn)“定時任務(wù)”功能。
  • 取值范圍:1~18,對應(yīng)不同延遲時間:
級別時間
11s
25s
310s
430s
51m
62m
73m
84m
95m
106m
117m
128m
139m
1410m
1520m
1630m
171h
182h
Message msg = new Message("DELAY_TOPIC", "TAG", "延遲消息".getBytes());
msg.setDelayTimeLevel(5); // 延遲1分鐘
producer.send(msg);

?? 注意:延遲消息不保證精確時間,存在輕微誤差。

四、Message 的生命周期

1. 生產(chǎn)者創(chuàng)建 Message 對象
   ↓
2. 發(fā)送到 Broker(寫入 CommitLog)
   ↓
3. 構(gòu)建 ConsumeQueue 和 IndexFile
   ↓
4. 消費者拉取消息(根據(jù) Topic + Queue)
   ↓
5. 處理成功 → 提交 Offset
   ↓
6. 消息過期(默認 72 小時)→ 被刪除

? 消息是持久化存儲的,即使消費者未上線,消息也不會丟失。

五、Message 的存儲機制

雖然 Message 是邏輯對象,但在 Broker 端有嚴格的物理存儲結(jié)構(gòu):

1.CommitLog

  • 所有消息按到達順序追加寫入 CommitLog 文件(順序?qū)?,高性能?/li>
  • 每個消息包含:Topic、Queue、Body、Properties 等完整信息

2.ConsumeQueue

  • 每個 Topic 的每個 MessageQueue 對應(yīng)一個 ConsumeQueue
  • 存儲消息的邏輯偏移量、大小、物理位置,用于快速定位消息
ConsumeQueue/{Topic}/{QueueId}/
   ├── 00000000000000000000
   └── ...

3.IndexFile

  • 可選索引文件,支持通過 Keys 或時間范圍 查詢消息
  • 用于排查問題(如“查找某個訂單的消息”)
IndexFile/index_1714567890000

六、Message 的發(fā)送方式回顧

方式說明
同步發(fā)送阻塞等待結(jié)果,適用于關(guān)鍵消息
異步發(fā)送回調(diào)通知結(jié)果,高吞吐場景
單向發(fā)送不關(guān)心結(jié)果,日志類消息
事務(wù)消息半消息 + 本地事務(wù) + 提交/回滾

所有方式發(fā)送的都是 Message 對象。

七、最佳實踐與注意事項

實踐說明
? 設(shè)置 Topic 和 Tag合理分類,便于管理和過濾
? 關(guān)鍵消息設(shè)置 Keys便于通過 mqadmin 查詢
? 控制 Body 大小≤ 4MB,避免影響性能
? 使用 UTF-8 編碼防止亂碼
? 避免空 Body可能導(dǎo)致異常
? 合理使用延遲消息替代部分定時任務(wù),但不要濫用
? 自定義屬性用 putUserProperty避免覆蓋系統(tǒng)屬性

八、常見問題排查

問題原因解決方案
MessageExt is null拉取超時或無消息正?,F(xiàn)象,重試即可
msg put message to store error消息過大或磁盤滿檢查大小限制和磁盤空間
延遲消息未按時投遞時間誤差或 Broker 壓力大接受輕微延遲,或使用外部調(diào)度系統(tǒng)
通過 Key 查不到消息IndexFile 未生成或已過期檢查 messageIndexEnable 配置
消息重復(fù)網(wǎng)絡(luò)重試、Rebalance消費者做冪等處理

? 總結(jié):Message 核心要點

維度說明
角色消息傳輸?shù)幕締卧?/td>
組成Topic + Body + Tags + Keys + Properties + Delay
大小限制默認 ≤ 4MB
存儲方式順序?qū)?CommitLog,索引通過 ConsumeQueue 和 IndexFile
可查詢性支持按 Key、時間、Offset 查詢
擴展性支持自定義屬性,靈活傳遞上下文
高級功能支持延遲、事務(wù)、順序消息

?? 一句話總結(jié):

Message 是 RocketMQ 的“數(shù)據(jù)包” —— 它不僅是業(yè)務(wù)數(shù)據(jù)的載體,更是路由、過濾、追蹤、延遲、事務(wù)等功能的基礎(chǔ)。
設(shè)計好 Message 的結(jié)構(gòu)與屬性,才能讓消息系統(tǒng)真正高效、可靠、易維護。

掌握 Message,你就掌握了 RocketMQ 的“語言”。

到此這篇關(guān)于RocketMQ 消息Message的結(jié)構(gòu)和使用方式詳解的文章就介紹到這了,更多相關(guān)RocketMQ 消息Message內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • Spring MVC學(xué)習(xí)之DispatcherServlet請求處理詳析

    Spring MVC學(xué)習(xí)之DispatcherServlet請求處理詳析

    這篇文章主要給大家介紹了關(guān)于Spring MVC學(xué)習(xí)教程之DispatcherServlet請求處理的相關(guān)資料,文中通過示例代碼介紹的非常詳細,對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面來一起學(xué)習(xí)學(xué)習(xí)吧
    2018-11-11
  • 詳解SpringMVC攔截器配置及使用方法

    詳解SpringMVC攔截器配置及使用方法

    本篇文章主要介紹了SpringMVC攔截器配置及使用方法,小編覺得挺不錯的,現(xiàn)在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧
    2017-09-09
  • 如何使用Java?8函數(shù)式編程優(yōu)雅處理多層嵌套數(shù)據(jù)

    如何使用Java?8函數(shù)式編程優(yōu)雅處理多層嵌套數(shù)據(jù)

    Java8是Java語言歷史上的一個重大更新,它帶來了許多新的特性和改進,其中函數(shù)式編程的引入是其亮點之一,這篇文章主要介紹了如何使用Java?8函數(shù)式編程優(yōu)雅處理多層嵌套數(shù)據(jù)的相關(guān)資料,需要的朋友可以參考下
    2026-01-01
  • java模式匹配之蠻力匹配

    java模式匹配之蠻力匹配

    這篇文章主要介紹了java模式匹配之蠻力匹配的相關(guān)資料和代碼,需要的朋友可以參考下
    2015-05-05
  • Java?List一些常用方法完全攻略

    Java?List一些常用方法完全攻略

    List就是一個線性表,即n個具有相同類型元素的有限序列,在該序列上可以執(zhí)行增刪改查以及變量等操作,這篇文章主要介紹了Java List一些常用方法的相關(guān)資料,需要的朋友可以參考下
    2026-04-04
  • Java中的指令重排詳解

    Java中的指令重排詳解

    在 Java 中,指令重排是一種性能優(yōu)化技術(shù),它涉及到編譯器和處理器對程序中指令的執(zhí)行順序進行調(diào)整,以提高執(zhí)行效率,本文給大家詳細介紹了Java中的指令重排,需要的朋友可以參考下
    2023-12-12
  • 教你輕松制作java音樂播放器

    教你輕松制作java音樂播放器

    這篇文章主要介紹了如何編寫屬于自己的java音樂播放器,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2016-10-10
  • Java中的Redis是什么意思

    Java中的Redis是什么意思

    Redis是一個非常強大的工具,它可以用來實現(xiàn)很多有趣的應(yīng)用,還可以使用Redis來實現(xiàn)分布式鎖,這樣你就可以在多線程或多進程的環(huán)境下同步代碼,這篇文章主要介紹了Java中的Redis是什么意思,需要的朋友可以參考下
    2023-08-08
  • 一文搞懂Java MD5算法的原理及實現(xiàn)

    一文搞懂Java MD5算法的原理及實現(xiàn)

    MD5信息摘要算法,一種被廣泛使用的密碼散列函數(shù),可以產(chǎn)生出一個128位(16字節(jié))的散列值(hash value),用于確保信息傳輸完整一致。本文將詳解MD5算法的原理及實現(xiàn),感興趣的可以了解一下
    2022-06-06
  • MyBatisPlus 主鍵策略的實現(xiàn)(4種)

    MyBatisPlus 主鍵策略的實現(xiàn)(4種)

    MyBatis Plus 集成了多種主鍵策略,幫助用戶快速生成主鍵,本文主要介紹了MyBatisPlus主鍵策略的實現(xiàn),具有一定的參考價值,感興趣的可以了解一下
    2023-10-10

最新評論

县级市| 砀山县| 江安县| 华安县| 武夷山市| 临桂县| 琼结县| 囊谦县| 双柏县| 沧源| 石渠县| 探索| 皋兰县| 冷水江市| 泗阳县| 乌审旗| 定西市| 蓬溪县| 衡东县| 吉林省| 兴业县| 卢龙县| 甘孜县| 包头市| 资源县| 贺兰县| 盐山县| 蛟河市| 安远县| 木里| 本溪市| 洛宁县| 通城县| 盐源县| 江西省| 潍坊市| 左贡县| 彩票| 平山县| 根河市| 阿克苏市|