目录标题
retention.ms 和 delete.retention.ms
在 Kafka 中,retention.ms
和 delete.retention.ms
都与消息的保留时间有关,但它们应用的场景和作用对象不同:
✅ 一、retention.ms
作用范围: 主题级别(topic-level)或日志段文件(log segment)
含义:
控制 Kafka 保留消息的时间。一条消息写入 Kafka 后,只要没有超过这个时间,即使消费者没有消费,消息也不会被删除。
-
默认值:
604800000
(7 天,单位是毫秒) -
应用场景: 所有正常的消息保留策略
-
相关配置:
log.retention.hours
(老版本用这个,等价于retention.ms
)log.retention.bytes
(可以限制日志文件大小而非时间)
例子:
retention.ms=86400000 # 1 天后自动清理消息
✅ 二、delete.retention.ms
作用范围: 压缩(compacted)主题
含义:
控制 Kafka 对于启用 log compaction 的 topic,在标记某条消息为“可删除”之后,实际删除操作延迟的时间。
-
默认值:
86400000
(1 天) -
应用场景: 针对设置了
cleanup.policy=compact
的 topic -
注意: 并不是普通消息的保留时间,而是:
一条消息的 key 被写入新版本(或 tombstone,即 value=null)之后,Kafka 会等
delete.retention.ms
这么久,才会真正物理删除老的或 null 的记录。
例子:
cleanup.policy=compact
delete.retention.ms=3600000 # 压缩清理后,1小时后才会真正删除
📌 总结对比表
参数 | 应用范围 | 用途 | 典型用途 | 默认值 |
---|---|---|---|---|
retention.ms | 所有 topic | 消息保留时间 | 控制普通消息多久被清理 | 7 天 |
delete.retention.ms | compact topic | 被标记删除的 key 的实际删除延迟 | 控制 tombstone 或旧 key 被真正删除前的等待时间 | 1 天 |
📘 示例配置组合
# 普通 topic 保留 3 天
retention.ms=259200000
# 压缩 topic
cleanup.policy=compact
delete.retention.ms=43200000 # 12小时延迟删除
需要根据实际业务使用场景进行设置,比如:
- 普通日志型数据保留 7 天可用
retention.ms
- 状态型数据(如用户偏好、最新状态)使用
cleanup.policy=compact
,此时你还需关注delete.retention.ms
Kafka 官方文档及社区的说明与引用
下面是来自 Kafka 官方文档及社区的说明与引用,帮助你更好理解这两者的区别和用途:
📘 retention.ms(普通删除策略)
Kafka 中 retention.ms
控制对启用 delete
策略主题的消息保留时长。消息会在达到该时间后被删除:
“This configuration controls the maximum time we will retain a log before we will discard old log segments to free up space if we are using the delete retention policy.” (kafka.apache.org)
默认值为 604800000
毫秒(7 天),可以按需缩短或延长。
📘 delete.retention.ms(压缩策略下 tombstone 标记保留)
delete.retention.ms
专门用于开启了 compact
策略的主题,用于控制被标记为删除(即 tombstone)的 key 的保留时长:
“The amount of time to retain delete tombstone markers for log compacted topics.” (kafka.apache.org)
默认值为 86400000
毫秒(1 天),确保消费者在扫描完整日志(从 offset 0)期间能看到删除标记,否则可能导致状态不一致 (kafka.apache.org)。
🧩 对比总结
参数 | 应用策略 | 作用对象 | 默认值 |
---|---|---|---|
retention.ms | delete / delete,compact | 普通消息(非 tombstone),控制日志段在多久后删除 | 604 800 000 ms(7 天) (forum.confluent.io, kafka.apache.org) |
delete.retention.ms | compact / delete,compact | tombstone(value=null)的 key 标志,在多久后可清理 | 86 400 000 ms(1 天) |
🛠 场景说明
- 普通消息管理:只使用
delete
策略时,设置retention.ms
即可。 - 日志压缩使用:若主题设置了
cleanup.policy=compact
,删除操作需写入 tombstone,此时需配置delete.retention.ms
来保证这些 tombstone 的有效保留。 - 组合策略:当设置为
cleanup.policy=delete,compact
时,两者同时生效:普通消息按retention.ms
删除,tombstone 按delete.retention.ms
清理 (forum.confluent.io, kafka.apache.org)。
✅ 小结
Kafka 官方文档中对这两个参数的定义如下:
retention.ms
:普通消息的时间驱动删除控制 (kafka.apache.org)delete.retention.ms
(内部对应log.cleaner.delete.retention.ms
):压缩主题 tombstone 保留时间,用于保障消费者读取完整性 (kafka.apache.org)
如你已经掌握 Kafka 的 cleanup.policy
配置,上面内容将帮助你正确设置消息和 tombstone 的删除时间。