5

上SO(真???)第一个问题,所以大家多多包涵请:)事件采购和传奇 - 补偿事务

我们使用架构采购事件的解决方案。我们的一些业务流程将长期运行,因此我们计划使用sagas来编排命令至若干聚合根

在我的理解,如果一个传奇,发出的命令应该失败,佐贺县将负责发行补偿命令所有以前调用的总根源。

应该动作的过程中如果聚集体根的状态将是突变外部(通过某些其它进程/用户IE)后它需要在佐贺一部分,但之前佐贺失败并且向该聚合根发出补偿命令

换句话说,如何尝试补偿某个聚合根的事件流(以EventStore术语说话)中不是最后一个的事件?

+2

我想你可以依靠事件中的信息或AR本身来查看补偿行为是否仍然可以发生。如果没有,那么您可以启动需要手动解决冲突的流程。 – plalx

回答

2

这是一个相当棘手的情况,因为我所看到的是,您可能后你的补偿项具有无效AR 结束了,让你的补偿行为无效。

您可能将不得不重新审视流程的设计,以便在确定您的流程管理器(saga)能够完成之前,不会对AR进行更改。也许暂时存储值以供稍后更改。

另一种方法可能是阻止AR上的某些命令,如果它处于某种状态,表明它可能导致这些命令的问题。用户将无法发布这些命令。您的流程经理会负责状态以及任何状态到期/超时等等。

+0

感谢您的回答。尽管我有一些评论。您首次提出的解决方案看起来很像锁定,这可能会导致性能问题。第二个提议假设受助组织是他们参与一个传奇故事的智者,这在我看来是违背了传奇原则,只有传奇知道编排细节和ARs才被引用。 – tdaliviu

+1

我不认为存储值供以后使用就像锁定在所有:)第二个选项*可能*只需要获得传奇的工作,但如果它是一个麻烦,那么可能需要另一个解决方案。我以前在流程管理器中使用过相当多的数据,而国家只针对流程管理器。但正如我前面提到的,这是一个棘手的情况。最好的办法是避开你的现场直播,直到你确信可以安全地应用更改。 –

+0

我一直在给这个想法,我不知道在AR上使用某种'状态'是否会让它意识到一个流程管理器。以'订单'为例,它的生命周期肯定有一些地位*,但它与业务流程有关。因此不一定与流程管理者有关,但它肯定知道某种形式的业务流程。 –