2012-02-03 57 views
4

我目前正在构建一个使用gem sunspot为我的应用程序提供搜索功能的Rails 3.2应用程序。 sunspot使用Apache Solr执行全文索引和搜索。如果sunspot-solr不可用,则构建故障安全

def index 
    @search = Article.search do 
     fulltext params[:search] 
     with(:published_at).less_than(Time.zone.now) 
     paginate :page => params[:page], :per_page => 10 
     facet(:published_month) 
    end 
    @articles = @search.results 

    respond_to do |format| 
     format.html # index.html.erb 
     format.json { render json: @articles } 
    end 
end 

现在我的代码只是在每次有人点击文章索引页面然后呈现结果时执行搜索。我担心的是,solr出于某种原因,我的应用程序因此死亡。如何在solr宕机时执行基本的Article.all此操作的故障安全?

我知道我只能从例外中得到rescue,但这仍然意味着每个请求都会生成连接尝试solr。有没有办法来防止这种情况? (例如捕捉异常一次,然后等待5分钟,应用程序尝试重新连接到solr之前)

回答

3

作为贡献者太阳黑子和Websolr的创始人之一,我建议使用rescue_from具有低十岁上下的超时。

当太阳黑子来讲,它看起来像选项来指定超时是recently added到RSolr,太阳黑子使用该库,因此,如果这是你需要的,那么你应该看看促成拉请求太阳黑子通过一项功能超时到RSolr。

如果您有合适的超时时间,生成对Solr的失败请求不应该太昂贵。如果Solr关闭,您希望打开TCP连接时超时。一个健康的Solr服务器应该打开一个小于一秒的数量级的TCP连接,并且开始发送数据的时间不超过一秒或两秒,以用于真正昂贵的查询。

这里0.1秒的开放超时和5秒的数据超时应该足够了。

这里的下一个最佳选择是在您的应用程序和Solr之间有一些其他本地代理,这些代理可以在Solr关闭时抑制请求。也许是一个缓存中间件,或者Varnish。当然,我会认为这是一种更复杂的方法,除非这样的代理或缓存已经是应用程序基础结构的一部分。

+1

+1用于解释高可用性选项。 – aitchnyu 2012-02-04 16:40:02

+0

很好解释和帮助了很多!谢谢。 – halfdan 2012-02-06 10:49:16

+0

我刚刚叉'太阳黑子',以允许设置超时,但后来我发现这个提交:https://github.com/sunspot/sunspot/commit/abc3b472c917cea50e6e5ace813a4d13ad1ac08a 所以它已经实施。太好了! – halfdan 2012-02-06 12:30:55