CQRS中单个进程的多个命令

Cha*_*ris 6 cqrs event-sourcing

我有CQRS + ES设计的应用程序.这是我新的CQRS + ES世界在过去一年中一直在阅读它并且它非常有意义,但实现完美的感觉并不容易.

无论如何,我的问题是:

包含多命令(步骤)过程的最佳方法是什么?即注册用户这些是我想在该过程中触发的命令:

  1. CreateUserProfileCommand
  2. CreatePaymentAccountCommand
  3. SendEmailAddressVerificationCommand

我看过Saga,他们看起来更开始和停止然后这个过程都是连续的.

当然,链接事件的步骤可能导致重播噩梦.

更新 @EbenRoux
要添加更多信息,CreatePaymentAccount实际上应该命名为UpdateUserWithPpaymentAccount.我看到命名中的混乱.这个命令实际上是什么让第三方得到了一个附加给用户的PaymentCustomerId.

我得到你对佐贺的看法,我想知道这个过程是否需要.

现在这个应用程序正在进行中所以所有业务上下文(我假设你是BC的意思)没有一个端点pub/sub立场.我想到达那里.

Ebe*_*oux 5

请记住,命令不会重播。在我的理解的这个阶段,我认为系统/域消息与事件溯源(ES)中使用的事件不同。ES 事件代表状态。他们不应参与任何处理。它们永远不会导致命令被执行或以任何方式导致命令被执行。它们只是保存域模型状态的另一种方法。

您的流程管理器(有时称为saga)将是另一个流程有界上下文 (BC) 中的一等公民,它协调系统消息传递,并且状态当然也可以使用 ES 进行存储。

您可以将相同的消息(如果您愿意)从不同的源路由到不同的端点。例如:从前端/集成层,您可以发送CreatUserProfileCommand,路由将其发送到您的进程 BC,其中处理程序创建一个新的UserRegistrationProcess,存储流并将CreateUserProfileCommand现在路由到UserBC 的 发送。

从BC发布您的流程 BC 订阅的Usera ,并更新该流,保存流,并将 a发送到BC。这是一个系统消息(事件)的示例,其结构可能与为 ES 方面生成的任何内容有所不同。UserProfileCreatedEventUserRegistrationProcessCreatePaymentAccountCommandPayment

现在,从PaymentBCPaymentAccountCreatedEvent发布了该消息,该消息也由进程 BC 订阅,并将该消息SendEMailAddressVerificationCommand发送到相关的 BC。

出现了一种相当常见的模式。

因此,您可以避免任何重播噩梦,因为关注点是明确分开的。