Выбор ответа Middle Очереди и события спрашивают часто обновлено
Дубли при at-least-once
Вопрос
Консьюмер обработал сообщение «начислить бонусы», но упал до коммита offset. После рестарта сообщение пришло снова. Как правильно защититься?
Попробуйте сами
Выберите вариант, и откроется разбор.
Показать ответ и разбор
Коротко
Правильный ответ: Идемпотентный обработчик: id сообщения с UNIQUE в той же транзакции. At-least-once означает возможные повторы, поэтому побочные эффекты делают идемпотентными: таблица обработанных id с уникальным ключом в одной транзакции с начислением.
Варианты ответа
- Включить exactly-once в настройках брокера, и дублей не будет во внешней БД
- Коммитить offset до обработки, чтобы повторной доставки не было
- Идемпотентный обработчик: id сообщения с UNIQUE в той же транзакцииправильный ответ
- Увеличить таймаут сессии консьюмера, чтобы он не терял сообщение
Разбор
At-least-once означает возможные повторы, поэтому побочные эффекты делают идемпотентными: таблица обработанных id с уникальным ключом в одной транзакции с начислением. Exactly-once в Kafka работает внутри Kafka (читать-обработать-записать в Kafka), но не защищает запись во внешнюю БД. Коммит до обработки даёт at-most-once: при падении сообщение потеряется. Таймаут сессии на повторы после падения не влияет.
Ответьте сами, а не прочитайте
В тренажёре вопрос попадёт в повторения и вернётся, когда начнёт забываться. Плюс билеты с зачётом: 20 вопросов, не больше 2 ошибок.