当前位置: 首页 > 知识库问答 >
问题:

Saga,在哪里存储聚合状态

郭凡
2023-03-14

下面是一个简单的场景:

  1. 用户单击“Create order”:将创建一个订单(首先保持其状态=NEW)
  2. 用户完成订单填写后,单击SAVE-->state is now Submited
  3. 当另一个检查订单并验证它时,必须进行一个过程。只有在调用了其他一些服务并给予许可时,才会验证该订单。

整个工作流程是:

    null
    null

谢谢

共有1个答案

左丘成仁
2023-03-14

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

  1. 可以创建新订单
  2. 创建的订单可以子映射,但在验证后
  3. 验证过程可能需要一些时间,可以取消。如果订单被取消,则可以再次子代订单
  4. 验证过程可以拒绝订单或接受订单
  5. 如果订单被拒绝,在更正后可以再次提交
  6. 如果订单被接受,它将被发送到下一个进程,并且无法提交或更正。

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

    null

只有在需要传统行为时才应该添加新状态。

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

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

 类似资料:
  • 问题内容: 我对这个问题进行了一些搜索,但发现了非常模糊的答案。在redux中,我们知道状态存储为对象。但是这种状态实际上存储在哪里?它是否以某种方式保存为文件,以后我们可以访问?我所知道的是,它不会以Cookie格式或浏览器的本地存储方式存储它。 问题答案: Redux中的状态存储在Redux存储中的内存中。 这意味着,如果刷新页面,该状态将消失。 您可以想象该商店看起来像这样: redux中的

  • 我觉得Angular对模型的使用让人困惑。Angular似乎采取的方法是,模型可以是任何你喜欢的--即。Angular不包含显式的模型类,您可以使用常规JavaScript对象作为模型。 “编辑”这个问题的第二个答案很有趣,也很接近我目前使用的。

  • 问题内容: 因此,我有了这种elasticsearch安装,可以在用logstash插入数​​据时使用kibana可视化它们。 conf文件中的所有内容均已注释,因此它使用的是相对于elasticsearch文件夹的默认文件夹。 这怎么可能? 但是,此命令将删除数据: 谢谢。 ps:忘了说我在窗户上 问题答案: 如果您在Linux上安装了ES,则默认数据文件夹位于(CentOS)或(Ubuntu)

  • 我无法让这个C#解决方案(点击下载-666MB或在GitHub上浏览此处)编译: 我得到的错误是 此项目引用了此计算机上缺少的NuGet包。使用NuGet包还原来下载它们。如需详细资讯,请参阅http://go.microsoft.com/fwlink/?LinkID=322105.遗失的档案是..\ packages \ accord . 3 . 8 . 0 \ build \ accord .

  • 问题内容: 被存储在客户端或服务器上的变量? 问题答案: 变量存储的位置由PHP的配置确定。通常这是在Linux / Unix系统上。如果无法100%确定,请使用此功能查看您的特定设置,方法是在您域的中创建具有以下内容的文件:

  • 问题内容: 这可能是一个愚蠢的问题,但是我对Java Logger有点迷茫 我在哪里可以看到日志?同样来自java.util.logging.Logger库的这句话: 在每次记录调用时,记录器最初都会根据记录器的有效日志级别对请求级别(例如SEVERE或FINE)进行廉价检查。如果请求级别低于日志级别,则日志记录调用立即返回。 通过此初始(便宜)测试后,记录器将分配一个LogRecord来描述记录