nservicebus 从另一个 Saga 中调用一个 Saga
nservicebus calling a Saga from within another Saga
我是 NServiceBus 的新手,正在尝试找到对使用补偿事务的场景进行建模的最佳方法。
例如,假设我有一个典型的 BookHotel 场景:
在最理想的情况下,消息流将按如下方式进行:
- BookHotelCommand --> BookHotelSaga
- BookFlightCommand --> 回复IFlightBookedMessage
- BookRentalCommand --> 回复IRentalBookedMessage
- ReplyToOriginator --> HotelBookedMessage
我将如何为上述流程中的补偿交易建模?我最初考虑根据某些业务条件在上面的一个回复中调用 "UnbookHotelSaga"。但是,我似乎 运行 遇到了一些挑战,无法让它正常工作。如果这是正确的方法,有 Saga 经验的人可以发表评论吗?
这是我认为可以通过调用另一个 Saga 来实现的场景:
- BookHotelCommand --> BookHotelSaga
- BookFlightCommand --> 回复IFlightBookedMessage
- BookRentalCommand -->(满足条件)--> UnbookHotelCommand --> UnbookHotelSaga
- UnbookRentalCommand --> 回复IUnbookRentalMessage
- UnbookFlightCommand --> 回复IUnbookFlightMessage
- UnbookHotelCommand --> ReplyToOriginator --> UnbookedHotelMessage
有人可以就实施补偿交易的最佳做法提出建议吗?
我不确定我是否理解漫长的 运行 过程以及它应该做什么。有关功能的更多信息可能会有所帮助。
我注意到的第一件事就是提到 IUnbookRentalMessage
。首先,不要在消息开头使用 I
。它们可以是接口这一事实与 .NET 的多态性和多重继承特性有关。消息本身在网络上没有技术意义,因此您不应包含 I
.
此外,命令在 imperative tense and events in past tense 中。因此 BookFlight
表示命令,FlightBooked
表示事件。
理论上您可以创建多个 sagas,它们都参与一个长 运行 业务流程。一个名为 BookingPolicy
或 BookingProcess
或 BookingSaga
的 saga 来协调整个过程。机票 FlightBookingPolicy
,酒店 HotelBookingPolicy
。
如果您从 BookFlight
命令开始,FlightBookingPolicy
可以发布一个名为 FlightBooked
的事件。 BookingPolicy
可以使用该事件来启动它自己的 saga 实例。因此,例如,发送所有命令的 (ASP.NET) 网站不必知道 BookingPolicy
。它只是发送带有适当数据的适当命令。酒店、汽车等也是如此
然后在某个时候,网站发送 CommitBooking
或 FinishUpMyVacation
命令, 确实到达 BookingPolicy
传奇,然后完成整个预订。它发送一个事件 BookingFinishingUp
或其他东西。基于该事件,某些处理者可能会从信用卡中扣款。另一个处理程序与第 3 方集成以实际提交假期。另一个处理程序发送电子邮件。等等。
最后,当 BookingPolicy
(甚至 另一个 saga)完成时,BookingPolicy
saga 将发布一个名为 BookingFinished
的事件,并且相应的FlightBookingPolicy
和HotelBookingPolicy
和CarBookingPolicy
也结束了他们的工作。不管是什么。
这有意义吗?如果需要,您也可以在 https://discuss.particular.net/ 或 support@particular.net.
上继续对话
我是 NServiceBus 的新手,正在尝试找到对使用补偿事务的场景进行建模的最佳方法。
例如,假设我有一个典型的 BookHotel 场景:
在最理想的情况下,消息流将按如下方式进行:
- BookHotelCommand --> BookHotelSaga
- BookFlightCommand --> 回复IFlightBookedMessage
- BookRentalCommand --> 回复IRentalBookedMessage
- ReplyToOriginator --> HotelBookedMessage
我将如何为上述流程中的补偿交易建模?我最初考虑根据某些业务条件在上面的一个回复中调用 "UnbookHotelSaga"。但是,我似乎 运行 遇到了一些挑战,无法让它正常工作。如果这是正确的方法,有 Saga 经验的人可以发表评论吗?
这是我认为可以通过调用另一个 Saga 来实现的场景:
- BookHotelCommand --> BookHotelSaga
- BookFlightCommand --> 回复IFlightBookedMessage
- BookRentalCommand -->(满足条件)--> UnbookHotelCommand --> UnbookHotelSaga
- UnbookRentalCommand --> 回复IUnbookRentalMessage
- UnbookFlightCommand --> 回复IUnbookFlightMessage
- UnbookHotelCommand --> ReplyToOriginator --> UnbookedHotelMessage
有人可以就实施补偿交易的最佳做法提出建议吗?
我不确定我是否理解漫长的 运行 过程以及它应该做什么。有关功能的更多信息可能会有所帮助。
我注意到的第一件事就是提到 IUnbookRentalMessage
。首先,不要在消息开头使用 I
。它们可以是接口这一事实与 .NET 的多态性和多重继承特性有关。消息本身在网络上没有技术意义,因此您不应包含 I
.
此外,命令在 imperative tense and events in past tense 中。因此 BookFlight
表示命令,FlightBooked
表示事件。
理论上您可以创建多个 sagas,它们都参与一个长 运行 业务流程。一个名为 BookingPolicy
或 BookingProcess
或 BookingSaga
的 saga 来协调整个过程。机票 FlightBookingPolicy
,酒店 HotelBookingPolicy
。
如果您从 BookFlight
命令开始,FlightBookingPolicy
可以发布一个名为 FlightBooked
的事件。 BookingPolicy
可以使用该事件来启动它自己的 saga 实例。因此,例如,发送所有命令的 (ASP.NET) 网站不必知道 BookingPolicy
。它只是发送带有适当数据的适当命令。酒店、汽车等也是如此
然后在某个时候,网站发送 CommitBooking
或 FinishUpMyVacation
命令, 确实到达 BookingPolicy
传奇,然后完成整个预订。它发送一个事件 BookingFinishingUp
或其他东西。基于该事件,某些处理者可能会从信用卡中扣款。另一个处理程序与第 3 方集成以实际提交假期。另一个处理程序发送电子邮件。等等。
最后,当 BookingPolicy
(甚至 另一个 saga)完成时,BookingPolicy
saga 将发布一个名为 BookingFinished
的事件,并且相应的FlightBookingPolicy
和HotelBookingPolicy
和CarBookingPolicy
也结束了他们的工作。不管是什么。
这有意义吗?如果需要,您也可以在 https://discuss.particular.net/ 或 support@particular.net.
上继续对话