在訊息不斷的傳送給Broker,Broker又不斷的把訊息儲存在Commitlog檔案、ConsumeQueue檔案、IndexFile檔案裡,磁碟總會有用完的那一刻。
由於Commitlog檔案、ConsumeQueue檔案都是順序寫,也就是說,所有的寫操作要麼是往最後一個檔案裡寫,要麼寫滿了建立一個新的檔案,所以之前的檔案都不會被更新,那就可以刪除比較久之前的檔案,這些比較久的檔案,就是過期檔案。
刪除過期檔案的時候,需要注意的是,Broker並不會去判斷這裡的訊息是否已經消費,反正刪就完事了。
在Broker啟動的時候,就會啟動一個定時任務,延遲60s,然後每10s就開始去判斷釋放要刪除過期檔案。
對於刪除過期的時機包括以下3種:
- 預設凌晨4點。這個也比較好理解,這個時候用的人也比較少,刪除對系統的影響就降到最小。
- 磁碟空間不足。當磁碟空間不足的時候,就要刪除過期檔案以提供更多的空間出來接收訊息。
- 人工觸發,指人為的介入去刪除。
刪除的檔案是過期檔案,那哪些檔案是過期的呢?
首先是保留時間,預設72小時,也就是3天,超過3天的資料,是需要刪除的。
如果這個檔案被其他執行緒引用了,此時就不會進行刪除,記錄第一次刪除的時間戳,退出本次任務,等120s後,就會把檔案的引用減1000,再強制刪除。
如果當前刪除的檔案數量,已經超過了可以刪除的最大批量數,則退出本次任務。
在刪除的過程中,會存在刪除多個檔案的情況,每個檔案之間,還有一個時間間隔,比如第一個檔案刪除完後,需要等100ms再刪除第二個檔案。