代码之家  ›  专栏  ›  技术社区  ›  Michael Kang

NserviceBus从另一个故事中调用一个故事

  •  0
  • Michael Kang  · 技术社区  · 6 年前

    我刚接触过NServiceBus,正在尝试寻找一种最佳的方法来建模一个使用补偿事务的场景。

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

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

    1. bookhotelcommand-->bookhotelsaga
    2. bookflightcommand-->回复iLightBookedMessage
    3. BookRentalCommand-->回复iRentalBookedMessage
    4. ReplyToOriginator——>热预订邮件

    我如何在上面的流程中建模补偿事务?我最初考虑在上面的一个回复中,根据一些业务条件,调用一个“unbokhotelsaga”。然而,我似乎在工作中遇到了一些挑战。如果这是正确的方法,有萨加经验的人能评论吗?

    以下是我想的另一个故事:

    1. bookhotelcommand-->bookhotelsaga
    2. bookflightcommand-->回复iLightBookedMessage
    3. BookRentalCommand-->(满足条件)-->UnbokhotelCommand-->Unbokhotelsaga
    4. unbokerentalcommand-->回复iunbookrentalmessage
    5. unbokflightcommand-->回复iunbookflightmessage
    6. unbokehotelcommand-->replyToOriginator-->未bokedhotelmessage

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

    1 回复  |  直到 6 年前
        1
  •  2
  •   Dennis van der Stelt    6 年前

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

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

    此外,命令位于 imperative tense 和事件 past tense . 所以 BookFlight 命令和 FlightBooked 对于一个事件。

    理论上,您可以创建多个Saga,它们都参与到一个长期运行的业务流程中。一个传说叫 BookingPolicy BookingProcess BookingSaga 协调整个过程。及 FlightBookingPolicy 在飞机上 HotelBookingPolicy 去酒店。

    如果你从一开始 预订航班 命令 机票预订政策 无法发布名为的事件 预定航班 . 这个 预订政策 可以使用该事件启动自己的saga实例。例如,发送所有命令的(ASP.NET)网站不必知道 预订政策 。它只是用适当的数据发送适当的命令。酒店、汽车等也是如此。

    然后在某个时刻,网站发送一个 CommitBooking FinishUpMyVacation 命令,其中 到了吗 预订政策 萨加和那完成了整个预订。它发送一个事件 BookingFinishingUp 或者别的什么。基于这个事件,一些处理程序可能会从信用卡中扣除钱。另一个处理程序与第三方进行集成,以实际提交假期。另一个处理程序发送电子邮件。等等。

    最后当 预订政策 (甚至 又一个传奇 )完成后, 预订政策 Saga将发布一个名为 BookingFinished 和适当的 机票预订政策 酒店预订政策 CarBookingPolicy 同时总结并结束他们的工作。不管是什么。

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