【问题标题】:DDD/CQRS Querying EventsDDD/CQRS 查询事件
【发布时间】:2014-10-21 23:23:15
【问题描述】:

我正在查看有关在使用 Event Sourcing/DDD/CQRS 方法设计的应用程序中查询的帖子。

据我了解,事件是对域对象状态的更改。对状态的更改将作为历史记录/事件保存在数据库中(任何 sql/no sql)。

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

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

CQRS 中的查询或“Q”部分如何与事件溯源一起使用?

假设我有一个域对象“帐户”作为聚合根。账户 AR 将经历很多变化,即贷记借记。事件商店将有信用卡和借记事件。

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

我无法理解,对于特定业务的事件历史查询会有什么用?

-Prakhyat M M

【问题讨论】:

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


    【解决方案1】:

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

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

    【讨论】:

    • 亚历山大,感谢您的回复。我得到了缺少的上下文。投影真的很有效。
    • Alexander,我正在为我的应用程序使用 akka 持久性。我采用了 DDD/CQRS 方法。我在写方面没有问题。感觉我在构建查询方面没有足够的了解。当查询需要来自多个聚合根的数据时会发生什么情况?
    • 对不起,我没有使用akka持久化的经验;当然,您的预测可以监听多个聚合根(即使是不同类型的)。​​
    • 一般规则是避免这种情况。请阅读有关该主题的一些丰富的文献,有很多,例如,Vaughn Vernon (dddcommunity.org/library/vernon_2011) 或 informit.com/articles/article.aspx?p=2020371&seqNum=5 的“Effective Aggregate Design”系列
    • 这在第三个问题here中回答。
    【解决方案2】:

    我建议您阅读 Greg Young(他就像 CQRS 和 Event Sourcing 之父)的更多文章,例如:CQRS, Task Based UIs, Event Sourcing... agh

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

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

    看起来你是一个 Java 人,但是,你可能还是想检查一下CQRS Journey from Microsoft。 希望这对您有所帮助,并激励您对 DDD / CQRS / ES(业务线应用程序的新三重奏)进行更多研究。

    【讨论】:

      【解决方案3】:

      有趣的是,最近越来越多的人发现使用事件存储作为读取模型,将预测和“正确”读取模型留到绝对必要时。

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

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

      这种方法可以让您显着稳定领域,获得更多关于系统如何工作的知识,调整事件并真正准备好将“正确”的读取模型引入系统,但您可能不必这样做。

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2010-12-03
        • 2013-09-28
        • 1970-01-01
        • 1970-01-01
        • 2011-03-07
        相关资源
        最近更新 更多