Как и когда сообщения удаляются в Apache Kafka?

«Как и когда сообщения удаляются в Apache Kafka?» — вопрос из категории Брокеры сообщений, который задают на 10% собеседований Java Разработчик. Ниже — развёрнутый ответ с разбором ключевых моментов.

Ответ

Сообщения в Kafka по умолчанию не удаляются немедленно после чтения потребителем. Они хранятся на диске в течение заданного времени или до достижения лимита размера. Управление жизненным циклом сообщений настраивается на уровне топика.

Основные стратегии удаления (log.cleanup.policy):

  1. Удаление по времени (delete, настройка log.retention.hours) Сообщения удаляются после истечения срока хранения.

    log.cleanup.policy=delete
    log.retention.hours=168 # 7 дней (значение по умолчанию)
  2. Удаление по размеру (delete, настройка log.retention.bytes) Старые сегменты лога удаляются при превышении общего размера топика.

    log.retention.bytes=1073741824 # 1 ГБ на партицию
  3. Компактификация (compact) Сохраняет только последнее сообщение для каждого ключа. Используется для топиков с данными состояния (например, __consumer_offsets).

    log.cleanup.policy=compact

Как происходит удаление?

  • Лог топика разбит на сегменты (файлы).
  • Kafka периодически (по расписанию) проверяет сегменты, готовые к удалению (по времени или размеру), и удаляет старые файлы сегментов.
  • Активный сегмент (в который идет запись) никогда не удаляется.

Принудительное удаление: Инструмент kafka-delete-records позволяет удалять сообщения до определенного смещения (offset), но это операция для администрирования, а не обычного workflow.