当盆景服务器停机时我该怎么办?

时间:2013-03-05 15:54:53

标签: ruby-on-rails ruby heroku elasticsearch tire

我在Tire上使用ElasticSearch并在Heroku上托管我的应用程序。

昨晚,当盆景服务器停机时,我的整个应用程序崩溃了。 当我尝试将应用程序部署到Heroku时,Tire尝试连接并创建索引,并抛出错误,因此我不得不将所有模型中的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

我想为将来的类似错误做好准备。有没有更好的方法来避免它们?

2 个答案:

答案 0 :(得分: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等定义包装在begin / rescue中 - 相反,您应该在应用程序代码中有rescue_from或其他方式通知搜索功能无法使用的用户。

答案 1 :(得分:1)

尼克和Bonsai.io在这里。我对影响您的应用程序的中断表示谦虚的道歉。您可以在我们的博客上找到我的full post-mortem

除非我弄错了,否则我相信在Rails评估并加载模型类时,Tire会在运行tire.mapping方法调用时尝试创建索引。

对于ECONNREFUSED问题,Issue #180commit (0df58dce)部分解决了这种情况,但这不会涵盖与已断开连接的节点的503错误响应较大的集群,就像我们的集群经历的一样。

在测试索引存在或尝试创建索引和映射时,或许这会对Tire提出类似的救援50x错误的请求?

或者,您也可以将tire.mapping来电包裹在begin/rescue中。