Кейс: enable.idempotence=true не спас от дублей после ретрая в бизнес-коде

Idempotent producer в Kafka убирает дубли на уровне брокера в рамках одной сессии: продюсеру присваивается producer ID, каждое сообщение получает sequence number, и брокер отбрасывает повтор с уже виденным номером. Это работает, пока клиент один и тот же.

В разборе PR нашли код, который на TimeoutException при отправке создавал новый KafkaProducer и повторял send() через него. Новый клиент — новый producer ID, брокер видит его как первую отправку, а не повтор. Гарантия идемпотентности обнулилась вместе с пересозданным клиентом.

public void send(String topic, String key, String value) { try (KafkaProducer producer = new KafkaProducer<>(props)) { producer.send(new ProducerRecord<>( topic, key, value)); } }

Спросят следом: как idempotent producer связан с transactional producer и exactly-once в паттерне read-process-write. Ответ — idempotence убирает дубли на отправке, транзакции добавляют атомарность между несколькими топиками и коммитом offset, это разные уровни гарантий.

Idempotent producer защищает от дублей внутри одной сессии соединения, а не от повторных вызовов бизнес-кода с новым клиентом при каждом ретрае.

Тренажёр: 600 вопросов, мок с таймером, план повторов

senior·base — что спрашивают на самом деле


В этом посте были ссылки, но мы их удалили по правилам Сетки