2013-03-05 24 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

相关问题