4

在 CQRS 中,验证需要 DB 调用的命令的最佳方法是什么?例如,我有Order一个正在验证命令的聚合,CommitOrder除非有足够的库存,否则我不想接受这个命令。在这种情况下,命令处理程序如何检查我是否有订单商品的库存?我可以从写入端查询读取端吗?

注意:我使用 akka 来实现

4

1 回答 1

7

如果聚合需要查询读取模型以执行规则验证,那么通常的方法是通过域服务——你向服务传递一个指定查询合约的接口,该合约的实现运行询问。

但是您需要注意这样一个事实,即您通过运行查询得到的答案是旧的;不能假定存储在另一个聚合中的数据是“最新的”。

您还应该仔细检查您的要求;在许多领域,即使当前没有库存,也希望接受订单。毕竟,订单是增加商业价值的机会;您不想因不相关的问题而否决。当企业已经了解如何缓解“缺货”异常时尤其如此。

请记住,来自其他聚合的数据是陈旧的——完全有可能系统的另一部分当前正在更新库存水平,以便您可以接受订单。

如果您不能放宽在没有库存时提交订单的要求,并且如果使用陈旧查询数据的错误率高得无法接受,那么您需要重新设计您的聚合,以使当前库存水平保持相同的一致性边界作为订单提交。

于 2016-09-11T00:51:47.757 回答