【问题标题】:CQRS command validation that requires a DB call需要 DB 调用的 CQRS 命令验证
【发布时间】:2017-01-18 16:34:00
【问题描述】:

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

注意:我使用 akka 来实现

【问题讨论】:

  • 命令可以执行查询,但查询不能执行命令

标签: akka domain-driven-design cqrs akka-persistence


【解决方案1】:

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

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

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

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

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

【讨论】:

  • 感谢您的回答。是的,我同意你关于实际商业要求和陈旧数据的看法。我的问题是一个设计问题,最终您会遇到从写入查询读取的问题。所以我害怕朝着最终陷入依赖纠缠的方向前进。将命令验证推送到在写入端和读取端之间进行协调的独立服务怎么样?如果是这样,是否可以使用 Saga 或者我需要创建另一个服务并将 Saga 仅用于工作流?
猜你喜欢
  • 2021-06-22
  • 2021-04-10
  • 2015-11-21
  • 1970-01-01
  • 1970-01-01
  • 2019-03-25
  • 2022-01-10
  • 2019-12-17
  • 2019-07-20
相关资源
最近更新 更多