Можно ли получить exactly-once
Вопрос
Как обеспечить, чтобы каждое событие оплаты было обработано ровно один раз?
Попробуйте сами
Ответьте вслух за 2 минуты, как на собесе. Потом сверьтесь с тезисами: что прозвучало, а что нет.
Показать ответ и разбор
Коротко
Что должно прозвучать в ответе
Exactly-once между разными системами по сети в чистом виде недостижим
Берём at-least-once: offset коммитим после обработки
Обработчик идемпотентный: уникальный id события и вставка в той же транзакции
На стороне продюсера идемпотентный продюсер и outbox
Мониторинг дублей и сверка
Что могут спросить следом
- Что даёт exactly-once в Kafka на самом деле?
- Где хранить id обработанных событий и сколько?
Разбор
Честно говоря, «ровно один раз» по сети между разными системами не гарантировать: всегда может упасть процесс между действием и подтверждением. Поэтому делаю эффект ровно одного раза: доставка at-least-once, offset коммичу только после успешной обработки, а обработчик идемпотентный. В БД таблица обработанных событий с уникальным event_id, вставка в одной транзакции с изменением баланса; если вставка ничего не вставила, событие уже было, выходим. На стороне продюсера outbox, чтобы событие не потерялось. Транзакции Kafka дают exactly-once для цепочки «прочитал из Kafka, записал в Kafka», но если эффект во внешней БД, идемпотентность всё равно нужна. Плюс периодическая сверка с платёжным провайдером.
Ответьте сами, а не прочитайте
В тренажёре вопрос попадёт в повторения и вернётся, когда начнёт забываться. Плюс билеты с зачётом: 20 вопросов, не больше 2 ошибок.