删除过期文件机制分析|学习笔记

简介: 快速学习删除过期文件机制分析

开发者学堂课程【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 destroyMapedFileIntervatForciblyDefaultMessageStore.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点那么就会去删除过去文件;还有一个是磁盘的空间,如果空间不充足也会进行删除;第三个也就是人工也可以去触发。那么以上就是过去文件删除的一个基本机制的说明。

相关实践学习
消息队列RocketMQ版:基础消息收发功能体验
本实验场景介绍消息队列RocketMQ版的基础消息收发功能,涵盖实例创建、Topic、Group资源创建以及消息收发体验等基础功能模块。
消息队列 MNS 入门课程
1、消息队列MNS简介 本节课介绍消息队列的MNS的基础概念 2、消息队列MNS特性 本节课介绍消息队列的MNS的主要特性 3、MNS的最佳实践及场景应用 本节课介绍消息队列的MNS的最佳实践及场景应用案例 4、手把手系列:消息队列MNS实操讲 本节课介绍消息队列的MNS的实际操作演示 5、动手实验:基于MNS,0基础轻松构建 Web Client 本节课带您一起基于MNS,0基础轻松构建 Web Client
相关文章
|
存储 前端开发 数据库
状态持久化:在应用中保留数据和用户体验的关键
在现代应用程序开发中,状态持久化是一个至关重要的概念。它使应用程序能够在不同会话之间保留数据,确保用户在退出应用程序后再次打开时能够恢复到之前的状态。本博客将深入研究状态持久化的核心概念、方法和最佳实践,以提高用户体验并确保数据的安全性。
175 0
|
3月前
|
存储 缓存 NoSQL
Redis 过期删除策略与内存淘汰策略的区别及常用命令解析
Redis 过期删除策略与内存淘汰策略的区别及常用命令解析
83 0
|
缓存 NoSQL 算法
Redis 过期删除机制探究
Redis 过期删除机制探究
|
存储 缓存 NoSQL
项目实战典型案例1——redis只管存不管删除 让失效时间删除的问题
项目实战典型案例1——redis只管存不管删除 让失效时间删除的问题
95 0
|
存储 缓存 NoSQL
【项目实战典型案例】01.redis只管存不管删除让失效时间删除的问题
【项目实战典型案例】01.redis只管存不管删除让失效时间删除的问题
|
缓存 NoSQL 算法
Redis的数据过期清除策略 与 内存淘汰策略
Redis的数据过期清除策略 与 内存淘汰策略
|
存储 NoSQL 算法
Redis学习12:删除策略:过期数据、数据删除策略、逐出策略
过期的数据真的删除了吗? 过期数据是指曾经有效的数据,并不是立马被删除的。
Redis学习12:删除策略:过期数据、数据删除策略、逐出策略
|
消息中间件 Java 数据库
失效问题的分析| 学习笔记
快速学习失效问题的分析。
失效问题的分析| 学习笔记
|
NoSQL Redis 开发者
删除策略-定期删除|学习笔记
快速学习删除策略-定期删除
删除策略-定期删除|学习笔记
|
NoSQL Redis 数据库
删除策略-过期数据的概念|学习笔记
快速学习删除策略-过期数据的概念
删除策略-过期数据的概念|学习笔记