在 RocketMQ 中,消息被消费后不会立即从磁盘删除,而是会保留一段时间(取决于配置)。以下是详细规则和清理机制:
1. 消息存储的生命周期
(1) 消费完成 ≠ 立即删除
- Broker 持久化 :所有消息(无论是否被消费)都会先持久化到磁盘的
CommitLog
中。 - 消费位点记录 :消费者组会定期提交消费进度(Offset),标记哪些消息已被消费,但消息本身仍保留在磁盘。
(2) 消息清理条件
RocketMQ 会在以下条件满足时自动清理磁盘消息:
条件 | 说明 |
---|---|
消息保存时间超限 | 默认保留 72 小时(由 fileReservedTime 参数控制),超时后物理删除。 |
磁盘空间不足 | 触发强制清理(需配置 diskMaxUsedSpaceRatio ,默认 75% 时开始清理)。 |
手动触发清理 | 通过命令或控制台手动删除特定 Topic 的消息。 |
2. 核心配置参数
参数 | 默认值 | 作用 |
---|---|---|
fileReservedTime |
72 (小时) | 消息保留时长,超时后删除。 |
diskMaxUsedSpaceRatio |
75 (%) | 磁盘使用率阈值,超过时优先清理旧消息。 |
cleanResourceInterval |
10000 (ms) | 检查磁盘和执行清理任务的间隔。 |
修改配置示例(Broker 配置文件):
properties
# 调整消息保留时间为 48 小时
fileReservedTime=48
# 磁盘使用率超过 85% 时清理
diskMaxUsedSpaceRatio=85
3. 为什么被消费的消息不立即删除?
(1) 设计考量
- 消息重放 :允许重置消费位点(如
resetOffset
)重新消费历史消息。 - 灾备恢复:消费者故障后,可从历史消息恢复。
- 顺序消息:确保顺序投递的完整性。
(2) 实际影响
- 磁盘占用:消息会持续占用磁盘空间直到过期或被清理。
- 性能开销:保留消息对读写性能影响极小(RocketMQ 采用顺序写 + 零拷贝机制)。
4. 手动清理消息
(1) 通过命令强制清理
bash
# 删除指定 Topic 的过期文件
mqadmin cleanExpiredCQ -n <namesrv_addr> -t <topic>
(2) 控制台操作
- 在 RocketMQ Console 中选择 Topic,手动触发清理。
5. 生产环境建议
-
合理设置保留时间 :
- 非关键消息:缩短
fileReservedTime
(如 24 小时)。 - 审计/合规需求:延长保留时间(需额外磁盘空间)。
- 非关键消息:缩短
-
监控磁盘使用率 :
bash# 检查磁盘状态 mqadmin getBrokerRuntimeInfo -n <namesrv_addr> -b <broker_addr>
-
定期维护 :
- 清理无用 Topic,避免僵尸消息堆积。
总结
问题 | 答案 |
---|---|
消息消费后是否立即删除? | 否,根据 fileReservedTime 保留一段时间(默认 72 小时)。 |
如何避免磁盘爆满? | 调整 fileReservedTime 和 diskMaxUsedSpaceRatio ,或手动清理。 |
能否永久保存消息? | 不支持,需自行归档到其他存储(如 HDFS/S3)或依赖外部日志系统。 |
通过合理配置,可平衡消息保留需求和磁盘资源占用。