我知道关于集合验证的主题很多,我不会说我已经阅读了其中的每一个主题,但是我已经读了很多,但仍然不觉得自己看到了明确的答案,没有臭味。
考虑一下:
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
?
答案 0 :(得分:2)
至关重要的是,客户切勿花费超出限制的一分钱( 没有人会手动检查限额吗?
请阅读以下几篇文章:RC Dont Exist和Eventual Consistency
如果系统所有者仍然认为必须遵守条件,为避免并发问题,可以使用持久存储的预计算currentLimitSpent
(因为问题中没有事件源标签)来检查不变量和将其用作乐观并发标志。
使用currentLimitSpent
和持久性所需的任何其他数据来隐藏聚合。
检查规则(customerMaxCredit <= currentLimitSpent + newTransactionValue
)。
坚持(currentLimitSpent + newTransactionValue
作为新的currentLimitSpent
。
如果currentLimitSpent
的持久性发生了变化,而汇总正在运行(同一公司的许多用户进行交易),则应该从持久性中收到optimisticConcurrency错误。
您可以在出现异常时停止操作或重新隐藏汇总,然后重试。
这是概述。如果不考虑技术堆栈细节和体系结构设计,就无法更详细地说明问题。