在许多示例中,我看到某些事件发生时启动了流程管理器。
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命令。
答案 0 :(得分:2)
是的,您可以手动(重新)启动Saga / Process Manager。所以您可以将两种方法结合起来。
...该事件可能会丢失,并且“采购流程管理器”将永远无法启动,并且我的系统状态会被破坏。
这在很大程度上取决于您的体系结构。您应该有适当的机制来检测丢失的事件并重新启动这些Saga实例。之所以可行,是因为Saga应该能够从任何情况下恢复,例如错过事件,重新排序的事件,重复的事件等等。
因此,Saga在事件处理程序旁边可能有一个start
方法,您应该可以在任何时候调用它,而不会产生任何负面影响。如果佐贺县没有错过任何事件,那么它就什么也不做。如果您在设计聚合时考虑到了幂等性(如您应该做的那样!),那么Saga可能会更简单,因为它可以将命令重新发送给聚合,并且不会发生任何(不好的)情况,因为它们会影响幂等性。 / p>