【问题标题】:How to properly model interest accumulation in an event sourced savings account application?如何在事件源储蓄账户应用程序中正确模拟利息累积?
【发布时间】:2016-04-27 10:02:38
【问题描述】:

在我使用 DDD 开发的事件源应用程序中,有一些储蓄账户应该每天累积利息。每年年末累计利息应予以资本化。我的问题是:每天的计算真的应该被视为领域事件吗?

另一种方法是在读取端通过遍历账户上截至当天发生的交易(取款、存款等)来计算在给定时间点的累积利息,并将每天的累计利息相加。

鉴于系统中可能有数十万个储蓄账户每天计算其累积利息,事件存储中的事件数量将迅速增长到数百万。但与此同时,必须在读取端“即时”计算累积的兴趣,而不是每天引发事件,这似乎是一个缺点。

【问题讨论】:

  • 我不是银行专家,但 InterestCredited 看起来像是您真正想要存储的事件,因为它会改变系统的状态。如果我理解正确的话,累积的兴趣是一个虚拟的概念——将其建模为自己的事件不会增加任何价值。每天重新计算一个简单的读取端值似乎非常符合需求。
  • 感谢您的意见。我和我的同事谈过,他们也有类似的看法。将其视为一个虚拟概念确实帮助我理解了这个问题。我将创建一个应用程序服务,它可以计算给定时间点的累积兴趣。
  • 我将此添加为答案。也许稍等片刻,等待其他答案出现 - 再说一次,我不是银行业专家,拥有该领域专家的 PoV 会很有趣。

标签: domain-driven-design cqrs event-sourcing


【解决方案1】:

我不是银行专家,但InterestCredited 看起来像是您真正想要存储的事件,因为它会改变系统的状态。

累积的兴趣 如果我理解正确的话,它是一个虚拟概念——将其建模为自己的事件并没有增加任何价值。不管是否存在每日InterestAccumulated 事件,您都可以在年底计算资本化利息。相反,每天重新计算一个简单的读取端值似乎非常符合需求。

【讨论】:

  • 他所说的,再加上你想要一个读取持久性模型来存储相关数据(来自事件),然后是一个查询对象,它将进行实际计算。如果您从该查询对象中提取接口,则可以将其用作域服务。
  • @MikeSW“存储相关数据(来自事件)”好吧......我虽然这个答案说根本没有任何 InterestAccumulated 事件所以我想知道你将如何做到这一点。另外,查询对象是什么意思?实施会是什么样子?我在想,对于简单的利息计算,投影就可以了。然而,在最坏的情况下,赚取利息可能非常复杂,所以我想在这些情况下,在域模型中运行该逻辑是最好的。
  • 我正在考虑仅将实际交易(存款、取款、资本化......)存储为事件,并基于该信息,读取方可以通过使用域服务来计算每日利息执行实际利息计算公式并传入任何一天的余额和利率。
【解决方案2】:

利息积累只是一个领域事件,当它被记入/记入帐户时。在此之前,它不会改变聚合状态。考虑纠正事件,发布错误(例如 NSF 信用撤销)。您需要对原始和更正之间的每个每日不正确的利息计算进行更正。

读取方可以按照所需的任何时间间隔处理累积的利息。

【讨论】:

  • 确实,不把每一次积累都算作一个事件本身给了我很多优势。例如,现在更容易进行更正和注册延迟交易,而无需弃用所有“InterestAccumulated”事件。尽管如此,将特定领域的操作(例如兴趣公式)保留在单独的应用程序服务中以不将逻辑溢出到读取端仍然很重要。
  • 您在利息计算上是正确的。建议在读取端显示当前应计利息会更好。这一切都取决于要求。如果应计利息仅在读取端提供信息,则在发布到帐户之前可能无法保证准确性和准确性。
【解决方案3】:

每天的计算真的应该被视为一个领域事件吗?

您的领域专家怎么说?

您可能还想查看the blue book 的第 11 章,其中包括“示例:通过账户赚取利息”。这可能不会直接回答您关于领域事件的问题,但它应该为您提供一些额外的背景信息来构建您自己的分析。

我不是领域专家,但我的期望是应计利息会在法律上或模型中产生影响,并且您会期望对应计利息及其影响有一致的记录你的模型

根据您最初的描述,对模型的影响是每年一次,所以我希望每个账户每年只看到一次 InterestCapitalized 事件。但我很难相信每日应计利息无关紧要,尤其是在余额变化和复利的情况下,因此我怀疑所描述的要求实际上是否符合业务需求。

我不认为“数百万”事件会成为那么大的问题。使用 CQRS 模式,无论如何,您的大部分读取都将来自汇总结果,所以这没什么大不了的。真正的伤害将是试图用数百万个事件重新补充聚合体;但如果您在那里遇到性能问题,您可以考虑从快照中加载聚合。

当然,如果每个帐户都在计算自己的应计利息,那么您每年只需要查看 365 (ish) 额外事件,这根本不费吹灰之力。

【讨论】:

  • 直到年底利息资本化后,才会应用复利。因此,无论如何,除了年底之外,任何计算都不必使用每日累计金额。是的,每个账户都在计算自己的利息。我真的不希望性能问题阻碍我正确设计模型,但据我从答案和同事那里得知,每日兴趣计算并不是真正的领域事件。
猜你喜欢
  • 2016-06-24
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2022-08-02
  • 1970-01-01
  • 2019-09-12
  • 2016-07-21
  • 1970-01-01
相关资源
最近更新 更多