在消息不断的发送给Broker,Broker又不断的把消息储存在Commitlog文件、ConsumeQueue文件、IndexFile文件里,磁盘总会有用完的那一刻。
由于Commitlog文件、ConsumeQueue文件都是顺序写,也就是说,所有的写操作要么是往最后一个文件里写,要么写满了创建一个新的文件,所以之前的文件都不会被更新,那就可以删除比较久之前的文件,这些比较久的文件,就是过期文件。
删除过期文件的时候,需要注意的是,Broker并不会去判断这里的消息是否已经消费,反正删就完事了。
在Broker启动的时候,就会启动一个定时任务,延迟60s,然后每10s就开始去判断释放要删除过期文件。
对于删除过期的时机包括以下3种:
- 默认凌晨4点。这个也比较好理解,这个时候用的人也比较少,删除对系统的影响就降到最小。
- 磁盘空间不足。当磁盘空间不足的时候,就要删除过期文件以提供更多的空间出来接收消息。
- 人工触发,指人为的介入去删除。
删除的文件是过期文件,那哪些文件是过期的呢?
首先是保留时间,默认72小时,也就是3天,超过3天的数据,是需要删除的。
如果这个文件被其他线程引用了,此时就不会进行删除,记录第一次删除的时间戳,退出本次任务,等120s后,就会把文件的引用减1000,再强制删除。
如果当前删除的文件数量,已经超过了可以删除的最大批量数,则退出本次任务。
在删除的过程中,会存在删除多个文件的情况,每个文件之间,还有一个时间间隔,比如第一个文件删除完后,需要等100ms再删除第二个文件。
**粗体** _斜体_ [链接](http://example.com) `代码` - 列表 > 引用
。你还可以使用@
来通知其他用户。