加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

ruby-on-rails – 如果sunspot-solr不可用,建立故障保护

发布时间:2020-12-17 02:17:03 所属栏目:百科 来源:网络整理
导读:我目前正在构建一个Rails 3.2应用程序,它使用gem sunspot为我的应用程序提供搜索功能. sunspot使用Apache Solr执行全文索引和搜索. def index @search = Article.search do fulltext params[:search] with(:published_at).less_than(Time.zone.now) paginate
我目前正在构建一个Rails 3.2应用程序,它使用gem sunspot为我的应用程序提供搜索功能. sunspot使用Apache 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的操作实现故障保护?

我知道我可以从异常中解救,但这仍然意味着每个请求都会生成连接尝试来解决.有办法防止这种情况吗? (例如,在应用程序尝试重新连接到solr之前等待一次然后等待5分钟)

解决方法

作为Sunspot的贡献者和 Websolr的联合创始人,我建议使用具有低时间超时的rescue_from.

在Sunspot方面,看起来指定超时的选项是recently added到RSolr,Sunspot库使用,所以如果这是你需要的功能,那么你应该考虑向Sunspot提供拉取请求以将超时传递给RSolr.

如果您有适当的超时时间,那么向Solr生成失败的请求应该不会那么昂贵.如果Solr关闭,您希望在打开TCP连接时超时.一个健康的Solr服务器应该打开一个小于一秒的数量级的TCP连接,并开始在不超过一秒或两秒的时间内发回数据,以用于非常昂贵的查询.

这里的开启超时为0.1秒,数据超时为5秒应该足够了.

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

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读