rocketmq笔记之文件删除

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了rocketmq笔记之文件删除相关的知识,希望对你有一定的参考价值。

参考技术A 文件删除:1.在store启动时候会启动一个后台线程每隔10秒扫描一下文件,把文件删除,删除文件会删commitlog和consumerlog文件,默认文件存储72小时,有是否超过时间,是否内存不足等,如果删除文件正在被引用,会先不删除,记录下时间,引用减小1000,

逻辑:1.RocketMQ 顺序写 Commitlog 文件、 ConsumeQueue 文件,所有写操作全部落在最后一个 CommitLog 或 ConsumeQueue 文件上,之前的文件在下一个文件创建后将不会再被更新

2.非当前写文件在一定时间间隔内没有再次被更新, 则认为是过期文件,可以被删除, RocketMQ 不会关注这个文件上的消息是否全部被消费

触发条价:启用文件过期机制并在磁盘 空间不足或默认在凌晨 4 点删除过期文件,

rocketMQ 删除过期文件

commitLog 删除文件的策略
指定时间到了,磁盘不足,人工删除,满足任一条件,判断文件是否过期或者磁盘不足,是则删除,一批次最多删除 10 个文件。

commitLog,consumeQueue,indexFile 的删除策略如下图:

技术图片

 

 

commitLog 尾部是有空洞的,当一个消息在当前文件放不下时,rocketmq 认为下一个文件一定能放下该消息,消息不会分隔保存。

commitLog 文件尾部存在至少 8 字节的空洞。

一般情况的尾部组成:maxBlank,BLANK_MAGIC_CODE,随机的内容

// org.apache.rocketmq.store.CommitLog.DefaultAppendMessageCallback#doAppend
if ((msgLen + END_FILE_MIN_BLANK_LENGTH) > maxBlank) {
    this.resetByteBuffer(this.msgStoreItemMemory, maxBlank);
    // 1 TOTALSIZE
    this.msgStoreItemMemory.putInt(maxBlank);
    // 2 MAGICCODE
    this.msgStoreItemMemory.putInt(CommitLog.BLANK_MAGIC_CODE);
    // 3 The remaining space may be any value
    // Here the length of the specially set maxBlank
    final long beginTimeMills = CommitLog.this.defaultMessageStore.now();
    byteBuffer.put(this.msgStoreItemMemory.array(), 0, maxBlank);
    return new AppendMessageResult(AppendMessageStatus.END_OF_FILE, wroteOffset, maxBlank, msgId, msgInner.getStoreTimestamp(),
        queueOffset, CommitLog.this.defaultMessageStore.now() - beginTimeMills);
}

 

以上是关于rocketmq笔记之文件删除的主要内容,如果未能解决你的问题,请参考以下文章

rocketmq消息文件(commitlog)删除策略分析

学习Linux运维的个人笔记:文件管理之创建/复制/移动/删除

RocketMq Topic创建和删除

图文并茂!深入了解RocketMQ的过期删除机制

Redis学习笔记之单机实现

HBase笔记之远程Shell界面命令行无法删除字符的解决方案