Ответ вслух Senior Очереди и события обновлено

Можно ли получить exactly-once

Вопрос

Как обеспечить, чтобы каждое событие оплаты было обработано ровно один раз?

Попробуйте сами

Ответьте вслух за 2 минуты, как на собесе. Потом сверьтесь с тезисами: что прозвучало, а что нет.

Показать ответ и разбор

Коротко

Честно говоря, «ровно один раз» по сети между разными системами не гарантировать: всегда может упасть процесс между действием и подтверждением. Поэтому делаю эффект ровно одного раза: доставка at-least-once, offset коммичу только после успешной обработки, а обработчик идемпотентный.

Что должно прозвучать в ответе

  • 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 ошибок.