訊息
本節說明 Apache RocketMQ 中訊息的定義、模型關係、內部屬性和行為約束。此主題還提供訊息的使用說明。
定義
訊息是 Apache RocketMQ 中資料傳輸的最小單位。生產者將業務資料的負載和延伸屬性封裝到訊息中,然後將訊息傳送給 Apache RocketMQ 代理程式。然後,代理程式根據相關語義將訊息傳遞給消費者。
Apache RocketMQ 中訊息模型的特點是
- 不可變性:訊息是產生的事件。訊息產生後,訊息的內容不會變更。即使訊息通過傳輸通道,訊息的內容仍保持不變。消費者取得的訊息是唯讀訊息。
- 持久性:預設情況下,Apache RocketMQ 會保留訊息。收到的訊息會儲存在 Apache RocketMQ 代理程式的儲存檔案中,以確保在系統發生故障時可以追蹤和還原訊息。
模型關係
下圖顯示 Apache RocketMQ 網域模型中訊息的位置。
訊息由生產者初始化,並傳送至 Apache RocketMQ 代理程式。
訊息依據在 Apache RocketMQ 代理程式接收到的順序,儲存在佇列中。
消費者根據指定的訂閱,從 Apache RocketMQ 代理程式取得並使用訊息。
內部屬性
系統保留屬性
主題名稱
定義:訊息所屬主題的名稱。主題名稱在叢集中是全球唯一的。如需更多資訊,請參閱主題。
值:從客戶端的 SDK 取得。
訊息類型
定義:訊息的類型。
值:從客戶端的 SDK 取得。Apache RocketMQ 支援下列訊息類型
訊息佇列
定義:訊息所屬的佇列。如需更多資訊,請參閱訊息佇列。
值:由代理程式指定和填入。
訊息偏移量
定義:目前訊息在佇列中儲存的位置。如需更多資訊,請參閱運作機制。
值:由代理程式指定和填入。有效值:0 到 Long.Max。
訊息 ID
定義:訊息的唯一識別碼。每個訊息的 ID 在叢集中是全球唯一的。
值:由生產者客戶端自動產生。訊息 ID 是由數字和英文字母組成的 32 個字元字串。
(選用) 訊息金鑰
定義:訊息的索引金鑰清單。您可以設定不同的金鑰來區分訊息,並快速找出訊息。
值:由生產者客戶端定義。
(選填) 訊息標籤
定義:用於過濾訊息的標籤。使用者可以根據標籤過濾訊息,只接收包含指定標籤的訊息。
值:由生產者客戶端定義。
限制:每個訊息只能指定一個標籤。
(選填) 預定時間
定義:在預定時間場景中,訊息觸發延時投遞時使用的毫秒級時間戳。更多資訊,請參閱 延時訊息。
值:由訊息生產者定義。
限制:最長持續時間為 40 天。
訊息發送時間
定義:訊息發送時,生產者客戶端的本地毫秒級時間戳。
值:由生產者客戶端填充。
注意:客戶端時間可能與代理時間不同。這種情況下,訊息發送時間基於客戶端時間。
訊息儲存時間戳
定義:訊息儲存時,Apache RocketMQ 代理的本地毫秒級時間戳。
對於延時訊息和事務訊息,訊息保留時間是訊息生效時,顯示給使用者的代理時間。
值:由代理填充。
注意:客戶端時間可能與代理時間不同。這種情況下,訊息保留時間基於代理時間。
重試次數
定義:訊息消費失敗後,Apache RocketMQ 代理重新傳遞訊息的次數。每次重試,最大重試次數增加 1。更多資訊,請參閱 消費重試。
值:由代理標記。訊息第一次被消費時,重試次數為 0。訊息第一次消費失敗時,重試次數為 1。
訊息自訂屬性
自訂屬性
定義:生產者可以指定的延伸資訊。
值:生產者根據字串中的鍵值對指定。
訊息負載
定義:服務訊息的實際訊息資料。
值:由生產者序列化,並以二進位元組傳輸。
限制:請參閱 參數限制。
行為限制
訊息大小不能超過上限。如果訊息大小超過對應的上限,訊息將發送失敗。
以下說明訊息的預設限制
- 訊息最大大小:4 MB
使用說明
不建議單一訊息過載傳輸。
Apache RocketMQ 是一種傳輸業務事件資料的訊息中間件。如果訊息大小過大,可能會造成網路傳輸層過載。這會影響錯誤重試和節流。我們建議您限制單一訊息事件的資料大小。
如果生產環境需要過載傳輸,我們建議您根據固定大小拆分訊息,或使用檔案儲存方法。
訊息的不變性
Apache RocketMQ broker 版本 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);