nservicebus从另一个Saga中呼叫Saga

时间:2018-05-23 23:34:41

标签: nservicebus nservicebus-sagas

我是NServiceBus的新手,并试图找到使用补偿交易建模的最佳方式。

例如,假设我有一个典型的BookHotel场景:

在快乐的情况下,消息流将按如下方式进行:

  1. BookHotelCommand - > BookHotelSaga
  2. BookFlightCommand - >回复IFlightBookedMessage
  3. BookRentalCommand - >回复IRentalBookedMessage
  4. ReplyToOriginator - > HotelBookedMessage
  5. 我如何在上述流程中对补偿交易进行建模?我最初想的是打电话给#34; UnbookHotelSaga"在上面的一个回复中,基于一些商业条件。然而,我似乎遇到了一些工作的挑战。如果这是正确的方法,有佐贺的人可以体验评论。

    这是我想通过调用另一个Saga来实现的方案:

    1. BookHotelCommand - > BookHotelSaga
    2. BookFlightCommand - >回复IFlightBookedMessage
    3. BookRentalCommand - > (满足条件) - > UnbookHotelCommand - > UnbookHotelSaga
    4. UnbookRentalCommand - >回复IUnbookRentalMessage
    5. UnbookFlightCommand - >回复IUnbookFlightMessage
    6. UnbookHotelCommand - > ReplyToOriginator - > UnbookedHotelMessage
    7. 有人可以就实施补偿交易的最佳做法提出建议吗?

1 个答案:

答案 0 :(得分:2)

我不确定我是否理解长时间运行的过程及其应该做的事情。有关功能的更多信息可能会有所帮助。

我注意到的第一件事是提到IUnbookRentalMessage。首先,不要在消息开头使用I。它们可以是接口的事实与.NET的多态性和多继承特性有关。消息本身在线路上没有技术含义,因此您不应包含I

此外,命令位于imperative tensepast tense中的事件。因此,BookFlight表示命令,FlightBooked表示事件。

理论上,您可以创建多个传闻,这些传奇都参与一个长期运行的业务流程。一个名为BookingPolicyBookingProcessBookingSaga的传奇,用于协调整个过程。该航班为FlightBookingPolicy,酒店为HotelBookingPolicy

如果您从BookFlight命令开始,FlightBookingPolicy可以发布名为FlightBooked的事件。 BookingPolicy可以使用该事件来启动自己的saga实例。例如,发送所有命令的(ASP.NET)网站不必知道BookingPolicy。它只是发送带有适当数据的适当命令。酒店,汽车等也是如此。

然后在某个时候,网站发送CommitBookingFinishUpMyVacation命令,确实到达BookingPolicy传奇,并最终确定整个预订。它发送一个事件BookingFinishingUp或其他东西。根据该事件,某些处理程序可能会从信用卡中扣除资金。另一个处理程序与第三方集成以实际提交假期。另一个处理程序发送电子邮件。等等。

最后,当BookingPolicy(或甚至另一个传奇)完成后,BookingPolicy传奇将发布一个名为BookingFinished的事件和相应的{{1并且FlightBookingPolicyHotelBookingPolicy也会结束并结束他们的工作。无论那是什么。

这有意义吗?如果需要,您还可以继续https://discuss.particular.net/或support@particular.net上的对话。