本文介紹云消息隊列 RocketMQ 版中消息(Message)的定義、模型關系、內部屬性、行為約束及使用建議。
定義
消息是云消息隊列 RocketMQ 版中的最小數據傳輸單元。生產者將業務數據的負載和拓展屬性包裝成消息發送到云消息隊列 RocketMQ 版服務端,服務端按照相關語義將消息投遞到消費端進行消費。
云消息隊列 RocketMQ 版的消息模型具備如下特點:
- 消息不可變性
消息本質上是已經產生并確定的事件,一旦產生后,消息的內容不會發生改變。即使經過傳輸鏈路的控制也不會發生變化,消費端獲取的消息都是只讀消息視圖。
- 消息持久化
云消息隊列 RocketMQ 版會默認對消息進行持久化,即將接收到的消息存儲到云消息隊列 RocketMQ 版服務端的存儲文件中,保證消息的可回溯性和系統故障場景下的可恢復性。
模型關系
在整個云消息隊列 RocketMQ 版的領域模型中,消息所處的流程和位置如下:
- 消息由生產者初始化并發送到云消息隊列 RocketMQ 版服務端。
- 消息按照到達云消息隊列 RocketMQ 版服務端的順序存儲到隊列中。
- 消費者按照指定的訂閱關系從云消息隊列 RocketMQ 版服務端中獲取消息并消費。
消息內部屬性
系統保留屬性
主題名稱
- 定義:當前消息所屬的主題的名稱。集群內全局唯一。更多信息,請參見主題(Topic)。
- 取值:從客戶端SDK接口獲取。
消息類型
消息隊列
- 定義:實際存儲當前消息的隊列。更多信息,請參見隊列(MessageQueue)。
- 取值:由服務端指定并填充。
消息位點
- 定義:當前消息存儲在隊列中的位置。更多信息,請參見消費進度原理。
- 取值:由服務端指定并填充。取值范圍:0~long.Max。
消息ID
- 定義:消息的唯一標識,集群內每條消息的ID全局唯一。
- 取值:生產者客戶端系統自動生成。固定為數字和大寫字母組成的32位字符串。
索引Key列表(可選)
- 定義:消息的索引鍵,可通過設置不同的Key區分消息和快速查找消息。
- 取值:由生產者客戶端定義。
過濾標簽Tag(可選)
- 定義:消息的過濾標簽。消費者可通過Tag對消息進行過濾,僅接收指定標簽的消息。
- 取值:由生產者客戶端定義。
- 約束:一條消息僅支持設置一個標簽。
定時時間(可選)
消息發送時間
- 定義:消息發送時,生產者客戶端系統的本地毫秒級時間戳。
- 取值:由生產者客戶端系統填充。
- 說明:客戶端系統時鐘和服務端系統時鐘可能存在偏差,消息發送時間是以客戶端系統時鐘為準。
消息保存時間戳
- 定義:消息在云消息隊列 RocketMQ 版服務端完成存儲時,服務端系統的本地毫秒級時間戳。
對于定時消息和事務消息,消息保存時間指的是消息生效對消費方可見的服務端系統時間。
- 取值:由服務端系統填充。
- 說明:客戶端系統時鐘和服務端系統時鐘可能存在偏差,消息保留時間是以服務端系統時鐘為準。
消費重試次數
- 定義:消息消費失敗后,云消息隊列 RocketMQ 版服務端重新投遞的次數。每次重試后,重試次數加1。更多信息,請參見消費重試。
- 取值:由服務端系統標記。首次消費,重試次數為0;消費失敗首次重試時,重試次數為1。
業務自定義屬性
自定義屬性對
- 定義:生產者可以自定義設置的擴展信息。
- 取值:由消息生產者自定義,按照字符串鍵值對設置。
消息負載
消息負載
- 定義:業務消息的實際報文數據。
- 取值:由生產者負責序列化編碼,按照二進制字節傳輸。
- 約束:請參見參數限制。
行為約束
消息大小不得超過其類型所對應的限制,否則消息會發送失敗。
系統默認的消息最大限制如下:
- 普通和順序消息:4 MB
- 事務和定時或延時消息:64 KB
使用建議
單條消息不建議傳輸超大負載
作為一款消息中間件產品,云消息隊列 RocketMQ 版一般傳輸的是都是業務事件數據。單個原子消息事件的數據大小需要嚴格控制,如果單條消息過大容易造成網絡傳輸層壓力,不利于異常重試和流量控制。
生產環境中如果需要傳輸超大負載,建議按照固定大小做報文拆分,或者結合文件存儲等方法進行傳輸。
消息中轉時做好不可變設計
云消息隊列 RocketMQ 版服務端5.x版本中,消息本身不可編輯,消費端獲取的消息都是只讀消息視圖。
但在歷史版本3.x和4.x版本中消息不可變性沒有強約束,因此如果您需要在使用過程中對消息進行中轉操作,務必將消息重新初始化。
- 正確使用示例如下:
Message m = Consumer.receive(); Message m2= MessageBuilder.buildFrom(m); Producer.send(m2);
- 錯誤使用示例如下:
Message m = Consumer.receive(); m.update(); Producer.send(m);
文檔內容是否對您有幫助?