Как справиться с компенсацией внутри саги
Я новичок в автобусе nservice и пытаюсь изучить концепции.
Я пытаюсь создать приложение, которое бы регистрировало клиента после получения от него некоторых платежей. Есть несколько сторонних интеграции в процессе регистрации, например, Payment и ExternalXYZ и т. Д.
Я думаю сделать ниже шаги
- Из контроллера MVC вызовите уровень WebAPI, который отправит команду для регистрации клиента с использованием шины NService, например, BeginRegistrationProcess
- BeginRegistrationProcess сгенерирует идентификатор корреляции, создаст запись в БД и запустит сагу с помощью другой команды, например ProcessRegistration
ProcessRegistration будет делать следующие вещи
- Сделать запись в БД
- Служба оплаты звонков (с помощью команды DoPayment - это может включать такие шаги, как создание записи в БД, выполнение звонка, обработка ответа)
- Вызов веб-служб ExternalXYZ (с помощью команд Call ExternalXYZ, аналогичных действиям в DoPayment)
Я подумываю создать две отдельные команды для этих двух вызовов служб, чтобы они находились в своей небольшой области транзакций. Эти команды будут регистрировать детали до и после вызова сервисной службы. (Это может быть полезно для логики компенсации в случае сбоя сервисных вызовов, и мне нужно повторить их)
Вот мои вопросы
- Это звучит нормально?
- Как я буду обрабатывать сценарий ошибки. например, например, запись в БД шага 3 сделана, а затем во время оплаты происходит тайм-аут (может быть, карта была списана и истек тайм-аут при отправке ответа или может быть тайм-аут сети). Как бы убедиться, что карта не списывается дважды.
- Будет ли nservicebus выполнять откат транзакции внутри саги ProcessRegistration, если в обработчике DoPayment возникнет ошибка
- что произойдет с любыми вызовами БД, которые я делаю из DoPayment до вызова сервиса в случае ошибок.
Есть ли пример, который показывает, как обрабатывать компенсацию в саге. Я заинтересован в создании саги Компенсации, которая может быть инициирована ProcessRegistration. Могу ли я использовать таблицу журналов (в этой таблице есть записи о каждом вызове службы до / после) для инициирования компенсации?
1 ответ
Пара указателей:
- CustomerId должен быть создан клиентским приложением (в вашем случае - веб) с использованием Guids, остальное должно выполняться с использованием асинхронного обмена сообщениями.
- Компоненты не должны выполнять RPC(удаленный вызов процедур), вместо этого используйте команды pub/sub или команды
Для образца вы можете посмотреть образец здесь
Также посмотрите некоторые презентации здесь и блог Уди
Также посмотрите на дискуссионную группу сообщества
НТН