我有一个有趣的情况,我即将在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是否合适?
答案 0 :(得分:2)
非常适合什么?
全文搜索?是。背景聚合(映射/减少)?是。轻松复制和分片,比如缩放?是...
特别报道?不。支持大概数千个第三方工具?否...
如果你在谈论表演,你可能想看看Orens的最新帖子。他的数字与你的数字非常相似:http://ayende.com/blog/154913/ravendb-amp-freedb-an-optimization-story
答案 1 :(得分:2)
根据我对您的问题的理解,您需要“准备”WCF Web服务。要做到这一点,你从RavenDB中读取1.2M文档(大约23分钟)并将它们保存在内存中,这样WCF服务就可以提供来自它们的查询,这是正确的吗?或者我错过了什么?
为什么不让WCF服务一次一个地将它的查询发送到Raven?即对于从客户端获取的每个查询,请求RavenDB对其进行查询?
答案 2 :(得分:1)
从你在其他答案评论中告诉我们的内容来看,我认为为wcf客户提供足够快速服务的唯一好办法就是将所有内容存储在内存中,所以就像现在这样做。
问题是,如果RavenDB非常适合这种情况,取决于您的数据模型是否以其他方式从文档导向性质中获益。因此,如果您的动态数据在关系数据库和大量连接中需要某种EAV,那么RavenDB可能是一个非常好的解决方案。但是,如果你只是需要一些东西,你可以扔平数据,那么我会在这里使用关系数据库。在许可成本和易用性方面,您可能还想看看PostgreSql,因为这是一个非常棒的数据库,完全免费。