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

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

开发者学堂课程【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版Serverless系列实例进行获取接入点、创建Topic、创建订阅组、收发消息、查看消息轨迹和仪表盘。
消息队列 MNS 入门课程
1、消息队列MNS简介 本节课介绍消息队列的MNS的基础概念 2、消息队列MNS特性 本节课介绍消息队列的MNS的主要特性 3、MNS的最佳实践及场景应用 本节课介绍消息队列的MNS的最佳实践及场景应用案例 4、手把手系列:消息队列MNS实操讲 本节课介绍消息队列的MNS的实际操作演示 5、动手实验:基于MNS,0基础轻松构建 Web Client 本节课带您一起基于MNS,0基础轻松构建 Web Client
相关文章
|
前端开发
【Bootstrap】<前端框架>Bootstrap常用样式 - 排版
【1月更文挑战第17天】【Bootstrap】<前端框架>Bootstrap常用样式 - 排版
|
Cloud Native Linux 网络虚拟化
深入理解Linux veth虚拟网络设备:原理、应用与在容器化架构中的重要性
在Linux网络虚拟化领域,虚拟以太网设备(veth)扮演着至关重要的角色🌐。veth是一种特殊类型的网络设备,它在Linux内核中以成对的形式存在,允许两个网络命名空间之间的通信🔗。这篇文章将从多个维度深入分析veth的概念、作用、重要性,以及在容器和云原生环境中的应用📚。
深入理解Linux veth虚拟网络设备:原理、应用与在容器化架构中的重要性
|
机器学习/深度学习 人工智能 自然语言处理
【智能助手体验】分享一款超好用的AI工具:Kimi
Kimi是一款由月之暗面科技有限公司开发的AI助手,具备强大的自然语言理解和文件内容解析能力,支持多种文件格式,并能结合互联网搜索提供全面答案。无论是在工作中的数据分析还是日常生活中的信息查询,Kimi都能给出满意的结果,展现出巨大的应用潜力。
|
搜索推荐 前端开发 算法
基于用户画像及协同过滤算法的音乐推荐系统,采用Django框架、bootstrap前端,MySQL数据库
本文介绍了一个基于用户画像和协同过滤算法的音乐推荐系统,使用Django框架、Bootstrap前端和MySQL数据库构建,旨在为用户提供个性化的音乐推荐服务,提高推荐准确性和用户满意度。
899 7
基于用户画像及协同过滤算法的音乐推荐系统,采用Django框架、bootstrap前端,MySQL数据库
|
敏捷开发 测试技术 API
阿里云云效产品使用合集之调用API次数过多导致限流,该怎么办
云效作为一款全面覆盖研发全生命周期管理的云端效能平台,致力于帮助企业实现高效协同、敏捷研发和持续交付。本合集收集整理了用户在使用云效过程中遇到的常见问题,问题涉及项目创建与管理、需求规划与迭代、代码托管与版本控制、自动化测试、持续集成与发布等方面。
|
计算机视觉 Python
【Python】已解决:ModuleNotFoundError: No module named ‘PIL’
【Python】已解决:ModuleNotFoundError: No module named ‘PIL’
8904 0
|
存储 搜索推荐 Java
如何在Java中使用Elasticsearch
如何在Java中使用Elasticsearch
|
前端开发 Java API
Compose Mutiplatform 实战联机小游戏
Compose Mutiplatform 实战联机小游戏
360 0
|
数据采集 存储 监控
京东商品详情数据采集方法代码展示
京东商品详情数据采集方法代码展示
|
网络协议 网络安全 Go
Kali下安装渗透测试常用工具dnsx和dirsearch
Kali下安装渗透测试常用工具dnsx和dirsearch
740 0