【问题标题】:Saga, where to store aggregate statusSaga,存储聚合状态的位置
【发布时间】:2017-04-21 20:37:04
【问题描述】:

我是传奇的新手。

这里是一个简单的场景:

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

整个工作流程是:

  • NEW-> SUBMITTED.
  • SUBMITTED,用户可以取消提交并将订单切换回NEW
  • 验证可以将订单状态设置为VALIDATEDREJECTED
  • 如果REJECTED 原始用户必须先修复他的订单,然后再将其提交给验证。

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

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

  • 将订单状态更新为 PENDING,引发事件并开始 saga(具有自己的状态以及流程的编排和例程失误)?
  • 从订单聚合中移除状态并将其放入 saga(所以 saga 从步骤 1 开始)? saga 被命名为 OrderSaga,它封装了从开始到结束的所有过程,而不仅仅是需要外部服务的部分,即分布式事务。
  • 还有别的吗? (感谢链接到博客或谷歌群组邮件)

谢谢

【问题讨论】:

    标签: domain-driven-design saga


    【解决方案1】:

    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,然后它会检查所有服务是否都正常。如果他们没问题,它会告诉聚合发送订单。然后聚合将订单标记为sent 并发出一个事件。如果/当进程被取消时,saga 会重置其内部状态。

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

    有一篇很好的文章here

    【讨论】:

    • OrderValidationSaga 启动时,您是否也更改了 OrderAggregateStatus(更改为 VALIDATION_PENDING)?如果不是,您将如何处理提交可以取消,因为最后一个内部状态是SUBMITTED,但一个传奇正在进行中(并且可以持续几个小时)。或者你是否也检查内部状态+是否存在传奇(对我来说似乎更复杂)。 ?
    • @Archange 据我了解,在验证开始之前,它具有submited 状态。 Submited 等价于 validation in progress。那么它可以是canceledvalidated(又名sent)。请记住,您将汇总存储任何状态或您需要的任何内容,以便决定下一步做什么/允许做什么。
    • 好的,我更新了我的问题。工作流程是:NEW -> SUBMITTED。从SUBMITTED,用户可以取消提交并将订单切换回NEW。验证可以将订单状态设置为VALIDATEDREJECTED。如果REJECTED 原始用户必须修复他的订单,然后再将其提交给验证。所以我需要避免在VALIDATION 正在进行时订单可以回滚到NEW
    • @Archange,看来你已经明白了。你还需要别的吗?
    • 您认为引入Validation_in_progress 状态是一种解决方案吗?还是您更喜欢检查 ValidationSaga 聚合是否存在?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-07-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多