EventStore与MongoDb
我想知道使用EventStore( http://geteventstore.com )在MongoDb中实现事件源自己的优势。
我问的原因是,我们公司有很多人每天与MongoDb合作。 尽pipe如此,他们不能使用事件采购。 虽然他们并不是完全处于这个问题的黑暗之中,但他们也不打算在任何地方开始实施。
我即将开始一个项目,这非常适合于事件采购。 大约有16个非常明确的事件,大约7个明确的预测。 我说“关于”,因为我知道,一旦他们看到使用的产品,就会有更多的预测和事件的需求。
该方法将首先是API,我们组织的其他部分将使用REST API。
虽然我已经阅读了格雷格·扬(Greg Young)定义的“事件采购”(Event Sourcing)的很多内容,但我从来没有实际采用过事件采购解决scheme
这是一个绿色的田野工程。 由于我们打算将所有内容公开为REST接口,因此没有技术限制。 所以,如果有人有与MongoDb的EvenStore或事件采购的工作经验,请赐教。
还有一个几乎完全不相关的事件采购问题:你有没有直接查询事件存储? 或者你总是会创造新的预测和重播事件来填充这些预测?
免责声明我是格雷格·扬(如果你不能读我的名字:))
我会回答这个问题,但我相信它可能会被删除。 这个问题对我来说有点奇怪,但答案相当奇怪。 我不会花时间回答每一个答复,而是将所有的意见都放在这个答复中。
1)有一个评论,我们只运行在一个自定义版本的单声道,这是一个细节,但…这不是这种情况(并没有超过一年)。 我们正在等待我们对单声道进行的重要补丁(例如threadpool.c打击他们的主人)。 这发生了。
2)EventStore是3个子句的BSD许可。 不知道你怎么能声称我们不是开源的。 我们也有一家公司,并提供商业支持。
3)有人提到我们在9月份的版本3上。版本1是在2年前发布的。 版本2增加了聚类(显然有些重大变化与单个节点)。 第3版增加了大量的东西,包括有竞争的消费者的能力。 在这段时间,实际的客户端协议几乎没有什么变化(特别是对那些使用HTTP API的客户端协议)。
然而,这些build议中令我感到困扰的是,他们似乎并不明白他们在比较什么。 这大致相当于我说“我应该使用neo4j还是leveldb?”。 你可以在leveldb之上build立自己的graphics数据库,但是这将会是一个相当大的工作。
在这种情况下,Mongo将成为OP必须自己写的事件存储的存储引擎。 如果你想拥有最基本的操作,那么写一个生产质量事件存储是一个在存储引擎之上的不重要的练习。
我写了这个回复邮件列表相当于这个问题 :
你将如何与Mongo做下列事情?
使用sorting/乐观并发/等写入和读取事件stream
然后:
您的投影不希望以与写入方式相同的方式从stream中读取数据,投影通常对事件types感兴趣,并且希望所有types为T的事件(无论数据stream是否按正确顺序写入)。
您可能还希望能够从推送事件通知切换到处理拉取信息(例如轮询)等。
如果比较卡夫卡,基因数据库和事件存储库会更有意义。
看到其他的答复,不要谈论在EventStore中的工具或好处,只提到MongoDB的好处,我会钟意。但请注意,我的经验是有限的。
我会从缺点开始
- 有很多签到可以决定你将积极支持自己的哪个版本。 虽然团队一直在巩固他们的发布,但是他们已经到达第三版,甚至在发布18个月之后都应该是一个指标,你必须提供你支持的另一个更新版本的版本(这也会影响平台你select部署到)。
- 它不会轻易在每个平台上工作(特别是当您尝试迁移到云环境或基于Docker的lxc容器时)。 其中一些是由于围绕着其他数据库(如Mongo)的社区。 但是这个团队似乎在保持跨平台稳定性的同时,还在努力提高读/写性能。 随着时间的推移,我发现你不希望偏离现在这个时代的吸引力的裸机操作系统。
- 使用Mono的特殊版本。 寻找对Mono老版本的支持只能使这个过程更像根pipe。
- 为了充分利用EventStore的性能,你真的需要考虑你的架构。 EventStore输出到平面文件和事件数据可以快速增长。 什么是磁盘的失败率是坚持你的数据。 事情如何被压缩? 归档? 等等。你有很多的控制权,而控制器则是把你的数据存储为事件。 然而,虽然我确信格雷格·扬自己也可以引用我长时间优化和保存磁盘的function,但我很可能会发现一个成熟的Mongo社区已经遇到类似的情况。
而专业…
- RESTful – 这是AtomPub。 你的stream不够具体吗? 创build另一个,并做http获取直到你的心的内容。 关心路由做一个http转发。 关注安全放在前面的一个http代理。 简单!
- 你有一个很好的工具和UI套件,用于testing和build立你的预测,因为你的事件开始产生新的数据(例如,使用铬浏览器作为debugging你的投影的方式… …他们是用Java脚本编写的)
- 阅读性能 – 由于应用程序输出到一个平面文件,你可以得到内核级别的caching,并通过http暴露他们的帽子。 另外,索引遍布在您的数据stream中,用于查询较大数据集的投影(但是我确实感觉到索引性能会随着时间的推移而逐渐上升)。
我个人不会使用这个核心/任务关键/或不断增长的应用程序! 但是,如果你有一个保持你的偶像环境有趣的副作用,那么我会放弃它! 我个人现在必须坚持到Mongo。