CQRS:通过命令而不是事件启动进程管理器

时间:2018-07-28 09:19:40

标签: cqrs saga

在许多示例中,我看到某些事件发生时启动了流程管理器。

PlaceOrder -> Order Aggregate -> OrderPlaced -> Purchase Process Manager -> ...

但是可以通过命令启动进程管理器吗?

Start Process -> Purchase Process Manger -> PlaceOrder -> Order Aggregate -> Order Placed -> Purchase Process Manger -> Charge credit card -> Payment Service -> ...

我用第一种方法看到的问题是,当Order Aggregate发布OrderOrderd事件时,该事件可能会丢失并且Purchase Process Manager将永远不会启动,并且我的系统状态也会被破坏。

但是在第二种方法中,如果一段时间后Process Manger没有收到OrderPlaced事件,我可以重试PlaceOrder命令。

1 个答案:

答案 0 :(得分:2)

是的,您可以手动(重新)启动Saga / Process Manager。所以您可以将两种方法结合起来。

  

...该事件可能会丢失,并且“采购流程管理器”将永远无法启动,并且我的系统状态会被破坏。

这在很大程度上取决于您的体系结构。您应该有适当的机制来检测丢失的事件并重新启动这些Saga实例。之所以可行,是因为Saga应该能够从任何情况下恢复,例如错过事件,重新排序的事件,重复的事件等等。

因此,Saga在事件处理程序旁边可能有一个start方法,您应该可以在任何时候调用它,而不会产生任何负面影响。如果佐贺县没有错过任何事件,那么它就什么也不做。如果您在设计聚合时考虑到了幂等性(如您应该做的那样!),那么Saga可能会更简单,因为它可以将命令重新发送给聚合,并且不会发生任何(不好的)情况,因为它们会影响幂等性。 / p>