跳到主要內容
版本:5.0

訊息

本節說明 Apache RocketMQ 中訊息的定義、模型關係、內部屬性和行為約束。此主題還提供訊息的使用說明。

定義

訊息是 Apache RocketMQ 中資料傳輸的最小單位。生產者將業務資料的負載和延伸屬性封裝到訊息中,然後將訊息傳送給 Apache RocketMQ 代理程式。然後,代理程式根據相關語義將訊息傳遞給消費者。

Apache RocketMQ 中訊息模型的特點是

  • 不可變性:訊息是產生的事件。訊息產生後,訊息的內容不會變更。即使訊息通過傳輸通道,訊息的內容仍保持不變。消費者取得的訊息是唯讀訊息。
  • 持久性:預設情況下,Apache RocketMQ 會保留訊息。收到的訊息會儲存在 Apache RocketMQ 代理程式的儲存檔案中,以確保在系統發生故障時可以追蹤和還原訊息。

模型關係

下圖顯示 Apache RocketMQ 網域模型中訊息的位置。消息

  1. 訊息由生產者初始化,並傳送至 Apache RocketMQ 代理程式。

  2. 訊息依據在 Apache RocketMQ 代理程式接收到的順序,儲存在佇列中。

  3. 消費者根據指定的訂閱,從 Apache RocketMQ 代理程式取得並使用訊息。

內部屬性

系統保留屬性

主題名稱

  • 定義:訊息所屬主題的名稱。主題名稱在叢集中是全球唯一的。如需更多資訊,請參閱主題

  • 值:從客戶端的 SDK 取得。

訊息類型

  • 定義:訊息的類型。

  • 值:從客戶端的 SDK 取得。Apache RocketMQ 支援下列訊息類型

    • 一般:一般訊息。一般訊息不需要特殊語意,且與其他一般訊息無關聯。

    • FIFO:FIFO 訊息。Apache RocketMQ 使用訊息群組來決定指定訊息集的順序。訊息會依據傳送順序傳遞。

    • 延遲:延遲訊息。您可以指定延遲,讓訊息在延遲時間過後才提供給消費者使用,而不是在產生時立即傳遞訊息。

    • 交易:交易訊息。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);