And*_*yuk 10 domain-driven-design cqrs event-sourcing
流程经理是否使用关联ID或特定于聚合的标识来跟踪其管理的流程?
为了更清楚地举一个例子,请考虑Saga on Sagas上的图2 :
首先,Process Manager发送OrderConfirmed事件是对的吗?我(作为进程管理器)无法发送事件,只发出命令.还是我错了?
其次,流程管理器如何关联来自不同聚合的OrderCreated,SeatsReserved,PaymentReceived事件?是每个聚合符合(并复制)的相关ID,还是特定标识符(例如SeatsReserved具有引用订单聚合的订单ID)?
最后,如果是相关id的情况,谁创建它们?是发出命令的客户端,比如PlaceOrder(order_id, correlation_id)?是聚合接受命令PlaceOrder(order_id)然后发出OrderCreated(order_id, corr_id)事件吗?或者,是负责这个的流程经理(以某种方式)?或者,相关id可能与此无关?
谢谢你的帮助.
强烈建议在他的伟大着作" 实施领域驱动设计"中了解过程管理器设计模式的原始来源以及@Vaughn Vernon对该主题的处理
简而言之,Process Manager通过在启动特定进程时创建的Process实例同时处理多个进程.流程实例的ID是您的关联标识符,它是流程持续时间内每个通信(命令/事件)的有效负载的一部分.Process实例还有另一个术语,即Process Tracker.这个想法是一样的.
因此,在这种方法中,关注点明显分离.每个流程实例在其当前状态,重试,完成等方面负责其自己的流程.它是一个流程实例,负责发出ProcessFinished事件,因为它是"大脑".
Process Manager的另一个名称是Long Running Process.因此,根据定义,最好是异步.
~Sergiy
<> <
我将流程经理视为我所在领域的一等公民。流程管理器实例Id的 典型地充当相关 ID。由于流程管理器是一个状态机,它实际上可以发布事件。嗯,我认为领域事件与系统事件不同。消息传递基础结构依赖于系统事件。这些是携带相关 ID 的消息,是的,它将被复制到相关消息中,但这是您的基础设施可以自动执行的操作。在我的Shuttle.Esb服务总线中,我就是这样做的:复制标头和相关 ID。
这就是为什么我也将事物的流程方面视为其本身几乎是一种 BC 类型。它通过发出命令然后响应相关事件来与构成流程一部分的各种 BC 进行交互。但在基础设施(端点)层上,我可能想发布一个事件,表明特定流程已被放弃或完成或从一个步骤移至下一步。
编辑:
在我看来,流程管理器本身也是一个集合体。所有命令和事件都来自消息处理程序/应用程序层,以响应域中发生的情况。任何确实来自域的事件就其本质而言都将是域事件,并且这些事件不一定适合系统到系统的通信。我想说“在集成/应用程序层上”比在基础设施(端点)层上更合适。
所有消息都在消息处理程序中处理。该消息处理程序充当集成点,并且必须直接或通过应用程序层与域交互。我的措辞可能没有那么明显:)
| 归档时间: |
|
| 查看次数: |
2376 次 |
| 最近记录: |