不使用CQRS的EventStore

8
我看过许多关于事件存储(EventStores)的文章,但是所有的文章都与CQRS概念有关。
我们想要使用事件存储来整合有界上下文(bounded contexts),但希望保持传统ORM用于读写聚合(aggregate)的方式,以避免在我们的情况下增加命令/查询和分离读模型带来的复杂性。
由于这两个概念经常一起讨论,人们往往认为它们应该共存 - 在没有CQRS的情况下进行事件存储“精简版”是否存在缺陷,与实现事件存储/ CQRS /读取模型相比呢?

1
为了使用事件存储方法,你需要一个系统,其中所有“数据更改”操作都由命令引起,并导致事件的发生(然后可以存储和重放)。这在CQRS环境中非常自然-但我看不出为什么不能自己创建这样的系统-它只需要通过命令处理所有数据更改,并触发事件以报告发生了什么。 - marc_s
2个回答

4

看一下 NoSql Distilled - 你只需要花几天时间阅读并提取你所需要的内容,就能节省很多时间。如果你正在“阅读/编写聚合” ,应该考虑使用类似 RavenDB 的数据库。

请注意,event-store 标签是为 JOliver Event Store 设计的,并且它具有关键的架构概念。

你在某种程度上误解了问题:为了产生事件,你需要以特定方式构建域。以下是与你问题中表述的方式形成对比的关键点(简单而不全面):

  1. 事件按聚合进行分批处理-这是真正管理事件的单位

  2. 将事件分派给某个目标

如果你不想使用基于事件的域模型,请尝试研究队列管理解决方案。这是非常合理的做法 - 只是不要将 Event Store 视为通用的事件发布订阅队列。

将 Dispatcher Project 与 Denormalizers 配合使用,以构建一个 Read Model 是比较容易的 - 你可以使用各种奇特的工具,但是像 SQL SB 这样的熟悉工具和像 PetaPoco 这样的简单数据库层就可以了。

你是否真正使用过 CommonDomain 和 EventStore 进行试验?你是否阅读了 Nuget 中的 readme 文档?你是否观看了 JOliver 的视频?


Ruben,感谢您宝贵的回复。我找到了一个视频http://vimeo.com/31153808,请问您能否给我链接到另一个视频(您提到了有两个)-我找不到另一个! - morleyc
@g18c编辑。如果我没记错,你找到的那个是最好的一个,但其他的也值得一看。 - Ruben Bartelink
感谢提供这些链接 - 是的,视频很棒,真的帮助了我的理解。由于joliver以如此系统化的方式编写了代码,实现命令和处理程序不会有太多开销,因为它可能会在ORM映射中节省我很多时间。我快速制作了一个演示(有一个小问题)http://stackoverflow.com/questions/15723640/why-is-my-command-event-string-field-being-retrieved-as-null 但是到目前为止,我对这个库印象非常好。 - morleyc

1
我们希望使用EventStores来集成有界上下文。可以将事件存储库用作消息队列,其附加的好处是它是持久性的,并且新的订阅者可以请求所有过去的事件。但是我们希望在读/写聚合时仍然使用传统的ORM,以避免命令/查询和单独的读模型,在我们的情况下会增加太多复杂性。顺便说一句,您仍然可以通过为查询使用单独的读模型而不是行为模型来获得CQRS的某些优点。总的来说,您可以使用EventStore而不使用事件溯源,但是应确保它支持您的集成方案的所有要求。可能需要除事件存储库之外的其他组件。更普遍地说,事件存储库可用于存储任何时间序列数据。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接