首页 > 解决方案 > 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

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

标签: nservicebusnservicebus-sagas

解决方案


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

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

此外,命令是命令式,事件是过去时。所以BookFlight对于一个命令和FlightBooked一个事件。

理论上,您可以创建多个 saga,它们都参与一个长期运行的业务流程。一个传奇叫BookingPolicyor BookingProcessorBookingSaga来编排整个过程。FlightBookingPolicy对于航班和酒店HotelBookingPolicy

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

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

最后,当BookingPolicy(甚至是另一个 saga)完成时,BookingPolicysaga 将发布一个名为BookingFinishedand 的事件FlightBookingPolicyHotelBookingPolicyCarBookingPolicy结束他们的工作。不管那可能是什么。

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


推荐阅读