Ответ
Сообщения в Kafka по умолчанию не удаляются немедленно после чтения потребителем. Они хранятся на диске в течение заданного времени или до достижения лимита размера. Управление жизненным циклом сообщений настраивается на уровне топика.
Основные стратегии удаления (log.cleanup.policy):
-
Удаление по времени (
delete, настройкаlog.retention.hours) Сообщения удаляются после истечения срока хранения.log.cleanup.policy=delete log.retention.hours=168 # 7 дней (значение по умолчанию) -
Удаление по размеру (
delete, настройкаlog.retention.bytes) Старые сегменты лога удаляются при превышении общего размера топика.log.retention.bytes=1073741824 # 1 ГБ на партицию -
Компактификация (
compact) Сохраняет только последнее сообщение для каждого ключа. Используется для топиков с данными состояния (например,__consumer_offsets).log.cleanup.policy=compact
Как происходит удаление?
- Лог топика разбит на сегменты (файлы).
- Kafka периодически (по расписанию) проверяет сегменты, готовые к удалению (по времени или размеру), и удаляет старые файлы сегментов.
- Активный сегмент (в который идет запись) никогда не удаляется.
Принудительное удаление:
Инструмент kafka-delete-records позволяет удалять сообщения до определенного смещения (offset), но это операция для администрирования, а не обычного workflow.