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笔记之文件删除的主要内容,如果未能解决你的问题,请参考以下文章