RavenDB适合我的情况吗?

RavenDB适合我的情况吗?,ravendb,Ravendb,我有一个有趣的情况,我正在接近一个RavenDB原型的评估期结束,该原型将用于我们公司的一个项目。它之所以有趣,是因为99.99%的时候,我相信它符合瑞文的最爱;它经常以小批量(每次

我有一个有趣的情况,我正在接近一个RavenDB原型的评估期结束,该原型将用于我们公司的一个项目。它之所以有趣,是因为99.99%的时候,我相信它符合瑞文的最爱;它经常以小批量(每次<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):


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

返回session.Query().Where(Where子句).Take(int.MaxValue.ToList();
记住,这就是一次性初始负载的全部内容。在那之后,会有很多查询,快速且频繁。我还应该指出,每一份文件在RavenDB中都是独立的。没有需要管理的关系

知道了这些,RavenDB适合做什么

全文搜索?对背景聚合(映射/减少聚合)?对简单的复制和分片,比如说扩展?是的

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


如果你谈论的是性能,你可能想看看奥伦斯关于这方面的最新文章。他的数字与您的非常相似:

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


为什么不让WCF服务一次一个地向Raven发送查询?也就是说,对于从客户那里得到的每个查询,请RavenDB为其执行查询?

根据您在其他答案评论中告诉我们的内容,我认为快速为wcf客户提供服务的唯一好方法是实际将所有内容存储在内存中,所以现在就按照您的方式执行


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

没错。你的建议是有道理的,而且可能有效。然而,据我所知,我们可能有12个客户同时访问该服务,每个客户都需要相当大的数据量。我们从Raven看到的读取时间会导致无法接受的延迟。Bob,为什么你需要内存中的所有数据,我的意思是,你不能在一个wcf请求中为客户端提供这些数据,对吗?你真的需要客户端的所有数据,还是只是它们的聚合?@BobHorn客户端将执行什么类型的查询,每个查询可以收回多少数据?客户端查询分页了吗?@DanielLang我们可能不需要内存中的所有数据,但版本1就是这样编写的。WCF服务不会返回所有这些数据;每个客户机将请求自己的数据部分。我们不能使用聚合,因为数据是图表的来源。@MattWarren客户端将使用一个简单的where子句获取所有文档。我相信他们可以在每个查询中提取数千行,但我会与开发人员联系。无寻呼;数据是图表的来源。非常适合用作WCF服务的数据源。WCF服务启动时,需要从Raven加载大量数据。之后,每隔几分钟就会收到少量数据。啊,对不起。我没有意识到它需要在每次服务启动时加载数据。我只是认为这是一次性的初始导入,您正在测量性能指标。。。对不起,谢谢。我认为,在初始加载之后,我们确实受益于Raven,特别是因为我们不必创建几十个表。看起来我们要使用它,但它还不是最终版本。
<add key="Raven/MaxPageSize" value="2147483647"/>
return session.Query<T>().Where(whereClause).Take(int.MaxValue).ToList();