Ответ вслух Senior Консистентность и CAP обновлено

Перевод денег между сервисами

Вопрос

Деньги списываются в сервисе счетов, а зачисляются в сервисе другого банка-партнёра. Как организовать перевод надёжно без распределённой транзакции?

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

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

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

Коротко

Беру сагу с оркестратором, у перевода есть состояние: создан, деньги зарезервированы, отправлено партнёру, подтверждено, отменено. Первый шаг: холд суммы на счёте отправителя, это локальная транзакция с проверкой баланса.

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

  • Сага с оркестратором и явными статусами перевода

  • Идемпотентность каждого шага по id перевода

  • Резервирование (холд) суммы перед списанием

  • Компенсация: снять холд или вернуть деньги при неудаче

  • Outbox для событий, ретраи, сверка с партнёром

Что могут спросить следом

  • Что если партнёр ответил таймаутом?
  • Как пользователь видит промежуточный статус?

Разбор

Беру сагу с оркестратором, у перевода есть состояние: создан, деньги зарезервированы, отправлено партнёру, подтверждено, отменено. Первый шаг: холд суммы на счёте отправителя, это локальная транзакция с проверкой баланса. Затем запрос партнёру с id перевода как ключом идемпотентности. При успехе холд превращается в списание. При отказе компенсация: снимаем холд. Самое сложное: таймаут. Мы не знаем, прошёл ли перевод, поэтому не отменяем, а повторяем запрос с тем же ключом или запрашиваем статус. Все переходы пишем с outbox, и раз в день сверяемся с реестром партнёра. Пользователь видит статус «в обработке».

Ответьте сами, а не прочитайте

В тренажёре вопрос попадёт в повторения и вернётся, когда начнёт забываться. Плюс билеты с зачётом: 20 вопросов, не больше 2 ошибок.