訊息佇列
本節說明 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 訊息的並行性取決於佇列數量。建議您在系統發生效能瓶頸問題時,增加佇列數量。