我正在使用NHibernate.Search程序集,并正在寻找与多个web服务器一起使用它的最佳实践。
我们的web服务器上有足够的空间来处理我们正在生成的索引,所以我认为最好的方法是将索引放在每个web服务器上。然后,我要索引的类,添加一个版本列。我唯一的问题是,如果我这样做,如果假设Web服务器A更新了记录,而Web服务器B的索引过期了,NHibernate.Search是否足够智能地提取最新的记录并对其进行索引?
另一种选择是将索引存储在共享文件位置并从该网络资源中提取。这似乎是一个不太理想的解决方案,因为它不允许很大的冗余。
其他人是如何使用NHibernate.Search和/或Lucene.NET索引解决这个问题的?
发布于 2012-03-29 23:14:57
当您决定将索引放在不同的机器上时,您引入了“分布式搜索”问题。复制、冗余、管理、监控、搜索聚合等成为您需要解决的重要而有趣的问题。
也就是说,Solr是这个问题的推荐解决方案之一。此外,SolrNet可以帮助您将其与Nhibernate集成。
我将这两个项目与Nhibernate结合使用,一开始可能会有点困惑,但后来它得到了回报。
在您的例子中,您可能会在web服务器上运行Solr。
发布于 2012-04-01 07:41:25
我们使用NHibernate Search和Lucene.net支持的主/从方法。
每个WebServer都有一个索引的从属副本,并且不进行索引。
每当we服务器更新某些内容时,它都会向执行索引的后端服务(我们使用Rhino ServiceBus和msmq)发送一条消息(通过加载更新后的对象并对其重新索引)。
每隔10秒(我们需要最新的搜索-通常有30分钟的宽限期),we服务器将检查索引的新版本,并在需要时获取它。它工作得很好,因为更改是增量的,所以只有当我们进行优化或完全重新索引时,才需要拉出完整的索引。
如果你需要更好的速度,你可以在we服务器上使用ram实现来优化它,但是在32mb的索引上进行相当复杂的通配符搜索时,我们的查询速度仍然远低于10ms。
另一种优化是让send服务器执行索引,但只将增量副本发送到后端以附加到主索引。这将为数据库节省后端服务的调用,尽管会有一定的复杂性,因为您必须深入了解NHibernate Search/Lucene才能做到这一点。
发布于 2012-03-23 23:06:27
你的第一个想法是行不通的。场中的节点之间不相互通信。它们依赖于共享资源,就像二级缓存一样。除此之外,您不需要单独的索引,因为它们将被反同步。
共享文件的位置是最好的方法。就冗余而言,我认为存储冗余是微不足道的,您可以从raid阵列开始
https://stackoverflow.com/questions/9753916
复制相似问题