Перевод денег между сервисами
Вопрос
Деньги списываются в сервисе счетов, а зачисляются в сервисе другого банка-партнёра. Как организовать перевод надёжно без распределённой транзакции?
Попробуйте сами
Ответьте вслух за 2 минуты, как на собесе. Потом сверьтесь с тезисами: что прозвучало, а что нет.
Показать ответ и разбор
Коротко
Что должно прозвучать в ответе
Сага с оркестратором и явными статусами перевода
Идемпотентность каждого шага по id перевода
Резервирование (холд) суммы перед списанием
Компенсация: снять холд или вернуть деньги при неудаче
Outbox для событий, ретраи, сверка с партнёром
Что могут спросить следом
- Что если партнёр ответил таймаутом?
- Как пользователь видит промежуточный статус?
Разбор
Беру сагу с оркестратором, у перевода есть состояние: создан, деньги зарезервированы, отправлено партнёру, подтверждено, отменено. Первый шаг: холд суммы на счёте отправителя, это локальная транзакция с проверкой баланса. Затем запрос партнёру с id перевода как ключом идемпотентности. При успехе холд превращается в списание. При отказе компенсация: снимаем холд. Самое сложное: таймаут. Мы не знаем, прошёл ли перевод, поэтому не отменяем, а повторяем запрос с тем же ключом или запрашиваем статус. Все переходы пишем с outbox, и раз в день сверяемся с реестром партнёра. Пользователь видит статус «в обработке».
Ответьте сами, а не прочитайте
В тренажёре вопрос попадёт в повторения и вернётся, когда начнёт забываться. Плюс билеты с зачётом: 20 вопросов, не больше 2 ошибок.