我目前正在构建一个Rails3.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?
我知道我可以从异常中执行rescue,但这仍然意味着每个请求都会生成一个到solr的连接尝试。有没有办法防止这种情况发生?(例如,捕获一次异常,然后在应用程序尝试重新连接到solr之前等待5分钟)
发布于 2012-02-04 05:43:54
作为太阳黑子的贡献者和Websolr的联合创始人,我建议使用超时时间较低的rescue_from。
对于太阳黑子来说,看起来指定超时的选项是recently added to RSolr,这是太阳黑子使用的库,所以如果这是你需要的一个特性,那么你应该考虑向太阳黑子发送一个拉取请求,以将超时传递给RSolr。
如果您有适当的超时设置,那么生成对Solr的失败请求的代价应该不是很高。如果Solr关闭,您希望它在打开TCP连接时超时。一个健康的Solr服务器应该在不到一秒的时间内打开一个TCP连接,并在不超过一两秒的时间内开始为非常昂贵的查询发回数据。
在这里,0.1秒的打开超时和5秒的数据超时应该足够了。
下一个最好的选择是在您的应用程序和Solr之间建立其他本地代理,它可以在Solr关闭时限制请求。也许是缓存中间件,或者是Varnish。当然,我认为这是一种更复杂的方法,除非这样的代理或缓存已经是应用程序基础架构的一部分。
https://stackoverflow.com/questions/9132819
复制相似问题