Saga,在哪里存储聚合状态

Saga, where to store aggregate status

我是 saga 的新手。

这是一个简单的场景:

  1. 用户点击"Create Order":一个订单被创建(一开始保持它的状态=NEW)
  2. 用户完成订单填写后,单击保存 --> 现在状态为已提交
  3. 当另一个检查订单并验证它时,必须进行一个过程。仅当其他一些服务被调用并给出它们的 GO 时,订单才有效。

整个工作流程是:

所以我需要避免订单在 VALIDATION 进行时回滚到 NEW

我的问题是,对于第 3 步,是否更好:

谢谢

DDD 是关于领域的,所以首先您需要了解业务需求。那么,让我们看看规则是什么:

  1. 可以创建新订单
  2. 可以提交已创建的订单,但需要经过验证
  3. The validation process 可能需要一些时间,可以取消。如果取消订单可以重新提交
  4. The validation process 可以拒绝订单或接受订单
  5. 如果订单被拒绝,可以在更正后再次提交
  6. 如果订单被接受,它将被发送到下一个流程,无法提交或更正。

也就是说,我会将这两个过程(订单创建+创建和订单验证)分开。此外,我会在 OrderAggregate 上保留一个状态 属性,用于强制执行其不变量。状态可以是:

  1. new:订单创建后或取消验证或拒绝订单后
  2. submitted:提交验证后
  3. sent: 被验证过程接受后。

如果您需要其他行为,您应该添加新状态

OrderValidationSaga 还会有一个内部状态,用于跟踪从外部服务收到的外部响应。假设我们需要使用两个外部服务。状态将是一个具有两个属性的对象:service1IsOkservice2IsOk。当任何服务表示订单无效时,saga 将拒绝订单,无论内部进度如何,并重置其内部状态。当服务说 OK 时,saga 在内部将其标记为 OK,然后检查所有服务是否都 OK。如果他们没问题,它会告诉聚合发送订单。然后聚合将订单标记为 sent 并发出事件。 If/when 进程被取消,saga 重置其内部状态。

请注意,如果您使用 CQRS,则所有状态更改都是通过发送命令和引发事件来完成的。 saga 将订阅事件并将适当的命令发送到聚合。

有一篇精品文章here