CQRS是SAGA/Process Manager,是同步执行一组相关命令的最佳方法



我有一个CQRS .NET核心服务,该服务当前具有每个命令的单个端点。有时,一系列命令在系统中构成一个动作(例如,创建评估(,一旦以前的命令将数据授权到数据库,就必须同步执行3个命令(这是因为旧版数据库设计(。

目前,这是由客户处理的,每个命令都在以前的依赖项完成后发射(使用承诺(。

值得注意的是,这些命令有时也会单独执行,如果将它们合并到一个命令中,最终将变得很大,很难测试。

我想做的是创建一个单个端点,该端点像我们的创建评估一样,必须执行以下命令一个接一个地执行以下命令:

  1. 用户创造
  2. 评估创作
  3. 评估注册toclient

我一直在使用MassTransit Saga/State Machine/Process Manager的途径,但是我对它的工作越多(我的理解越有所提高(,我认为它看起来越多,而不是正确的,方法(因为这些是命令,而不是事件,而在单个有限的上下文中(。

流程管理器看起来很合适,如果是这样,MassTransit State Machine实施是否需要解决,或者我应该查看其他来源?或者我应该只是创建一个端点,一次启动每个命令一个命令(即在ASP控制器中使用此同步代码(?

只是为了澄清, UserCreated不是命令,而是事件。

您在这里有三个选择:

  • 改为构建一个反应性系统。因此,在CreateUser之后(顺便说一句,在这里不是很好的语言,因为您从未 create 您的用户,他们在您的系统中注册(,您会发出UserCreated,这会导致反应发送命令CreateAssessment等。
  • 使用MT SAGA作为流程管理器。如果您需要以您期望的方式确保您的工作流程完成(或失败(,则状态机非常适合。
  • 使用MT快递功能来实现分布式交易。您将有一系列活动,行动和补偿行动(逆转(。

我会亲自分析我的问题,以找出我需要做什么,然后才能返回用户并说"没关系"。其余的可以不同步,在幕后。

对域分析而言更多。

更新04/12/2019,回答以下评论之一:

再次,目前应用的术语存在一个问题。许多消息传递库,例如MassTransit,Rebus或nservicebus,都使用该词 saga 为过程经理。

使用原始术语,过程经理通过可能的偏差和并行处理来处理整个过程。另一方面,萨加斯实施了一个单流程。当传奇中的任何步骤失败时,都会使用补偿动作恢复之前发生的一切。萨加斯没有编排,因为每个步骤都是独立的,并且一步完成后,下一步将执行。传奇总是无状态的,如果需要在下一步中包含一些其他信息,则传奇活动需要将其放在有效载荷上。

根据定义,流程管理器是是编排者。它从来没有自己做工作,而是指示其他组件来完成工作。然后,通过收听事件,过程管理器决定过程应如何流动。Process Manager 可以启动薪酬措施,但它没有执行操作本身,它指示另一个组件来完成这项工作。为了保持流程的当前状态,过程经理是有状态的。

,因为所有命令均由相同的聚合处理处理,所以解决方案是创建一个第4个组合命令,以无处不在的语言命名,其中包含3个命令。在内部,聚合只是调用3个命令方法,因此没有代码重复。

沿最简单的解决方案,也可以显式,在这种特定用例中,这些命令以单个交易和该顺序执行:它们都成功或失败。

P.S。正如@alexeyzimarev指出的那样,这些不是命令,而是事件

最新更新