nservicebus вызывает Saga из другой Saga

Я новичок в NServiceBus и пытаюсь найти лучший способ смоделировать сценарий, в котором используются компенсирующие транзакции.

Например, предположим, что у меня есть типичный сценарий BookHotel:

В счастливом случае поток сообщений будет происходить следующим образом:

  1. BookHotelCommand --> BookHotelSaga
  2. BookFlightCommand --> Ответить IFlightBookedMessage
  3. BookRentalCommand --> Ответить IRentalBookedMessage
  4. ReplyToOriginator --> HotelBookedMessage

Как бы я смоделировал компенсационные транзакции в приведенном выше потоке? Сначала я думал назвать «UnbookHotelSaga» в одном из ответов выше, исходя из некоторых деловых условий. Тем не менее, я, кажется, сталкиваюсь с некоторыми проблемами, пытаясь заставить это работать. Может ли кто-нибудь с опытом Saga прокомментировать, правильный ли это подход.

Вот сценарий, который, как я думал, сработает, если вызвать другую Saga:

  1. BookHotelCommand --> BookHotelSaga
  2. BookFlightCommand --> Ответить IFlightBookedMessage
  3. BookRentalCommand --> (условие выполнено) --> UnbookHotelCommand --> UnbookHotelSaga
  4. UnbookRentalCommand --> Ответ IUnbookRentalMessage
  5. UnbookFlightCommand --> Ответить IUnbookFlightMessage
  6. UnbookHotelCommand --> ReplyToOriginator --> UnbookedHotelMessage

Может ли кто-нибудь посоветовать лучший подход к реализации компенсационных транзакций?


person pixelbits    schedule 23.05.2018    source источник
comment
Вы уверены, что этот процесс отражает то, чего на самом деле хочет бизнес? Я имею в виду, что если бы я не мог забронировать автомобиль напрокат в Avis, я бы попробовал другие компании или, в худшем случае, взял бы автобусы/такси/уберы. Я определенно не стал бы отменять рейсы или отели.   -  person Udi Dahan    schedule 25.05.2018
comment
Извините, я должен был уточнить. На самом деле я просто пытаюсь понять, как компенсационные транзакции должны быть реализованы в саге. Сценарий не настоящий - он взят из видео Pluralsight.   -  person pixelbits    schedule 25.05.2018
comment
Существует очень мало бизнес-процессов, которые имеют полные требования к компенсации. В большинстве случаев компенсация переходит к принятию решений человеком. Даже в традиционной сверке банковских транзакций часто участвуют люди. Короче говоря, большинство разработчиков бизнес-систем могут в значительной степени игнорировать эту тему.   -  person Udi Dahan    schedule 26.05.2018


Ответы (1)


Я не совсем уверен, что понимаю длительный процесс и что он должен делать. Некоторая дополнительная информация о функциональности, вероятно, поможет.

Одной из первых вещей, которые я заметил, было упоминание IUnbookRentalMessage. Прежде всего, не используйте I в начале сообщения. Тот факт, что они могут быть интерфейсами, связан с полиморфизмом и функциями множественного наследования .NET. Сами сообщения не имеют технического значения в сети, и поэтому вы не должны включать I.

Кроме того, команды имеют императивное время, а события — прошедшее время. Итак, BookFlight для команды и FlightBooked для события.

Теоретически вы можете создать несколько саг, которые будут участвовать в одном длительном бизнес-процессе. Сага под названием BookingPolicy или BookingProcess или BookingSaga для управления всем процессом. И FlightBookingPolicy за перелет, и HotelBookingPolicy за отель.

Если вы начнете с команды BookFlight, FlightBookingPolicy может опубликовать событие с именем FlightBooked. BookingPolicy может использовать это событие для запуска собственного экземпляра саги. Так, например, веб-сайт (ASP.NET), который отправляет все команды, не должен знать о файле BookingPolicy. Он просто отправляет соответствующие команды с соответствующими данными. То же самое касается отеля, автомобиля и т. д.

Затем в какой-то момент веб-сайт отправляет команду CommitBooking или FinishUpMyVacation, которая действительно достигает саги BookingPolicy и завершает все бронирование. Он отправляет событие BookingFinishingUp или что-то в этом роде. На основании этого события какой-то обработчик может списать деньги с кредитной карты. Другой обработчик выполняет интеграцию с третьими сторонами, чтобы фактически отправить отпуск. Другой обработчик отправляет электронные письма. И так далее.

Наконец, когда BookingPolicy (или даже другая сага) будет завершена, сага BookingPolicy опубликует событие под названием BookingFinished, а соответствующие FlightBookingPolicy, HotelBookingPolicy и CarBookingPolicy также завершат свою работу. Что бы это ни было.

Имеет ли это смысл? Если вы хотите, вы также можете продолжить общение на https://discuss.particular.net/ или поддержать @particular.net.

person Dennis van der Stelt    schedule 24.05.2018
comment
Спасибо, это помогло мне. Я пытался найти примеры компенсационных транзакций, но не нашел. Я рад обнаружить, что я на правильном пути. - person pixelbits; 25.05.2018