DDD / CQRS查询事件

时间:2014-08-28 07:23:39

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

我正在查看使用方法事件采购/ DDD / CQRS设计的应用程序的查询。

据我所知,事件是对域对象状态的更改。对状态的更改将作为DB(任何sql / no sql)中的历史记录/事件进行维护。

如果用户想要查询以获取特定聚合根的当前状态,则将涉及获取事件的历史记录。

当用户查询特定于业务的查询时,他/她将对当前状态感兴趣,而不是事件历史。

如何查询或Q'部分CQRS与事件采购合作?

考虑我有一个域对象"帐户"作为聚合根。账户AR将经历许多变化,即信用借记。活动商店将有信用卡和借记卡活动。

考虑用户需要获取帐户的当前余额,事件历史流将如何在这里设置?用户如何获取给定帐户的当前余额?

我无法理解,如何针对特定业务查询事件历史记录有用吗?

-Prakhyat M M

3 个答案:

答案 0 :(得分:5)

您将使用事件流投影到读取模型中,其中包含查询端(Q)所需的那些信息。例如,您可以拥有"帐户余额"在所有更改帐户余额的事件之后的投影,但可能忽略帐户流中的其他事件(例如所有者更改)。然后,投影以一种可以非常快速地查询的方式保存该信息,例如,在内存中或以(accountId, balance)作为密钥的小型读取模型数据库表accountId中(数据库可以是键值存储,例如)。

我建议进一步阅读CQRS概念,例如this onethis one

答案 1 :(得分:4)

我建议你阅读Greg Young的更多文章(他就像CQRS和事件采购之父),如下:CQRS, Task Based UIs, Event Sourcing... agh

抱歉我的英语不好,我来自巴拉圭。但我真的很喜欢DDD - CQRS - ES,我想尝试说明一点。

使用"预测" (也称为物化视图)和"最终一致性"是CQRS的每个从业者都应该非常了解的基本原则。 Event Store用于查询。在CQRS的Command端,而不是在Query端。您可以使用总线将事件存储中存储的事件发送到查询端,以便处理和生成读取模型或查看模型,您可以从中查询。在任何情况下,eventstore本身都是一个查询模型。

看起来你是一个Java人,但是,你仍然可以查看CQRS Journey from Microsoft。 希望这会有所帮助,并激励您对DDD / CQRS / ES(业务应用新三重奏)进行更多研究。

答案 2 :(得分:4)

有趣的是,最近越来越多的人发现使用事件存储作为阅读模型,留下了预测和正确的"阅读模型直到绝对必要。

我们都知道处理预测会增加复杂性。至少您必须创建新模型,为读取模型建立DAL并创建投影以将事件转换为读取模型更改,并将这些投影绑定到商店中的事件流。它需要更多的代码,更多的移动部件,其中一些不容易测试。读取端的模式更改也需要迁移。

对于许多场景来说,阅读所有事件(正确分区)可能足以让您的"读取模型"。在系统真正变大之前需要花费不多的时间,因此您需要阅读数万个事件来创建一个UI屏幕。但在你达到这一点之前,你可以阅读事件。可以使用文件系统来存储事件,尽管像EventStore这样的工具是免费的并且非常容易使用。可以添加一些索引。

这种方法可以让你显着地稳定域名,你可以更多地了解系统的运作方式,调整事件并做好准备,以便正确地使用#34;将模型读入系统,但您可能不必这样做。

Adam Dymitruk撰写了一篇blog post about it,即使你不想采用这种方法,你也可能会发现它值得一读。 Greg Young也在2012年发表了演讲EventStore as read model