gpt4 book ai didi

.net-core - CQRS 是 saga/process manager 同步执行一组相关命令的最佳方法吗?

转载 作者:行者123 更新时间:2023-12-02 08:08:18 24 4
gpt4 key购买 nike

我有一个 CQRS .NET Core 服务,目前每个命令都有一个端点。有时,一组命令构成系统中的单个操作(例如创建评估),一旦前一个命令将数据提交到数据库(这是因为旧数据库设计),就必须同步执行 3 个左右的命令。

目前,这是由客户端处理的,其中每个命令在它之前的依赖命令完成后触发(使用 promise )。

值得注意的是,这些命令有时也会单独执行,如果将它们组合成一个命令,最终会变得庞大且难以测试。

我想要做的是创建一个单一的端点来管理像我们的创建评估一样的操作,它必须一个接一个地执行以下命令:

  • 用户创建
  • 评估创建
  • 评估RegisteredToClient

  • 我一直在走使用 MassTransit 传奇/状态机/流程管理器的路线,但我对它的工作越多(并且我的理解提高得越多),我就越认为这似乎是矫枉过正而不是正确的方法(如这些是命令而不是事件,并且都在单个有界上下文中)。

    流程管理器看起来合适吗?如果合适,MassTransit 状态机实现是要走的路还是我应该查看其他来源?或者我应该只是简单地创建一个端点,一次触发一个命令(即在 ASP Controller 中有这个同步代码)?

    最佳答案

    澄清一下,UserCreated不是命令,而是事件。

    您在这里有三个选择:

  • 而是建立一个响应式(Reactive)系统。所以,在 CreateUser 之后(顺便说一句,这里不是一种很好的语言,因为您从未创建用户,他们在您的系统中注册)您发出 UserCreated ,这会导致发送命令 CreateAssessment 的 react 等等。
  • 使用 MT saga 作为流程管理器。如果您需要确保有些复杂的工作流以您期望的方式完成(或失败),状态机非常适合。
  • 使用 MT courier 特性实现分布式事务。您将有一系列事件、行动和补偿行动(逆转)。

  • 我会亲自分析我的问题,以找出在我返回用户并说“没关系”之前我需要做的最低限度的事情。其余的可以在幕后异步完成。与其说是技术,不如说是领域分析。

    2019 年 4 月 12 日更新,回答其中一条评论:

    同样,当前应用的术语存在问题。许多消息传递库,如 MassTransit、Rebus 或 NServiceBus,使用 saga 一词来表示流程管理器。

    使用原始术语,流程经理处理可能存在偏差和并行化的整个流程。另一方面,Sagas 实现了单流程流程。当传奇中的任何一步失败时,之前发生的一切都会使用补偿 Action 恢复。传奇没有编排,因为每一步都是独立的,当一个步骤完成时,下一步就会被执行。 Sagas 始终是无状态的,如果需要为下一步包含一些附加信息,则 saga 事件需要将其放入有效负载中。

    根据定义,流程管理器是协调器。它从不自己完成工作,而是指示其他组件完成工作。然后,通过监听事件,流程管理器决定流程应该如何流动。
    流程管理器可以启动补偿操作,但它本身并不执行该操作,而是指示另一个组件执行该工作。为了保持流程的当前状态,流程管理器是有状态的。

    关于.net-core - CQRS 是 saga/process manager 同步执行一组相关命令的最佳方法吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49485082/

    24 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com