开发者学堂课程【RocketMQ 知识精讲与项目实战(第三阶段):删除过期文件机制分析】学习笔记,与课程紧密联系,让用户快速学习知识。
课程地址:https://developer.aliyun.com/learning/course/704/detail/12490
删除过期文件机制分析
内容介绍:
一、前言介绍
二、方法与流程
三、小结
一、前言介绍
过期文件的删除机制,RocketMQ 引入过去文件的删除机制,其实是为了去节省磁盘的空间,删除了一些不需要的一些文件,那 RocketMQ 的文件的操作主要牵扯到了就是 CommitLog 和 ConsumerQueue,那么这两个文件的一个操作都是基于内存映射机制并在启动 RocketMQ 的时候回加载 CommitLog、ConsumerQueue以及目录下的所有文件,为了避免内存与磁盘的浪费,不可能将消息永久存储在消息服务器上,所以要引入一种机制来删除已过期的文件。
二、方法与流程
RocketMQ 支持顺序写CommitLog、ConsumerQueue 文件,所有写操作全部落在最后一个 CommitLog 或者 ConsumerQueue 的文件上,之前的文件在下一个文件创建后将不会再被更新。如果之前的文件里面的数据已经都被消费完了之后,就可以去把它清除掉了,那么RocketMQ 清除过去文件的那个方法,它的有这么几种方式。第一种如果当前文件在一定时间间隔内没有再次被消费,则认为是过期文件,可以被删除。在删除的过程中 RocketMQ 不会关注这个文件上的消息是否全部被消费。默认每个文件的过期时间为72小时,通过在Broker配置文件中设置fileReservedTime来改变过期时间,单位为小时。它也就是说它的创建出来之后最多就存储72小时,也就是三天的时间,过了时间之后就会被删除掉,那这是过去文件删除的机制说明,对应的这块代码如下,
它要定期的要去检查这个文件的一个过去时间,所以这里一定是一个定时任务,那一定是通过定时任务的方式进行这么一个处理,那么这个定时任务在哪里?
public void start() throws Exception 【
APtaoctefi hocnetnaredskspoaben. evaiteos hared fal20);throw new RuntimeException("Lock failed,MQ already started");
lockFile.getChannel().write(ByteBuffer.wrap("lock".getBytes())); lockFile.getChannel().force( metaData: true);
有一个添加定时任务的方法,在这个方法当中有一行重点代码,这代码 DefaultMessageStore.this. 就会调用 cleanFilesperiodically 。它就是会定期的去执行删除文件的一个方法的任务,那么这个代码多久会执行一次?首次启动起来之后会间隔60分钟,完了之后后面每隔十分钟都会去执行一下,那么执行的时候它就会去清除CommitLog 和 ConsumerQueue,这两个看任何一个其实都可以,基本上这个逻辑都差不多,之后再进到 run 方法,进到 run 方法之后发现它的里边有一个 delete Experience files ,然后它就会去进行文件的一个删除的处理,
那么在删除的时候,首先去维护一个变量,就是删除的这个文件的数量,然后获得了一下当前这个文件的保留时间,然后获得了删除物理文件的一个间隔时间,然后这个地方如果现场被占用,那么第一次删除操作后能够去保留最大的这个时间间隔,然后超过该时间之后,这个文件将会被进行一个强制删除,
private void deleteExpiredFiles(){
//删除的数量
int deletecount = 0;
//文件保留的时间
long fileReservedTime=
DefaultMessagestore.this.getMessagestoreConfig().getFileReservedTime();
//删除物理文件的间隔
int deletephysicFilesInterval=
DefaultMessagestore.this.getMessagestoreConfig().getDeleteCommitLogFilesInterva1();
//线程被占用,第一次拒绝删除后能保留的最大时间,超过该时间,文件将被强制删除
int destroyMapedFileIntervatForcibly
DefaultMessageStore.this.getMessagestoreConfig(O.getDestroyMapedFileIntervalForcibly();
具体触发删除的条件有三个,第一个就是所说的时间点达到了,就是每天的这个4点的时候,它都会去扫描一下当前这些文件看是不是已经过期了,如果过期它就会删除;
另外一个就是这个检查一下磁盘的空间是不是充足,如果磁盘空间不充足了,那么也会去进行删除;
第三个就是手工也可以去触发删除。
有这三种触发删除的条件,
boolean timeup = this.isTimeToDelete();
booleanspacefull = this.isSpaceToDelete();
Boolean manualDelete = this.manualDeleteFileSeveralTimes > 0;
通过时间去判断,它的时间是4?它就是凌晨的4点就会去执行删除的处理;另外一个就是检查这个磁盘的空间,如果它的占有量小于10%了,那么也就会去删除;第三个就是这个人工触发删除,同时也可以去进行一个删除点的一个触发,那这就是删除的一个基本的思想,现在主要去把流程去分析。
三、小结
过期文件删除主要的目的就是为了去节省磁盘与内存空间,因为在RocketMQ 启动的时候,它会将磁盘里面的文件加到内存里面去,如果加起来太多的过期文件就会大大造成内存的一个浪费,所以它在这个存储的 default messages store ,再去启动的时候呢就会去启动一个定时任务,然后这个定时任务每隔十分钟就会任务被触发,那么任务触发的目的就是说为了去检查有没有过去文件需要删,在删除的时候有这么几个时间点会去触发删除的这个动作,一个是每天的4点那么就会去删除过去文件;还有一个是磁盘的空间,如果空间不充足也会进行删除;第三个也就是人工也可以去触发。那么以上就是过去文件删除的一个基本机制的说明。