Политики очистки лога Kafka¶
Сравнительная таблица политик очистки лога Kafka (cleanup.policy)¶
| Параметр / Критерий | delete (Удаление) |
compact (Уплотнение) |
compact, delete (Комбинированный) |
|---|---|---|---|
| Основной принцип | Удаляет старые сегменты лога целиком, когда они выходят за рамки установленного лимита по времени или размеру. | Сохраняет только последнее сообщение для каждого уникального ключа. Старые сообщения с тем же ключом удаляются. | Сначала уплотняет данные по ключу, а затем удаляет старые данные, включая уплотненные, если они выходят за рамки лимита по времени. |
| На что ориентируется | Время (retention.ms) или размер (retention.bytes) топика. |
Ключ сообщения. | Ключ для уплотнения и время для окончательного удаления. |
| Что происходит с данными | Старые данные безвозвратно удаляются по истечении срока хранения. Вся история за пределами окна теряется. | Старые версии сообщений удаляются, но последняя версия для каждого ключа сохраняется потенциально навсегда. | Последняя версия по ключу сохраняется, но если ключ не обновлялся очень долго, он тоже может быть удален. |
| Ключи сообщений | Не обязательны. Политика работает независимо от наличия или отсутствия ключей. | Критически важны. Без ключей уплотнение бессмысленно, так как каждое сообщение будет считаться уникальным. | Критически важны, как и для compact. |
| "Надгробия" (Tombstones) | Не имеют специального значения. Сообщение с null-значением — это просто данные. |
Ключевой механизм. Сообщение с null-значением (tombstone) сигнализирует об удалении ключа. После уплотнения и ключ, и tombstone удаляются из лога. |
Работают так же, как в compact, но само "надгробие" тоже будет удалено по истечении delete.retention.ms. |
| Размер топика | Может расти и сокращаться циклично. Размер ограничен конфигурацией. | Растет до тех пор, пока не будут представлены все уникальные ключи. Затем размер стабилизируется (растет медленно). | Похож на compact, но гарантированно не будет расти бесконечно за счет старых, неактуальных ключей. |
| Гарантии по данным | Гарантируется, что данные будут храниться минимум указанное время/до достижения размера. | Гарантируется наличие последнего состояния для каждого ключа, который когда-либо был в топике (если не был удален через tombstone). | Гарантируется наличие последнего состояния для ключей, которые обновлялись в пределах окна хранения. |
Когда какой способ использовать?¶
1. delete (Политика по умолчанию)¶
Это самый распространенный и простой для понимания способ.
Подходит для:
- Сбор логов и метрик: Когда важны события за последний час/день/неделю, а более старые данные можно удалять (например, логи приложений, метрики производительности).
- Потоки событий (Event Sourcing): Когда каждое событие уникально и важно сохранить полную хронологию, но только за определенный период.
- Очереди задач: Когда сообщения обрабатываются и после этого становятся не нужны.
- Любые сценарии, где данные имеют "срок годности".
Простыми словами: Используйте
delete, когда вас волнует вопрос "Что происходило недавно?".
2. compact¶
Эта политика превращает топик Kafka в подобие таблицы в базе данных или key-value хранилища.
Подходит для:
- Хранение состояний или конфигураций: Например, текущие настройки сервиса, профили пользователей. Вам всегда нужно только последнее, актуальное значение.
- Change Data Capture (CDC): При репликации изменений из базы данных в Kafka. Каждая строка таблицы — это ключ, а ее состояние — значение.
- Восстановление состояния приложений: При перезапуске сервис может быстро прочитать уплотненный топик, чтобы восстановить свое внутреннее состояние до актуального.
- Сценарии, где нужно избежать дубликатов по ключу и хранить только финальный результат.
Простыми словами: Используйте
compact, когда вас волнует вопрос "Каково текущее состояние для этого ключа?".
3. compact, delete¶
Это гибридный подход, который решает специфическую проблему уплотненных топиков: бесконечный рост из-за "мертвых" ключей.
Подходит для:
- Уплотненные топики с временными данными: Например, вы храните состояние сессий пользователей (
compact). Но если пользователь не заходил год, вы хотите полностью удалить все данные о его сессии, чтобы не хранить их вечно (delete). - Отслеживание статуса заказов: Заказ имеет ключ, его статус обновляется (
compact). После того как заказ выполнен и прошел год, информацию о нем можно полностью удалить из топика (delete). - Соблюдение GDPR и других норм: Позволяет гарантировать, что данные (даже последние состояния) будут удалены по истечении определенного срока.
Простыми словами: Используйте
compact, delete, когда вам нужно "знать текущее состояние, но только для тех ключей, которые были активны недавно".
Важное замечание
Процесс уплотнения (compact) происходит в фоновом режиме и работает с "грязными" (dirty) сегментами лога. Это означает, что в любой момент времени в топике могут временно присутствовать старые версии сообщений (до того, как сегмент будет уплотнен). Потребители должны быть спроектированы так, чтобы корректно обрабатывать это, используя только последнее полученное сообщение для каждого ключа.