Можно ли настроить время хранения сообщений в Kafka
Что проверяют
Понимаете ли вы, что Kafka хранит сообщения не до прочтения, а по политике хранения, и как это влияет на тестирование. Следом обычно спрашивают, почему сообщение не удалилось ровно в срок и что будет с консьюмером, чей оффсет уже удалён.
Как отвечать
Да, хранение настраивается на двух уровнях: брокер задаёт значение по умолчанию, топик его переопределяет.
retention.ms: сколько хранить. По умолчанию 7 дней (брокерныйlog.retention.hours=168), значение-1означает бессрочно;retention.bytes: лимит объёма, по умолчанию-1, то есть без ограничения. Лимит действует на партицию, а не на весь топик;cleanup.policy:deleteудаляет старые данные,compactоставляет последнее значение по каждому ключу, их можно совместить.
Для существующего топика: kafka-configs.sh --bootstrap-server host:9092 --entity-type topics --entity-name orders --alter --add-config retention.ms=3600000, проверка той же командой с --describe.
Ключевая деталь: удаляются целые сегменты лога и только закрытые. Активный сегмент живёт, пока не наберёт segment.bytes (1 ГБ) или не истечёт segment.ms (7 дней), а проверка идёт раз в log.retention.check.interval.ms (5 минут). Поэтому сообщение может прожить заметно дольше retention.ms. Возраст считается по таймстемпу записи, так что продюсер со старыми таймстемпами может получить почти мгновенное удаление.
Для QA отсюда сценарий: консьюмер отстал дальше срока хранения, и его оффсета больше нет. Поведение тогда задаёт auto.offset.reset: earliest начнёт с самого старого оставшегося сообщения, latest пропустит всё до новых. В автотестах брокер поднимают через Testcontainers, а короткий срок задают при создании топика.
Где спотыкаются
Думают, что сообщение удаляется после чтения, как в классической очереди. В Kafka чтение ничего не удаляет, разные группы консьюмеров читают один топик независимо.
Ставят retention.ms=60000 на стенде и ждут, что через минуту сообщений не будет. Без уменьшения segment.ms данные останутся в активном сегменте.
Считают retention.bytes лимитом на топик. На топике из 12 партиций лимит в 1 ГБ означает до 12 ГБ данных, и это без учёта реплик.