Domain driven design 事件源和传奇-补偿事务

Domain driven design 事件源和传奇-补偿事务,domain-driven-design,cqrs,distributed-transactions,event-sourcing,Domain Driven Design,Cqrs,Distributed Transactions,Event Sourcing,第一个问题是这样的(真的吗?),所以请容忍我:) 我们正在使用事件源设计解决方案。我们的一些业务流程将长期运行,因此我们计划使用sagas来协调对多个聚合根的命令 根据我的理解,如果saga发出的命令失败,saga将负责向之前调用的所有聚合根发出补偿命令 如果聚合根的状态在参与saga后发生外部变异(即由其他进程/用户),但在saga失败并向该聚合根发出补偿命令之前,,则应采取什么行动 换句话说,如果一个事件不是某个聚合根的事件流中的最后一个(用EventStore的行话来说)?这是一个相当棘手

第一个问题是这样的(真的吗?),所以请容忍我:)

我们正在使用事件源设计解决方案。我们的一些业务流程将长期运行,因此我们计划使用sagas来协调对多个聚合根的命令

根据我的理解,如果saga发出的命令失败,saga将负责向之前调用的所有聚合根发出补偿命令

如果聚合根的状态在参与saga后发生外部变异(即由其他进程/用户),但在saga失败并向该聚合根发出补偿命令之前,,则应采取什么行动


换句话说,如果一个事件不是某个聚合根的事件流中的最后一个(用EventStore的行话来说)?

这是一个相当棘手的情况,因为我看到的是,在补偿输入之后,您可能会得到一个无效的AR,使您的补偿操作无效

您可能需要重新审视流程的设计,以便在您确信您的流程管理器(saga)能够完成之前,不会对ARs进行更改。可能会暂时存储这些值以供以后更改


另一种方法可能是防止AR上的某些命令处于某个状态,表明可能导致这些命令出现问题。用户将无法发出这些命令。您的流程经理将处理该状态以及任何状态过期/超时等。

感谢您的回答。不过我有一些意见。您提出的第一个解决方案看起来很像锁定,这可能会导致性能问题。第二个建议假设ARs将是诺斯替派,他们参与了一个传奇,在我看来,这与saga原则背道而驰,即只有saga知道编排细节,而ARs只是被调用。我不认为存储值供以后使用与锁定非常相似:)第二个选项可能只需要让saga工作,但如果这是一个麻烦,那么可能需要另一个解决方案。我以前在process manager中使用过相当多的数据,其中状态仅特定于process manager。但正如我前面提到的,这是一个棘手的情况。最好的方法是避开您的实时AR,直到您确定可以安全地应用更改。我已经对此进行了一些思考,我不知道在AR上使用一些“状态”是否会让它意识到流程管理器。以
订单
为例,它在其生命周期中肯定有一些状态,但它与业务流程相关。因此,不一定与流程管理器相关,但它肯定知道某种形式的业务流程。对不起,没有从一开始就正确地理解答案的第一部分-确保存储一些临时数据不会阻塞,我的错。我同意你的观点,即只在安全的情况下存储更改,但在ARs中包含一个与传奇相关的状态将挑战传奇不可知论的ARs本身。此外,AR还可以在不同的环境中参与多个传奇故事。一般的问题仍然存在——在并发环境中工作时,是否存在不涉及事务本身的分布式事务模式?我猜您可以依赖事件中的信息或AR本身来查看补偿操作是否仍然可以发生。如果没有,那么您可以启动一个需要手动解决冲突的流程。