RocketMQ -- 過期檔案的刪除

大軍發表於2022-03-28

在訊息不斷的傳送給Broker,Broker又不斷的把訊息儲存在Commitlog檔案、ConsumeQueue檔案、IndexFile檔案裡,磁碟總會有用完的那一刻。

由於Commitlog檔案、ConsumeQueue檔案都是順序寫,也就是說,所有的寫操作要麼是往最後一個檔案裡寫,要麼寫滿了建立一個新的檔案,所以之前的檔案都不會被更新,那就可以刪除比較久之前的檔案,這些比較久的檔案,就是過期檔案。

刪除過期檔案的時候,需要注意的是,Broker並不會去判斷這裡的訊息是否已經消費,反正刪就完事了。

在Broker啟動的時候,就會啟動一個定時任務,延遲60s,然後每10s就開始去判斷釋放要刪除過期檔案。

image.png

對於刪除過期的時機包括以下3種:

  1. 預設凌晨4點。這個也比較好理解,這個時候用的人也比較少,刪除對系統的影響就降到最小。
  2. 磁碟空間不足。當磁碟空間不足的時候,就要刪除過期檔案以提供更多的空間出來接收訊息。
  3. 人工觸發,指人為的介入去刪除。

image.png

刪除的檔案是過期檔案,那哪些檔案是過期的呢?

首先是保留時間,預設72小時,也就是3天,超過3天的資料,是需要刪除的。

image.png

如果這個檔案被其他執行緒引用了,此時就不會進行刪除,記錄第一次刪除的時間戳,退出本次任務,等120s後,就會把檔案的引用減1000,再強制刪除。

image.png

如果當前刪除的檔案數量,已經超過了可以刪除的最大批量數,則退出本次任務。

image.png

在刪除的過程中,會存在刪除多個檔案的情況,每個檔案之間,還有一個時間間隔,比如第一個檔案刪除完後,需要等100ms再刪除第二個檔案。

image.png

相關文章