依赖于过去事件的传奇



我有一个问题,如何处理一个传奇的决策取决于在创建saga之前发布的事件。

下面是一个例子来说明我的问题:

假设我有一个CustomerAR和一个OrderAR。当客户是创建一个验证过程开始,该过程的结果是客户可自由消费的订单金额授权。我不会详细介绍这个过程,因为这是断章取义的。当计算出数量后,就会发送一条命令将计算出的金额和客户应收帐款交至客户应收帐款使用该值发布一个事件(CustomerMaxOrderAmountEvent)。所以到目前为止还不错。

几个星期后,客户下了订单。OrderAR是创建并启动我的OrderSaga。这个传奇要等到命令出来完全创建,然后必须决定是否需要发送该订单的AutorizationCommand。为了做出这个决定,它必须知道CustomerMaxOrderAmountEvent是否发布,以及的值量。通常,OrderSaga也将订阅CustomerMaxOrderAmountEvent,但问题是此事件永远不会发生是因为过去已经发生过。

我该如何处理这个问题?我是否应该查询读取模型来知道值,我应该发送一个命令来获取值,我应该做一个参考CustomerAR,我是否应该重播所有的历史事件这个传奇故事让他知道历史。

请注意,这是关于概念,而不是关于这个具体的例子。这个例子纯粹是为了澄清问题:"两个不相关的聚合根,它们不属于相同的有界上下文。"

感谢你的帮助。

梅尔文

我将采用更简单的解决方案—只需将此信息(例如以HasCustomerReachedMaxOrderAmount的形式)添加到启动Saga的事件中。

我选择的第二个选项是准备一个设计用于传奇的读取模型,并从中查询数据,但是我甚至在传奇开始之前就收集了所有必需的信息。这种浓缩可以由处理程序对AR引发的原始事件执行,因为这不是聚合/有界上下文的一部分。

然而,在大多数情况下,基于与事件一起传递的数据就足够了,因为saga应该只以流程的形式包含业务逻辑。这通常意味着您最终可能会有多个Saga(以您的示例OrderSagaOrderWithMaxAmountSaga为例)。

综上所述,考虑到您提供的示例场景,我认为决定订单是否需要授权应该是您的域本身的一部分,并在开始saga时通过。

我会像这样模拟这个场景- CustomerAR计算最大金额;客户下订单-> OrderAR创建关于该客户的最大金额的信息,Order验证它是否需要额外的授权-> Saga开始。关键在于,关于最大金额的信息对于CustomerAR(它可以改变)和OrderAR(它是不可变的)都很重要。

我刚刚开始涉足DDD,我不打算重复k餐厅所说的任何内容,但这里是我对您的场景的一些想法:

  1. 将最大订单金额作为账单信息的一部分如何?这些钱必须得到某个地方,我相信你会照顾到付款处理被拒绝的情况。

  2. 如果saga 总是发送授权命令,但授权部分处理最大订单屏幕怎么办?如果你说的是"如果金额超过X美元,就要获得授权",也许你的商业模式也会将其理解为"如果金额低于X美元,就自动批准"。好处是所有审批考虑因素(包括是否获得批准)可以转移到审批实体或saga。

最新更新