EventStore vs. MongoDb



我想知道使用EventStore(http://geteventstore.com)与在MongoDB中实现事件溯源相比有什么优势。

我问的原因是,我们公司有很多人每天都在与MongoDb合作。不过,它们不适用于事件溯源。虽然他们对这个主题并不完全一无所知,但他们也不打算在任何地方开始实施它。

我即将开始一个非常适合事件溯源的项目。大约有16个非常明确的事件,以及大约7个定义明确的预测。我说"大约"是因为我知道一旦他们看到产品投入使用,就会需要更多的预测和事件。

这种方法将首先是API,使用我们组织的其他部分将使用的REST API。

虽然我已经阅读了很多关于Greg Young定义的事件溯源的知识,但我从未真正实施过事件溯源解决方案。

这是一个绿地项目。没有技术限制,因为我们将所有内容公开为 REST 接口。因此,如果有人有EvenStore或MongoDb事件采购的工作经验,请启发我。

还有一个关于事件溯源的几乎完全无关的问题:您是否曾经直接查询事件存储?或者,您是否总是创建新的投影并重播事件来填充这些投影?

免责声明 我是格雷格·杨(如果你:)看不懂我的名字)


我将回答这个问题,尽管我相信无论如何它都可能会被删除。这个问题对我来说有点奇怪,但答案相当奇怪。我不会花时间单独回答每个回复,而是将所有评论都放在这个回复中。

1)有评论说我们只在单声道的自定义版本上运行,这是一个细节,但是......事实并非如此(而且已经一年多没有了)。我们正在等待我们为单声道制作的关键补丁(例如 threadpool.c 来点击他们的主节点)。这种情况已经发生。

2) EventStore 是 3 條條件 BSD 授權的。不知道你怎么能说我们不是开源的。我们背后也有一家公司,并提供商业支持。

3

)有人提到我们在9月继续第3版,第1版是在2年前发布的。版本 2 添加了群集(显然与单节点相比有一些重大更改)。版本3增加了大量内容,包括拥有竞争消费者的能力。在这段时间里,实际的客户端协议几乎没有变化(特别是对于那些使用HTTP API的人)。

然而,在

建议中真正让我不安的是,他们似乎不明白他们在比较什么。这大致相当于我说"我应该使用 neo4j 还是 leveldb?"。你可以在leveldb之上为自己建立一个图形数据库,但这将是相当多的工作。

在这种情况下,Mongo将是OP必须自己编写的事件存储上的存储引擎。如果您想要最基本的操作,那么在存储引擎之上编写生产质量事件存储是一项不平凡的练习。

我写这篇文章是为了回应相当于这个问题的邮件列表:

您将如何使用Mongo执行以下操作?

使用排序/乐观并发/等方式向流写入和读取事件

然后:

投影不希望以

与写入流相同的方式从流中读取,投影通常对事件类型感兴趣,并且希望 T 类型的所有事件都写入流并按正确的顺序写入。

例如,您可能还希望能够从推送的事件通知实时切换到处理拉取的信息(例如轮询)等。

如果将Kafka,datomic和Event Store进行比较会更有意义。

看到其他回复没有谈论 EventStore 中的工具或好处,只提到 MongoDB 的好处,我会插话。但请注意,我的经验是有限的。

我将从缺点开始...

    有很多
  • 签入可以导致决定您将积极支持自己的版本。虽然团队一直在巩固他们的版本,但他们在发布后不到 18 个月就到达了版本 3,这应该表明您必须将您支持的版本拉到另一个更新的版本(这也会影响您选择部署到的平台)。
  • 它不会在每个平台上轻松工作(特别是如果您尝试迁移到云环境或基于 docker 的 lxc 容器)。其中一些是由于围绕其他数据库(如Mongo)的社区。但该团队似乎一直在努力提高读/写性能,同时保持跨平台稳定性。随着时间的流逝,我发现您不想偏离裸机操作系统实现太远,这在当今时代并不具有吸引力。
  • 使用特殊版本的单声道。寻找对旧版本Mono的支持只会使该过程更像根管。
  • 为了充分利用事件存储的性能,您确实需要考虑您的架构。事件存储输出到平面文件和事件数据可以快速增长。将数据保存到的磁盘的故障率是多少。事物是如何压缩的?存档?等。您有很多控制权,并且控件旨在将数据存储为事件。然而,虽然我确信 Greg Young 本人可以向我引用长期优化和保存磁盘的功能,但我很可能会找到一个成熟的 Mongo 社区,它有遇到类似案例的经验。

而优点...

  • RESTful - 这是AtomPub。您的直播是否不够具体?创建另一个并做 http get,直到你的心满意足。担心路由确实做一个http转发。出于对安全性的担忧,将http代理放在前面。简单!
  • 您有一套不错的工具和UI,用于在事件开始生成新数据时测试和构建投影(例如,使用chrome浏览器作为调试投影的一种方式...是的,它们是用Java脚本编写的)
  • 读取性能 - 由于应用程序输出到平面文件,因此您可以获得内核级缓存,并通过 http 公开它们。此外,索引跨您的流,用于针对更大的数据集查询投影(但我真的感觉到索引性能会随着时间的推移而对您有所上升)。

我个人不会将其用于核心/关键任务/或不断增长的应用程序!但是,如果您有保持事件环境有趣的附带案例,那么我会放手!我个人现在必须坚持使用Mongo。

最新更新