我在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
。
我想为将来的类似错误做好准备。有没有更好的方法来避免它们?
答案 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 #180和commit (0df58dce)部分解决了这种情况,但这不会涵盖与已断开连接的节点的503错误响应较大的集群,就像我们的集群经历的一样。
在测试索引存在或尝试创建索引和映射时,或许这会对Tire提出类似的救援50x错误的请求?
或者,您也可以将tire.mapping
来电包裹在begin/rescue
中。