流程管理器是否使用关联it或特定于聚合的标识来跟踪它正在管理的流程?
为了更清楚地使用一个例子,请考虑萨格斯传奇上的图2
首先,Process发送一个OrderConfirmed
事件是错误的吗?我(作为进程管理器)不能发送事件,只能发出命令。还是我错了?
第二,流程管理器如何将来自不同聚合体的OrderCreated、SeatsReserved、PaymentReceived事件关联起来?是每个聚合荣誉(并复制)的相关性id,还是特定的标识符(例如,SeatsReserved具有引用订单聚合的订单Id )?
最后,如果是关联it,那么是谁创建的呢?是客户端发出命令吗,比如PlaceOrder(order_id, correlation_id)
?是聚合接受像PlaceOrder(order_id)
这样的命令,然后发出OrderCreated(order_id, corr_id)
事件吗?或者,是过程经理(在某种程度上)对此负责?或者,也许相关ids与此无关?
谢谢你的帮助。
发布于 2017-03-05 07:29:38
强烈推荐通过过程管理器设计模式的原始来源,以及@ Vernon在他的伟大著作“实现领域驱动设计”中对这个主题的处理
简而言之,processes通过它在启动特定进程时创建的流程实例并发处理多个进程。流程实例的Id是您的相关标识符,它是进程持续时间内每个通信的有效负载(命令/事件)的一部分。流程实例还有另一个术语,即流程跟踪器。想法是一样的。
因此,在这种方法中,有一个明确的分离关注。每个进程实例根据其当前状态、重试、完成等来负责它自己的进程,它是一个进程实例,它负责发出ProcessFinished事件,因为它是“大脑”。
流程管理器的另一个名称是长时间运行的流程。因此,从定义上来说,最好是异步的。
~ Sergiy
<><
发布于 2017-03-05 09:58:51
我认为过程经理是我领域内的头等公民。流程管理器实例的Id
通常充当相关Id。由于流程管理器是一个状态机,它实际上可以发布事件。我认为领域事件不同于系统事件。消息传递基础结构依赖于系统事件。它们将携带相关id,是的,它将被复制到相关消息,但这是您的基础设施可以自动完成的事情。在我的Shuttle.Esb服务总线中,我只做了这样的工作:复制标头和关联id。
这就是为什么我也把事情的过程方面看作是BC本身的一种类型。它通过发出命令,然后响应相关事件,与构成进程一部分的各种BCs进行交互。但是在基础结构(端点)层上,我可能希望发布一个事件,该事件声明某个特定进程已经放弃、完成或从一个步骤转移到下一个步骤。
编辑
在我看来,流程管理器本身也是一个集合。所有命令和事件都将来自消息处理程序/应用程序层,以响应域中发生的事情。任何来自域的事件,从本质上来说,都是域事件,这些事件不一定适合系统到系统通信。我认为“在集成/应用程序层上”比在基础结构(端点)层上更合适。
所有消息都在消息处理程序中处理。该消息处理程序充当集成点,必须直接或通过应用程序层与域交互。我的措辞可能没有说明这一点:)
发布于 2017-03-05 20:33:05
免责声明:由于您提到的示例使用了"saga“和”过程管理器“两个术语,所以我也会这样做。我知道saga和流程管理器模式在定义上是不同的,但是在行业中,我们看到saga这个词正在被许多流行的框架所应用(从NServiceBus开始)。
考虑到这个特定的例子,它将是:
OrderConfirmed
事件,将命令发送到下一步,等待它生成确认事件,并在整个过程完成时发出它自己的事件,在这种情况下,它通过一些UI魔术发送给客户。我看不出这种做法有什么不对。不过,也许有更好的解决办法。您还可以找到一篇关于使用状态机和MassTransit框架在克里斯·帕特森的博客文章中长期运行的流程实现的很好的博客文章。
https://stackoverflow.com/questions/42601056
复制相似问题