Retention и компакция лога: как Kafka хранит данные и когда их удаляет?
У топика есть две политики очистки. delete удаляет сегменты лога, вышедшие за пределы времени (retention.ms) или объёма (retention.bytes) — это обычный режим для потока событий. compact работает иначе: он не удаляет по времени, а оставляет последнее значение для каждого ключа, превращая топик в журнал изменений состояния — так делают топики конфигурации, справочников и «текущего состояния сущности». Удаление в компактируемом топике выражается tombstone — сообщением с ключом и null в значении; после delete.retention.ms оно тоже уходит. Политики комбинируются (compact,delete), когда нужно и последнее состояние, и ограничение по времени. Важные практические детали: компакция работает по сегментам и не трогает активный сегмент, поэтому «последнее значение» появляется не мгновенно; а сообщения без ключа в компактируемом топике — ошибка конфигурации, потому что компактировать их не по чему.