Как справиться с компенсацией внутри саги

Я новичок в автобусе nservice и пытаюсь изучить концепции.

Я пытаюсь создать приложение, которое бы регистрировало клиента после получения от него некоторых платежей. Есть несколько сторонних интеграции в процессе регистрации, например, Payment и ExternalXYZ и т. Д.

Я думаю сделать ниже шаги

  1. Из контроллера MVC вызовите уровень WebAPI, который отправит команду для регистрации клиента с использованием шины NService, например, BeginRegistrationProcess
  2. BeginRegistrationProcess сгенерирует идентификатор корреляции, создаст запись в БД и запустит сагу с помощью другой команды, например ProcessRegistration
  3. ProcessRegistration будет делать следующие вещи

    • Сделать запись в БД
    • Служба оплаты звонков (с помощью команды DoPayment - это может включать такие шаги, как создание записи в БД, выполнение звонка, обработка ответа)
    • Вызов веб-служб ExternalXYZ (с помощью команд Call ExternalXYZ, аналогичных действиям в DoPayment)

    Я подумываю создать две отдельные команды для этих двух вызовов служб, чтобы они находились в своей небольшой области транзакций. Эти команды будут регистрировать детали до и после вызова сервисной службы. (Это может быть полезно для логики компенсации в случае сбоя сервисных вызовов, и мне нужно повторить их)

Вот мои вопросы

  1. Это звучит нормально?
  2. Как я буду обрабатывать сценарий ошибки. например, например, запись в БД шага 3 сделана, а затем во время оплаты происходит тайм-аут (может быть, карта была списана и истек тайм-аут при отправке ответа или может быть тайм-аут сети). Как бы убедиться, что карта не списывается дважды.
  3. Будет ли nservicebus выполнять откат транзакции внутри саги ProcessRegistration, если в обработчике DoPayment возникнет ошибка
  4. что произойдет с любыми вызовами БД, которые я делаю из DoPayment до вызова сервиса в случае ошибок.

Есть ли пример, который показывает, как обрабатывать компенсацию в саге. Я заинтересован в создании саги Компенсации, которая может быть инициирована ProcessRegistration. Могу ли я использовать таблицу журналов (в этой таблице есть записи о каждом вызове службы до / после) для инициирования компенсации?

1 ответ

Пара указателей:

  • CustomerId должен быть создан клиентским приложением (в вашем случае - веб) с использованием Guids, остальное должно выполняться с использованием асинхронного обмена сообщениями.
  • Компоненты не должны выполнять RPC(удаленный вызов процедур), вместо этого используйте команды pub/sub или команды

Для образца вы можете посмотреть образец здесь

Также посмотрите некоторые презентации здесь и блог Уди

Также посмотрите на дискуссионную группу сообщества

НТН

Другие вопросы по тегам