跳到主要內容
版本:5.0

訊息佇列

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

定義

佇列是 Apache RocketMQ 中用於儲存和傳輸訊息的容器。佇列是 Apache RocketMQ 訊息的最小儲存單位。

Apache RocketMQ 中的主題包含多個佇列。這樣,佇列支援水平分割和串流儲存。

佇列提供以下好處

  • 順序儲存佇列本質上是有序的:訊息會依據它們排隊的順序儲存在同一順序中。最早的訊息會在佇列的開頭,最新的訊息會在佇列的結尾。偏移量用於標記佇列中訊息的位置和順序。

  • 串流操作語意:Apache RocketMQ 中的基於佇列的儲存允許使用者從偏移量讀取一則或多則訊息。這有助於實作聚合讀取和回溯讀取等功能。這些功能在 RabbitMQ 或 ActiveMQ 中並未提供。

模型關係

下圖顯示佇列在 Apache RocketMQ 的網域模型中的位置。佇列

預設情況下,Apache RocketMQ 提供可靠的訊息儲存。所有成功傳遞的訊息都會持續儲存在佇列中。訊息由生產者傳送,並由使用者端接收。每則訊息都能成功傳遞至少一次。

Apache RocketMQ 的佇列模型類似於 Kafka 的分割區模型。在 Apache RocketMQ 中,佇列是主題的一部分。即使訊息由主題管理,仍會在佇列中操作。例如,當生產者將訊息傳送至特定主題時,訊息會傳送至主題中的佇列。

您可以變更 Apache RocketMQ 中的佇列數量,以進行擴充或縮減。

內部屬性

讀取和寫入權限

  • 定義:是否可以從目前佇列讀取或寫入資料。

  • 值:由代理程式定義。以下說明列舉

    • 6:讀取和寫入。可以從目前佇列寫入和讀取訊息。

    • 4:唯讀。可以從目前佇列讀取訊息,但無法寫入。

    • 2:唯寫。可以寫入訊息至目前佇列,但無法讀取。

    • 0:讀取或寫入狀態不可用。目前佇列不允許讀取或寫入操作。

  • 限制:讀取和寫入權限與 O&M 操作相關。建議您不要頻繁變更權限。

行為限制

每個主題包含一個或多個用於儲存訊息的佇列。每個主題中的佇列數量與訊息類型和執行個體所在的區域相關。無法變更佇列數量。

版本相容性

佇列名稱會根據 Apache RocketMQ 代理程式的版本而有所不同。以下說明差異

  • 代理程式版本 3.x 和 4.x:佇列名稱包含主題名稱、代理程式 ID 和佇列 ID,並繫結到實體節點。

  • 代理程式版本 5.x:佇列名稱是由叢集指派的全球唯一字串,且與實體節點分離。

建議您不要建構佇列名稱或將其繫結到其他作業。否則,在更新代理程式時,佇列名稱可能會無法解析。

使用注意事項

佇列數量設定

在建立或變更主題時,您可以在 Apache RocketMQ 中指定佇列數量。建議您設定少數佇列,並避免新增不需要的佇列。

以下說明主題中大量佇列所產生的問題

  • 增加叢集中的元資料量 Apache RocketMQ 會根據佇列收集指標並監控資料。大量佇列可能會導致元資料量增加。
  • 過載用戶端 Apache RocketMQ 中的訊息讀取和寫入是根據佇列執行的。大量佇列可能會產生空輪詢要求,進而增加系統負載。

新增佇列的場景

  • 實體節點的負載平衡

    Apache RocketMQ 中每個主題的佇列可以分佈到不同的服務節點。為確保叢集擴充後叢集流量的負載平衡,建議您新增佇列或將先前的佇列移轉到新的服務節點。

  • 與 fifo 訊息相關的效能瓶頸問題

    在 Apache RocketMQ 代理程式版本 4.x 中,fifo 訊息只會在佇列中生效。因此,fifo 訊息的並行性取決於佇列數量。建議您在系統發生效能瓶頸問題時,增加佇列數量。