2

我有一个有趣的情况,我即将结束一个 RavenDB 原型的评估期,该原型可用于我们公司的一个项目。有趣的原因是 99.99% 的时间,我相信它符合 Raven 的最佳点;它经常以小批量(一次< 1000个文档)重复查询新数据。

但是,我们确实有一个初始加载期,我们需要加载两天的数据,在某些情况下可能是 300 万(或更多)条记录。

图表可能会有所帮助:

在此处输入图像描述

传输服务负责从三个生产数据库中获取正确的数据并将其存储在 RavenDB 中。WCF 服务将查询此数据并将其提供给其客户端。

一旦我们将数百万条记录/文档初始加载到 RavenDB 中,我们将很少需要再次这样做。

作为初始负载测试,在具有 4GB RAM 和两个处理器的机器上,读取初始数据只需要 23 多分钟。在这种情况下,它只有大约 128 万条记录。我从这个初始加载中消除了所有异步操作,因为我希望每次读取都不会受到其他读取操作的干扰。我以这种方式找到了最好的结果。

在此处输入图像描述

我知道不建议这样做,但要完成这一切,我必须更改不建议更改的设置:

我不得不增加超时:

documentStore.JsonRequestFactory.ConfigureRequest += (e, x) => ((HttpWebRequest)x.Request).Timeout = ravenTimeoutInMilliseconds;

在 Raven.Server.exe.config 中,我不得不增加页面大小(到 int.MaxValue):

<add key="Raven/MaxPageSize" value="2147483647"/>

在我的检索方法中,我不得不使用 Take(int.MaxValue):

return session.Query<T>().Where(whereClause).Take(int.MaxValue).ToList();

请记住,这只是一次性的初始加载。在那之后,它是许多查询,快速且经常。我还应该注意,每个文档在 RavenDB 中都是自包含的。没有需要管理的关系。

了解了这一切,RavenDB 是不是很合适?

4

3 回答 3

2

适合什么

全文搜索?是的。后台聚合(map/reduce)?是的。简单的复制和分片,比如缩放?是的...

临时报告?不。可能支持成千上万的第三方工具?不...

如果你在谈论性能,你可能想看看 Orens 的最新帖子。他的数字与您的数字非常相似:http: //ayende.com/blog/154913/ravendb-amp-freedb-an-optimization-story

于 2012-04-17T20:45:45.793 回答
2

根据我对您问题的理解,您需要“准备”WCF Web 服务。为此,您需要从 RavenDB 读取 120 万份文档(大约 23 分钟)并将它们保存在内存中,这样 WCF 服务就可以为它们提供查询,对吗?还是我错过了什么?

为什么不让 WCF 服务一次将其查询发送给 Raven?即对于它从客户端获得的每个查询,请 RavenDB 为它做查询?

于 2012-04-17T23:08:31.357 回答
1

根据您在其他答案评论中告诉我们的内容,我相信为 wcf 客户端提供足够快的服务的唯一好方法是将所有内容实际存储在内存中,所以就像您现在做的那样。

问题是,RavenDB 是否适合这种情况取决于您的数据模型是否以其他方式从面向文档的性质中受益。因此,如果您的动态数据需要关系数据库中的某种 EAV 和大量连接,那么 RavenDB 可能是一个非常好的解决方案。但是,如果您只需要一些可以放入平面数据的东西,那么我会在这里使用关系数据库。在许可成本和易用性方面,您可能还想看看 PostgreSql,因为这是一个非常棒的数据库,完全免费。

于 2012-04-18T18:43:10.347 回答