
When to use cleanup.policy=delete vs compact, with trade-offs, configs, and recipes
Published on October 20, 2025 by Ehsan Manouchehri
Kafka LogCompaction CleanupPolicy Retention EventSourcing
4 min READ
Kafka stores records on disk in append-only logs. Cleaning up those logs is critical to control storage cost and to shape the semantics that downstream consumers observe. The cleanup.policy determines how Kafka discards data over time:
delete: remove old segments based on time/size retentioncompact: keep only the latest record per key, using tombstones for deletesChoosing correctly affects cost, latency, correctness, and how you model data.
TL;DR
- delete: best for ephemeral, immutable events; controlled by retention time/size
- compact: best for latest state per key; requires keys and tombstones
- compact+delete: state with bounded history; keep delete.retention.ms >= max consumer lag

Delete retention removes entire segments when they exceed time or size limits.
segment.ms, segment.bytesretention.ms, retention.bytesCompaction maintains the latest value per key by scanning log segments and discarding older records for the same key. Deletions are represented by tombstones.
delete.retention.msmin.cleanable.dirty.ratio: fraction of dirty data that triggers cleaningmax.compaction.lag.ms: latest time to wait before compacting recordsmin.compaction.lag.ms: minimum age before records become eligible for compactionlog.cleaner.threads: number of background cleaner threadsdelete.retention.ms)Setting cleanup.policy=compact,delete keeps the latest value per key but also enforces a history window. This is useful when you want upsert semantics plus bounded historical replay.
Key interactions:
retention.ms limits how long old segments remain even after compactiondelete.retention.ms so that readers can learn deletesdelete.retention.ms >= max consumer lag so tombstones propagate to all consumersmin/max.compaction.lag.ms can delay or accelerate compaction relative to write timelog.cleaner.threads, IO throughput; monitor cleaner backlog| Requirement | Prefer | Notes |
|---|---|---|
| Immutable events, time-bounded history | delete | Simple retention by time/size |
| Latest value per key (upsert) | compact | Consumers hydrate current state |
| Upsert with limited history | compact+delete | Current state plus 30–90 day window |
| Strict storage ceiling | delete | Predictable bytes; compaction is approximate |
| CDC/materialized view | compact | Preserve tombstones long enough |
Start with the semantics you need:
delete for ephemeral, immutable streams with a clear retention windowcompact for upsert/state streams where latest value per key matters