Domain driven design process manager如何跟踪聚合之间的关联
流程经理是否使用相关ID或聚合特定标识来跟踪其管理的流程Domain driven design process manager如何跟踪聚合之间的关联,domain-driven-design,cqrs,event-sourcing,Domain Driven Design,Cqrs,Event Sourcing,流程经理是否使用相关ID或聚合特定标识来跟踪其管理的流程 用一个例子来说明得更清楚,请考虑图2: 首先,Process Manager发送一个OrderConfirmed事件是错误的,对吗?我(作为流程管理器)不能发送事件,只能发出命令。还是我错了 其次,process manager如何关联来自不同聚合的OrderCreated、SeatsReserved和PaymentReceived事件?是每个聚合遵守(并复制)的相关id,还是特定标识符(例如SeatsReserved有一个引用订单聚合
用一个例子来说明得更清楚,请考虑图2:
首先,Process Manager发送一个OrderConfirmed
事件是错误的,对吗?我(作为流程管理器)不能发送事件,只能发出命令。还是我错了
其次,process manager如何关联来自不同聚合的OrderCreated、SeatsReserved和PaymentReceived事件?是每个聚合遵守(并复制)的相关id,还是特定标识符(例如SeatsReserved有一个引用订单聚合的订单id)
最后,如果是相关ID,谁创建它们?是客户机发出命令,比如PlaceOrder(order\u id,correlation\u id)
?是接受类似于PlaceOrder(order\u id)
的命令,然后发出OrderCreated(order\u id,corr\u id)
事件的聚合吗?或者,是流程经理(以某种方式)对此负责吗?或者,可能相关ID与此无关
感谢您的帮助。首先,我应该说,我的回答基于我的知识、经验以及我对如何在PHP上进行CQR的看法 首先,Process Manager发送订单确认事件是错误的,对吗?我(作为流程管理器)不能发送事件,只能发出命令。还是我错了 对。这是错误的。只有
聚合
引发域事件
并执行命令
。可能是Microsoft忘记显示发送到orderagragregate
的markorderasconformed命令
其次,process manager如何关联来自不同聚合的OrderCreated、SeatsReserved和PaymentReceived事件?是每个聚合遵守(并复制)的相关id,还是特定标识符(例如SeatsReserved有一个引用订单聚合的订单id)
我使用参与该过程的集合的ID。在这种情况下,关联ID与orderagragregate
的ID一一对应,具有相同的生命周期
最后,如果是相关ID,谁创建它们?是客户机发出命令,比如PlaceOrder(order\u id,correlation\u id)?是接受类似PlaceOrder(order_id)的命令,然后发出OrderCreated(order_id,corr_id)事件的聚合吗?或者,是流程经理(以某种方式)对此负责吗?或者,可能相关ID与此无关
在这种情况下,我不会使用相关ID。我仅将它们用于调试目的。在我的体系结构中,为了消除代码重复,相关ID由命令的创建者(在Saga中)或CommandDispatcher
生成(如果这是过程中的第一个命令,那么所有命令
都不是由Saga
生成的)和作为元数据存储在生成的事件中
更新:
如何使用相关ID?您可以从事件存储中选择具有该关联ID的所有事件,这样您就可以“查看”流程。强烈建议您了解设计模式的原始来源以及@Vaughn Vernon在其伟大著作中对该主题的处理
简而言之,Process Manager通过在启动特定流程时创建的流程实例并发处理多个流程。流程实例的Id是您的,它是流程持续时间内每个通信(命令/事件)的有效负载的一部分。流程实例还有一个术语,即流程跟踪器。想法是一样的
因此,在这种方法中,存在着明显的关注点分离。每个流程实例都负责其自身流程的当前状态、重试、完成等。它是一个流程实例,负责发出ProcessFinished事件,因为它是“大脑”
Process Manager的另一个名称是长时间运行的流程。因此,根据定义,最好是异步的
~z~塞吉
我认为流程经理是我所在领域的一等公民。process manager实例的Id
通常用作关联Id。因为process manager是一个状态机,所以实际上它可以发布事件。我认为域事件不同于系统事件。消息传递基础结构依赖于系统事件。这些将携带相关id,并且,是的,它将被复制到相关消息中,但这是您的基础结构可以自动执行的操作。在我的服务总线中,我只是这样做:复制头和相关id
这就是为什么我也认为过程方面的事情几乎是一种BC本身。它通过发出命令,然后响应相关事件,与构成流程一部分的各种BC进行交互。但是在基础设施(端点)层,我可能想发布一个事件,声明某个特定的进程已经被放弃、完成或从一个步骤移动到下一个步骤
编辑:
在我看来,流程管理器本身也是一个集合。所有命令和事件都将来自消息处理程序/应用程序层,以响应域中发生的事情。任何确实来自域的事件,就其本质而言,都是域事件,并且这些事件不一定适合系统到系统的通信。我想说“在集成/应用层”比在基础设施(端点)层更合适
所有消息都在消息处理程序中处理。该消息处理程序充当集成点,必须与t进行交互