我试图用DDD设计一个复式分类帐,但在定义聚合根时遇到了一些麻烦。有三个领域模型:
LedgerLine
:具有数据的单独行项,如在其上创建的数量、时间戳、分类账中的etc.LedgerEntry
:条目。每个分录包含多个balance.LedgerAccount
:,其中借方和信用额度必须在分类帐中的LedgerLine
帐户。有两类账户:(1)内部账户(如现金) (2)外部账户(例如,联系银行账户)。外部帐户可以是added/removed.在网上阅读了一些文章后(例如,这篇文章:https://lorenzo-dee.blogspot.com/2013/06/domain-driven-design-accounting-domain.html?m=0)。看起来LedgerEntry
应该是一个聚合根,包含对LedgerLine
s的引用。LedgerAccount
应该是另一个聚合根。LedgerLine
s将保存相应的LedgerAccount
ID。
虽然这很有意义,但当分类账行被添加时,我很难弄清楚如何更新分类账帐户的余额。上面的文章建议动态计算余额,这意味着在添加LedgerEntry
s时不需要更新。但是,我使用Amazon作为分类账,他们的解决方案工程师特别建议在LedgerAccount
上计算和存储余额,因为QLDB不是针对这种“扫描大量文档”操作而优化的。
现在出现了这样的两难局面:
如果我在添加overdrafts.
balance
字段,那么我将在一个操作中更新两个聚合,这违反了一致性边界。如果在收到"Add LedgerEntry
“操作发出的事件后异步更新balance
字段,则如果我在帐户上添加了另一个将余额花费在帐户上的LedgerEntry
,则可能会在帐户上读取陈旧的余额,这可能导致将LedgerAccount
模型包含在LedgerEntry
的同一个聚合中,然后我就失去了添加/删除单个LedgerAccount
的能力,因为我不能直接查询它们。
balance
字段并动态计算它,那么可能会出现性能问题,给出(1) QLDB限制(2)分类账行数无界的事实。那么正确的设计是什么呢?任何帮助都是非常感谢的!
发布于 2021-11-20 11:34:49
您可以使用Saga模式来确保整个过程完成或失败。
这是底漆. https://medium.com/@lfgcampos/saga-pattern-8394e29bbb85
我想在分类账账户中添加“保留基金”拥有的收款。Balance'.
的价值
使用Saga来管理流程:
这样,您就可以管理分布式事务,而不会出现帐户透支的情况。
发布于 2021-11-20 21:50:35
聚合根应该用作事务边界。多腿事务跨越多个帐户,因此帐户不能。
因此,分类帐本身就是一个总根。会计事务应与数据库事务相对应。
实际上,“账簿本身”并不意味着单身。它可以是组织分支*时间段分类账。而且通常是在非计算机事件源系统中。
更新。
分类账账户余额仅仅是对分类帐的一个视图。作为一种观点,它具有某种已知事件的状态。在作出是否接受操作的决定时,应确保分类帐的实际状态是截至余额处理的最新状态。如果不是,则应先处理较新的事件,然后再尝试帐户操作。
https://stackoverflow.com/questions/70044958
复制相似问题