事件源和持久性


12

我正在阅读事件源,并且对持久性有疑问。

我仍然可以拥有一个包含所有实体的数据库,对吗?还是应该在每次启动应用程序时重播事件以获取内存中每个实体的最新版本?似乎在大型系统上(如大量数据)上的浪费?

事件来源的意义在于,如果需要,我可以重播事件以填充数据存储区吗?(或分析数据)

Answers:


9

当您决定更改系统架构时,您将从事件源中获得最大收益。至少在我看来,采用CQRS风格的架构与DDD相结合将带来事件采购的真正好处。

建立一个在大型系统中表现良好的事件存储确实不是一件容易的事。重放所有数据的确可能是昂贵的,它很大程度上取决于需要重放的数据量。但是有些技术可以帮助您解决这一问题,其中之一就是快照的概念。仅从某个特定点开始进行重播。事件存储带入系统的优势是无价的。使系统中发生的所有事情都可重播,每一刻的所有数据都是一件好事。考虑分析,关于错误的复制,关于统计。

有很多很棒的活动商店,最后一个是昨天才在活动商店发布的,看起来真的很不错。

可以保留传统数据库供系统的查询部分使用所需的数据构建DTO。可以根据您的应用程序和客户端的查询需求来组织和优化该数据库。

我写了一篇详细的文章,讲述了CQRS架构与事件源相结合的好处以及它的真正外观。您可以查看CQRS,域事件和DDD审核


1
我完全了解CQRS和DDD。我确实了解事件采购的好处。快照是加快此过程的好方法。但是,这不是问题的一部分。但问题是,一旦加载所有模型/实体将存储在哪里。在内存中(在大型系统上需要大量内存)还是在DB中?最佳做法是什么?
jgauffin 2012年

1
当重新创建聚集以执行给定命令时,事件将被重播并将聚集保存在内存中,执行操作,生成事件,然后将事件存储在事件存储中。但是是的,带有其价值对象和实体的集合将被保存在内存中。无需将它们保存在另一个数据库中。无论如何,通常这将是一小段时间才能完成命令。如果您的命令跨越多个聚合,而这些聚合稍有不同,那么它也可能表示您的受限上下文存在一些设计问题。
Vadim 2012年

9

使用事件源,主要问题是“您的记录簿是什么”。

如果您的记录簿是您的事件流,那么您将没有任何问题。如果您的记录簿是您的“实体模型”,那么问题将开始在各地发生。部分原因是您可以说“如果我丢失了实体模型,可以从事件流中重建它”。如果您对此问题持肯定态度,那么您的事件日志就是您的记录。

同样重要的是要记住,大多数使用事件源的人都使用读取模型。该模型用于查询数据。但是,与3nf实体模型相比,这看起来更像1nf模型。它们仅重播事件以获取聚合的状态,以确定是否应允许写入。


嗨,格雷格(Greg),我是活动外包的新手,但我真的想掌握这一点,能否请您提供一些实用示例和说明的资源,我已经看过很多有关CQRS,ES的文章,但是当我想开始制作原型时,使用它,我真的不知道什么时候:)我希望您能为我提出一些建议(我在Java方面)。谢谢你的时间。
vach 2015年

1

我仍然可以拥有一个包含所有实体的数据库,对吗?还是应该在每次启动应用程序时重播事件以获取内存中每个实体的最新版本?

答案取决于您的应用程序要求。我已经看到它完成了两种方式。

一个针对小型会计公司的非常成功的软件包,每次启动时都会读取其CQRS日志。原始数据量相对较小,因此即使在速度较慢的计算机上,启动时间也不到一分钟。在这种做法流行之前,他们已经进行了CQRS十多年了。当他们意识到可以一次又一次地升级客户端数据而不会遇到大型系统所遇到的麻烦时,他们就知道自己的状况很好。

在具有大量数据的系统和/或依赖RDBMS功能实现查询方的系统中,您有一个数据库用于存储事件源数据的“当前视图”(您甚至可以拥有多个此类视图)。这种方法的优势在于,它使您可以使用熟悉的技术来构建查询方。


这是哪个会计程序包?
马格努斯2015年

@ user1420752 Axys
dasblinkenlight
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.