nservicebus 从另一个 Saga 中调用一个 Saga

nservicebus calling a Saga from within another 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

有人可以就实施补偿交易的最佳做法提出建议吗?

我不确定我是否理解漫长的 运行 过程以及它应该做什么。有关功能的更多信息可能会有所帮助。

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

此外,命令在 imperative tense and events in past tense 中。因此 BookFlight 表示命令,FlightBooked 表示事件。

理论上您可以创建多个 sagas,它们都参与一个长 运行 业务流程。一个名为 BookingPolicyBookingProcessBookingSaga 的 saga 来协调整个过程。机票 FlightBookingPolicy,酒店 HotelBookingPolicy

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

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

最后,当 BookingPolicy(甚至 另一个 saga)完成时,BookingPolicy saga 将发布一个名为 BookingFinished 的事件,并且相应的FlightBookingPolicyHotelBookingPolicyCarBookingPolicy也结束了他们的工作。不管是什么。

这有意义吗?如果需要,您也可以在 https://discuss.particular.net/ 或 support@particular.net.

上继续对话