DDD/CQRS查询事件

Pra*_*yat 6 domain-driven-design cqrs event-sourcing akka-persistence

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

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

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

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

CQRS中的查询或"Q"部分如何与事件采购一起使用?

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

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

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

-Prakhyat MM

Nar*_*lex 6

我建议您阅读更多来自 Greg Young(他就像 CQRS 和事件溯源之父)的文章,例如:CQRS、基于任务的 UI、事件溯源……啊

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

“投影”(也称为物化视图)的使用和“最终一致性”的概念是每个 CQRS 从业者都应该非常了解的基础知识。事件存储用于查询。在 CQRS 的命令端,而不是在查询端。您可以使用总线将存储在 Event Store 中的事件发送到查询端,以便处理和生成读取模型或视图模型,您可以从中查询。在任何情况下,事件存储本身就是一个查询模型。

看起来你是一个 Java 人,但是,你仍然可能想查看MicrosoftCQRS 之旅。希望这会有所帮助并激励您对 DDD / CQRS / ES,新的业务线应用三重奏进行更多研究。


Ale*_*ger 5

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

我建议进一步阅读CQRS概念,例如这一个这个.


Ale*_*rev 5

足够有趣的是,最近有更多的人发现使用事件存储作为读取模型,而在绝对必要之前将投影和“适当的”读取模型留在了上面。

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

看来,在许多情况下,读取所有事件(适当地分区)可能足以使您的“读取模型”。在系统真正变大之前,不需要花费很多时间,因此您需要阅读数以万计的事件才能创建一个UI屏幕。但是在达到这一点之前,您只能读取事件。尽管EventStore之类的工具是免费的并且非常易于使用,但可以使用文件系统来存储事件。可能会添加一些索引。

通过这种方法,您可以显着稳定域,获得有关系统工作方式的更多知识,调整事件,并为将“适当的”读取模型带入系统做好了充分的准备,但您不一定必须这样做。

亚当·迪米特鲁克(Adam Dymitruk)撰写了一篇有关它博客文章,即使您不想采用这种方法,也可能会觉得值得一读。格雷格·杨(Greg Young)在2012年还发表了一篇演讲,讲了EventStore作为读取模型