Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/elixir/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Domain driven design process manager如何跟踪聚合之间的关联_Domain Driven Design_Cqrs_Event Sourcing - Fatal编程技术网

Domain driven design process manager如何跟踪聚合之间的关联

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有一个引用订单聚合

流程经理是否使用相关ID或聚合特定标识来跟踪其管理的流程

用一个例子来说明得更清楚,请考虑图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进行交互