本文介紹雲訊息佇列 RocketMQ 版中訊息(Message)的定義、模型關係、內部屬性、行為約束及使用建議。
定義
訊息是雲訊息佇列 RocketMQ 版中的最小數據傳輸單元。生產者將業務資料的負載和拓展屬性包裝成訊息發送到雲訊息佇列 RocketMQ 版服務端,服務端按照相關語義將訊息投遞到消費端進行消費。
雲訊息佇列 RocketMQ 版的訊息模型具備如下特點:
訊息不可變性
訊息本質上是已經產生並確定的事件,一旦產生後,訊息的內容不會發生改變。即使經過傳輸鏈路的控制也不會發生變化,消費端擷取的訊息都是唯讀訊息視圖。
訊息持久化
雲訊息佇列 RocketMQ 版會預設對訊息進行持久化,即將接收到的訊息儲存到雲訊息佇列 RocketMQ 版服務端的隱藏檔中,保證訊息的可回溯性和系統故障情境下的可恢複性。
模型關係
在整個雲訊息佇列 RocketMQ 版的領域模型中,訊息所處的流程和位置如下:
訊息由生產者初始化並發送到雲訊息佇列 RocketMQ 版服務端。
訊息按照到達雲訊息佇列 RocketMQ 版服務端的順序儲存到隊列中。
消費者按照指定的訂閱關係從雲訊息佇列 RocketMQ 版服務端中擷取訊息並消費。
訊息內部屬性
系統保留屬性
業務自訂屬性
訊息負載
行為約束
訊息大小不得超過其類型所對應的限制,否則訊息會發送失敗。
系統預設的訊息最大限制如下:
普通和順序訊息: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);