Вопрос проверяет понимание альтернативного механизма очистки данных в Kafka и умение выбирать правильную стратегию хранения.
Log compaction — это режим хранения, при котором Kafka сохраняет только последнее сообщение для каждого ключа. Старые версии сообщений с тем же ключом могут быть удалены. При этом порядок сообщений по времени не является главным. Такой подход полезен для хранения актуального состояния, а не полной истории событий. Log compaction часто используют для state-топиков и справочников.
По умолчанию Kafka удаляет данные по времени или размеру (retention). Однако есть сценарии, где важно хранить последнее состояние, а не всю историю. Для этого и существует log compaction.
Log compaction — это механизм очистки лога, при котором Kafka гарантирует сохранение последнего сообщения для каждого ключа.
При включённой компакции Kafka:
анализирует сегменты партиции;
для каждого ключа оставляет последнее сообщение;
старые версии того же ключа помечает на удаление.
Важно:
компакция происходит асинхронно;
старые сообщения могут существовать некоторое время.
Kafka гарантирует:
если сообщение с ключом было записано, то последняя версия ключа останется;
сообщения без ключа не участвуют в компакции.
Это означает:
ключ обязателен для compaction;
порядок сообщений становится вторичным.
Log compaction применяют, когда нужен «слепок состояния».
Примеры:
текущий статус заказа;
профиль пользователя;
настройки системы.
Каждый новый апдейт перезаписывает предыдущее состояние.
Частая комбинация:
отдельный топик с полной историей событий (retention);
отдельный compacted-топик с актуальным состоянием.
Kafka сама использует compaction:
__consumer_offsets;
некоторые служебные данные.
Чтобы удалить ключ:
продюсер отправляет сообщение с ключом и null-value;
Kafka со временем удаляет ключ полностью.
Пример идеи:
producer.send("users", key=b"user-1", value=None)
Log compaction — не универсальное решение.
Ограничения:
нельзя восстановить полную историю изменений;
компакция не происходит мгновенно;
чтение может вернуть «устаревшие» данные, если компакция ещё не прошла.
Log compaction стоит использовать, когда нужен актуальный снимок состояния по ключу, а не полная история событий. Это мощный инструмент для state-топиков, но он не заменяет классический retention для event-логов.