2012-02-03 19 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