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