Перевод должен атомарно изменять оба счёта и создавать неизменяемую запись операции. Идемпотентный ключ защищает от повторного списания после тайм-аута или повторного запроса.
Конструирование микросервиса для выполнения денежных переводов
Перевод должен атомарно изменять оба счёта и создавать неизменяемую запись операции. Идемпотентный ключ защищает от повторного списания после тайм-аута или повторного запроса.
Короткий ответ
Что ответить на собеседовании
Подробный разбор
Ответ с пояснениями
Условие
Необходимо создать микросервис, который:
- Осуществляет перевод средств между пользовательскими счетами.
- Обеспечивает атомарность и безопасность всех транзакций.
- Корректно обрабатывает ошибки, такие как отсутствие достаточного баланса, отсутствие запрашиваемого счёта и прочие исключительные ситуации.
Ответ
Перевод должен атомарно изменять оба счёта и создавать неизменяемую запись операции. Идемпотентный ключ защищает от повторного списания после тайм-аута или повторного запроса.
Проверьте авторизацию отправителя, существование счетов, положительную сумму и валюту. Храните деньги в целых минимальных единицах или точном decimal. В одной транзакции блокируйте счета в стабильном порядке, проверяйте остаток, создавайте проводки и фиксируйте результат операции. Ошибки недостатка средств и отсутствия счёта возвращайте явно. Для уведомлений используйте outbox; перевод между независимыми хранилищами требует отдельного протокола, а не двух несвязанных UPDATE.