跳至主要內容
版本:5.0

主題

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

定義

主題在邏輯上是一個佇列集合;我們可以發布訊息到主題或從主題接收訊息。

主題提供以下好處

  • 訊息分類和訊息隔離:當您根據 Apache RocketMQ 建立訊息服務時,建議您使用不同的主題來管理不同業務類型的訊息,以進行隔離儲存和訂閱。
  • 身分和權限管理:Apache RocketMQ 中的訊息是匿名的。您可以使用主題對特定類別的訊息執行身分和權限管理。

模型關係

下圖顯示 Apache RocketMQ 網域模型中主題的位置。 主題

在 Apache RocketMQ 中,主題是定義所有訊息資源的頂層儲存容器。主題是一個邏輯概念,而不是儲存訊息的實際單位。

主題包含一個或多個佇列。訊息儲存和可擴充性是根據佇列來實作的。主題的所有約束和屬性設定都是根據主題中的佇列來實作的。

內部屬性

主題名稱

  • 定義:主題的名稱。主題名稱識別主題,且在叢集中是全球唯一的。

  • 值:在建立主題時,由使用者指定主題名稱。

  • 限制:請參閱 參數限制

佇列

  • 定義:實際儲存訊息的儲存單位。主題包含一個或多個佇列。如需更多資訊,請參閱 訊息佇列

  • 值:您可以在建立主題時指定佇列數目。Apache RocketMQ 會將指定數目的佇列分配給主題。

  • 限制:主題必須至少包含一個佇列。

訊息類型

  • 定義:為主題指定的訊息類型。

  • 值:在 Apache RocketMQ 中建立主題時,請為主題選擇下列訊息類型之一

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

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

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

    • 交易:交易訊息。Apache RocketMQ 支援分散式交易訊息,並確保資料庫更新和訊息呼叫的交易一致性。

  • 限制:從版本 5.0 開始,Apache RocketMQ 支援強制驗證訊息類型,也就是說,每個主題只允許傳送單一類型的訊息。這可以更方便地操作和管理生產系統,並避免混淆。但是,為了確保與版本 4.x 的向下相容性,驗證功能預設為啟用。

行為限制

強制訊息類型驗證

Apache RocketMQ 5.x 版允許您為主題指定訊息類型。這樣,您可以在獨立的主題中管理和處理指定類型的訊息。Apache RocketMQ 會強制驗證傳送的訊息類型和訊息傳送到的主題的訊息類型。如果訊息類型驗證失敗,則會拒絕訊息傳遞要求,並傳回類型不符的錯誤。下列驗證規則適用

  • 一致的訊息類型。您要傳送的訊息必須使用與您要將訊息傳送到的主題所指定訊息類型相同的訊息類型。

  • 傳送至主題的訊息類型只能有一種。您要傳送至主題的訊息必須使用相同的訊息類型。只能為主題指定一種訊息類型。

資訊

為了確保與 4.x 版的向下相容性,預設會停用上述驗證功能。建議使用伺服器參數「enableTopicMessageTypeCheck」啟用驗證。

常見使用錯誤範例

  • 傳送與主題訊息類型不符的訊息例如,啟動要求將交易訊息傳送至使用 FIFO 訊息類型的主題會遭到拒絕,並傳回類型不符的錯誤。

  • 傳送不同類型的訊息至主題例如,啟動要求將一般訊息和 fifo 訊息傳送至使用一般訊息類型的主題會遭到拒絕,並傳回類型不符的錯誤。

版本相容性

強制訊息類型驗證僅在 Apache RocketMQ 5.x 版中提供。Apache RocketMQ 4.x 和 3.x 版的 SDK 不支援強制訊息類型驗證。如果您使用 4.x 或 3.x 版,請確保訊息類型一致。

建議您使用 Apache RocketMQ 5.x 版。

使用範例

在 Apache RocketMQ 5.0 中建立主題時,建議使用 mqadmin 工具。不過,值得注意的是,訊息類型需要新增為屬性參數。以下是一個範例

sh mqadmin updateTopic -n <nameserver_address> -t <topic_name> -c <cluster_name> -a +message.type=<message_type>

其中,message_type 參數可以根據訊息類型設定為 Normal/FIFO/Delay/Transaction。如果未指定,則預設為 Normal 類型。

使用注意事項

根據您的業務需求規劃主題

在 Apache RocketMQ 中規劃主題時,建議您使用一個主題來處理針對業務面向的相同業務模組產生的訊息。規劃主題時,請注意下列因素

  • 訊息類型:使用不同的主題來儲存不同類型的訊息。例如,您可以建立兩個主題來分別儲存 FIFO 訊息和一般訊息。

  • 訊息關聯性:使用不同的主題來儲存未直接關聯的訊息。例如,為未關聯的淘寶交易訊息和盒馬物流訊息建立兩個主題。如果訊息直接關聯,您可以使用相同的主題。例如,您可以為在淘寶上針對男裝類別和女裝類別產生的訂單訊息建立一個主題。如果業務量或子模組需要更細緻的主題,您也可以針對可以分類到一個主題的訊息使用不同的主題。

  • 訊息量和即時性:使用不同的主題來處理在量或即時性上有差異的訊息。例如,不要針對一個產生少量時間敏感訊息的業務和一個產生數兆訊息的業務使用相同的主題。這可以防止時間敏感訊息等待太久才能使用。

正確主題規劃範例:在電子商務場景中,您可以使用一個主題來處理訂單相關訊息,例如建立訂單、付款和取消訂單,一個主題來處理物流訊息,另一個主題來處理紅利點數相關訊息。

錯誤主題規劃範例

  • 過於粗略的顆粒度:會導致隔離性不佳。這不利於獨立的 O\&M 和錯誤處理。這個錯誤主題規劃做法的一個範例是針對所有交易訊息和物流訊息使用相同的主題。

  • 過於細緻的顆粒度:會消耗大量的資源並增加系統負載。這個錯誤主題規劃做法的一個範例是針對每個使用者產生的訊息使用不同的主題。

使用一個主題來傳送和接收相同類型的訊息

基於主題的業務隔離是 Apache RocketMQ 的設計原則。建議您針對使用不同業務邏輯的訊息使用不同的主題。特定的主題必須傳送或接收相同類型的訊息。

避免自動管理主題

Apache RocketMQ 中的主題是提供獨立權限管理、可觀察性指標收集和監控功能的頂層資源和容器。建立和管理主題需要系統資源。建議您僅在需要執行操作時才在生產環境中新增、刪除、修改或查詢主題。

雖然 Apache RocketMQ 提供自動建立主題的功能,但我們建議您僅在測試環境中使用此功能。如果您在生產環境中使用此功能,可能會產生大量不必要的主题。這會妨礙主題管理並消耗額外的系統資源。