跳至主要內容
版本:5.0

訊息儲存和清理

本主題說明 Apache RocketMQ 如何儲存訊息,包括儲存粒度、判斷準則和處理政策。

背景資訊

根據 Apache RocketMQ 中 MessageQueue 的定義,訊息會依序儲存在代理程式收到的佇列中。理論上,佇列可以儲存的訊息數量沒有限制。

在實際的部署場景中,訊息無法永久儲存,因為代理程式的實體儲存空間有限。因此,在部署訊息時,您需要回答三個問題:使用什麼準則來判斷如何在代理程式上儲存訊息?使用什麼粒度來管理儲存的訊息?當訊息儲存使用量超過限制時,必須採取什麼措施?Apache RocketMQ 的訊息儲存和清理機制提供了上述問題的解答。

您可以根據下列面向使用訊息儲存和清理機制來更佳執行 O&M

  • 儲存的 SLA:儲存持續時間是指使用者可以取得訊息的時間區間。此功能適合於需要長時間消費、訊息累積、需要故障復原的場景。

  • 儲存成本的評估與控管:Apache RocketMQ 將訊息儲存在磁碟上,您可以預先評估儲存空間,預留儲存資源。

訊息儲存機制

運作機制

Apache RocketMQ 的每個節點會儲存訊息一段特定時間,這段時間稱為儲存持續時間,用來判斷訊息儲存多久。在儲存持續時間內的訊息會被保留,超過持續時間限制的訊息會被清理,不論是否被消費過。

以下說明訊息儲存機制相關的項目

  • 管理粒度:Apache RocketMQ 以節點為單位管理訊息儲存持續時間。

  • 判斷依據:以訊息儲存持續時間作為判斷依據,相較於訊息數量或大小,儲存持續時間可以更有效率的評估訊息的價值。

  • 訊息儲存與消費狀態無關:Apache RocketMQ 的訊息儲存持續時間,從訊息產生時間開始計算,與消費狀態無關,統一的計算策略簡化了訊息儲存機制。

以下圖示說明訊息在佇列中的儲存方式。消息存储

註解

管理粒度

Apache RocketMQ 以 Broker 節點為單位管理儲存持續時間,原因如下

  • 訊息儲存優勢:Apache RocketMQ 使用統一的兩層組織方式,由物理的 Log Queue 與輕量的邏輯 Queue 組成,管理實體資料,具備有序讀寫、高吞吐、高性能的優點,但無法以 Topic 或 Queue 為單位管理訊息儲存。

  • 容量保障與資料安全性:Apache RocketMQ 雖然會依據 Topic 或 Queue 產生獨立的儲存檔案,但這些檔案共用同一個底層儲存媒介,以 Topic 或 Queue 為單位管理儲存持續時間,雖然彈性,但當叢集儲存容量不足時,可能無法滿足儲存的 SLA。若要安全地管理訊息,最理想的方式是將不同儲存持續時間的訊息,儲存在不同的叢集中。

訊息儲存與消費狀態的關係

Apache RocketMQ 以集中方式管理訊息儲存時間,無論訊息是否被消費。

訊息可能會因為消費者不活躍或消費異常而累積在佇列中。目前對於此問題還沒有有效的解決方案。如果保留所有未被消費的訊息,儲存空間會很快用完。這會影響新訊息的讀寫速度。

消費者可以根據儲存時間管理訊息,以決定每則訊息的生命週期。消費者可以在儲存時間內隨時消費訊息,或使用重置消費者偏移量功能多次消費訊息。

訊息儲存檔案結構 Apache RocketMQ 訊息預設儲存在本機磁碟檔案中,而儲存檔案的根目錄由設定參數 storePathRootDir 決定。儲存結構顯示在下圖中,其中 commitlog 資料夾儲存實體訊息檔案,consumeCQueue 資料夾儲存邏輯佇列索引。MessageStore

訊息清理機制

在 Apache RocketMQ 中,訊息的儲存時間與實際儲存時間不同。這是因為訊息儲存在本機磁碟中。當本機磁碟空間不足時,系統會強制刪除訊息以確保服務穩定性。因此,實際儲存時間會短於指定的儲存時間。

Apache RocketMQ 儲存系統是基於阿里雲的雲原生技術開發的。這允許所有執行個體使用儲存空間,而沒有儲存容量限制。所有訊息都根據其指定的儲存時間儲存。您不必擔心因儲存空間不足而刪除訊息。

使用說明

根據您的業務需求增加儲存時間

Apache RocketMQ 會根據儲存時間控制是否保留訊息。我們建議您根據您的業務需求指定較長的儲存時間。較長的儲存時間讓您有更多空間執行緊急故障復原、緊急問題排除和訊息回溯等作業。