2013-03-05 27 views
1

我在輪胎上使用ElasticSearch並在Heroku上託管我的應用程序。盆景服務器停機時該怎麼辦?

昨天晚上,當盆景服務器關閉時,我的整個應用程序崩潰。 當我試圖部署應用的Heroku,輪胎試圖連接和創建索引,並投擲了錯誤,所以我不得不從全系車型將我Tire代碼到unless聲明:

unless ENV['ES_DISABLED'] 
    # Elastic Search 
    # 
    include Tire::Model::Search 
    include Tire::Model::Callbacks 
    index_name INDEX_NAME 

    tire.mapping do 
    indexes :id, :type => 'string', :index => :not_analyzed 
    indexes :content, analyzer: 'snowball', boost: 100 
    end 
end 

當然,我中在Heroku上設置ES_DISABLED常數爲true

我想爲將來的類似錯誤做好準備。有沒有更好的方法來避免它們?

+0

我不認爲在部署代碼或引導應用程序時創建索引是輪胎默認設置。你確定這不是你實施的嗎? – phoet 2013-03-05 18:41:31

+0

它在部署到heroku時發生。所以也許heroku觸發重新生成索引。 – tomekfranek 2013-03-05 18:48:16

+0

@phoet輪胎確實這樣做,但它試圖處理連接問題 – karmi 2013-03-06 18:46:54

回答

1

尼克與Bonsai.io在這裏。對於影響您的應用的中斷,我表示歉意。你可以在我們的博客上找到我的full post-mortem

除非我誤會,否則我相信當Rails正在評估和加載您的模型類時,Tyre將嘗試在運行tire.mapping方法調用時創建索引。

它看起來像這種情況在Issue #180commit (0df58dce)被部分地解決了ECONNREFUSED問題,但不會涵蓋從從更大的集羣斷開,就像我們經歷集羣節點的503錯誤響應。

也許這會對Tire產生很好的拉取請求,以便在測試索引存在或以其他方式嘗試創建索引和映射時同樣挽救50倍的錯誤?

或者,您可能還可以包裹在你結束在begin/rescuetire.mapping電話。

+0

我沒有看到您鏈接到的問題和此錯誤之間的聯繫?在任何一種情況下,**應用程序**代碼都應該具有用戶友好的方式來處理「Elasticsearch is down」情況。 – karmi 2013-03-06 18:45:23

+0

編輯:所以,這裏的建議是拯救任何與網絡有關的錯誤? – karmi 2013-03-06 18:48:10

2

嗯,這很奇怪。當模型不存在時,輪胎確實試圖爲模型創建一個索引,但它不會將應用程序放下。

通知我能夠做到這一點:

$ ps aux | grep java 
121:karmi   7197 0.0 0.0 2432768 472 s003 R+ 7:37PM 0:00.00 grep java 

$ bundle exec rails console 
Loading development environment (Rails 3.2.11) 
Article 
Skipping index creation, cannot connect to Elasticsearch 
(The original exception was: #<Errno::ECONNREFUSED: Connection refused - connect(2)>) 
=> Article(id: integer, title: string, content: text, author: string, published_on: date, created_at: datetime, updated_at: datetime) 
Article.search '*' 
Errno::ECONNREFUSED: Connection refused - connect(2) 
    from /Users/karmi/.rbenv/versions/1.9.3-p0/lib/ruby/1.9.1/net/http.rb:762:in `initialize' 
    ... 
    from /Users/karmi/Playground/ElasticSearch/Tire/tire/lib/tire/search.rb:35:in `results' 

應該換你mapping等定義在開始/救援 - 相反,你應該有應用程序中的rescue_from或其他手段代碼將通知用戶搜索功能不起作用。

+0

似乎我們不能使用rescue_from,因爲輪胎捕獲了Errno :: ECONNREFUSED並返回'false'。我錯了嗎? – brupm 2013-03-06 19:10:08

+0

就索引創建而言,我看起來是正確的,但我可以在其他地方拯救Errno :: ECONNREFUSED。 – brupm 2013-03-06 19:23:58

+0

我認爲這個問題比ECONNREFUSED更多的是50倍的錯誤。例如,請求被引導到未能加入羣集其餘部分的節點。 – 2013-03-06 19:53:09

相關問題