nservicebus - nservicebus 从另一个 Saga 中调用 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
.
此外,命令是命令式,事件是过去时。所以BookFlight
对于一个命令和FlightBooked
一个事件。
理论上,您可以创建多个 saga,它们都参与一个长期运行的业务流程。一个传奇叫BookingPolicy
or BookingProcess
orBookingSaga
来编排整个过程。FlightBookingPolicy
对于航班和酒店HotelBookingPolicy
。
如果您从BookFlight
命令开始,则FlightBookingPolicy
可以发布一个名为FlightBooked
. 可以使用该BookingPolicy
事件来启动它自己的 saga 实例。因此,例如,发送所有命令的 (ASP.NET) 网站不必知道BookingPolicy
. 它只是发送带有适当数据的适当命令。酒店,汽车等也是如此。
然后在某个时候,网站会发送一个CommitBooking
orFinishUpMyVacation
命令,该命令确实到达了BookingPolicy
saga 并最终确定了整个预订。它发送一个事件BookingFinishingUp
或其他东西。基于该事件,某些处理程序可能会从信用卡中扣款。另一个处理程序与第 3 方进行集成以实际提交假期。另一个处理程序发送电子邮件。等等。
最后,当BookingPolicy
(甚至是另一个 saga)完成时,BookingPolicy
saga 将发布一个名为BookingFinished
and 的事件FlightBookingPolicy
,HotelBookingPolicy
并CarBookingPolicy
结束他们的工作。不管那可能是什么。
那有意义吗?如果需要,您还可以在https://discuss.particular.net/或 support@particular.net 上继续对话。
推荐阅读
- vb.net - 使用后台 Worker VB.Net 运行 Dos 程序
- php - 试图获取非对象错误PHP curl的属性
- html - 为什么我的 .service:nth-child(1) is not 不工作?
- c++ - C++ 将源文件中的某些函数设为私有的最佳方法是什么?
- android - 警报管理器设置了一个额外的警报
- amazon-web-services - 使用 AWS 弹性豆茎改造 502 badgateway - kotlin
- python - 用标记替换轮廓中的级别标签
- c++ - 写哥德巴赫猜想程序的问题
- reactjs - 如何在 react.js 中使用 svelte store
- python - scipy.integrate.quad 有没有办法接受 args 中的数组?