集合不变量的总和阻止聚合根的创建/更新

时间:2019-08-30 05:35:38

标签: domain-driven-design microservices

我知道关于集合验证的主题很多,我不会说我已经阅读了其中的每一个主题,但是我已经读了很多,但仍然不觉得自己看到了明确的答案,没有臭味。

考虑一下:

  • 我们有一个Customer
  • 的概念
  • Customer包含一些常规详细信息数据
  • Customer可以赚Transaction(从商店购买东西)
  • 如果Customer处于信用模式,那么他将限制一年内可以消费的金额
  • 每年每Transactions的{​​{1}}数量会很大(数千+)
  • 至关重要的是,Customer永远不要花费超过限制的一分钱(没有人交付的商品会手动检查限制)
  • Customer可以创建新的Customer或将项目添加到现有项目中,并且必须同时检查两个限制
  • Transaction实际上可以是Customer,后面有许多Company进行实际交易,意味着Users可以同时创建/更新

很显然,我想避免在创建新的或编辑现有的Transactions时为Transactions加载所有Customer,因为它不能很好地扩展大量Transaction的规模。

如果我在创建/更新Transactions之前引入专用于检查currentLimitSpent的聚合,则我具有非事务性的创建/更新(一个步骤检查Transaction,然后另一个用于创建/更新currentLimitSpent

如果我不关心所有的ddd规则(或者它最终的一致性方法),我知道如何实现这一点,但是我想知道是否存在一些惯用的ddd方法来解决这种不涉及严格一致性的问题是否为每个Transaction创建/更新都加载所有Transactions

1 个答案:

答案 0 :(得分:2)

  

至关重要的是,客户切勿花费超出限制的一分钱(   没有人会手动检查限额吗?

请阅读以下几篇文章:RC Dont ExistEventual Consistency

如果系统所有者仍然认为必须遵守条件,为避免并发问题,可以使用持久存储的预计算currentLimitSpent(因为问题中没有事件源标签)来检查不变量和将其用作乐观并发标志。

  • 使用currentLimitSpent和持久性所需的任何其他数据来隐藏聚合。

  • 检查规则(customerMaxCredit <= currentLimitSpent + newTransactionValue)。

  • 坚持(currentLimitSpent + newTransactionValue作为新的currentLimitSpent

  • 如果currentLimitSpent的持久性发生了变化,而汇总正在运行(同一公司的许多用户进行交易),则应该从持久性中收到optimisticConcurrency错误。

  • 您可以在出现异常时停止操作或重新隐藏汇总,然后重试。

这是概述。如果不考虑技术堆栈细节和体系结构设计,就无法更详细地说明问题。