我将 ElasticSearch 与 Tire 结合使用,并将我的应用程序托管在 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
。
我想为将来出现类似的错误做好准备。有没有更好的方法来避免它们?
嗯,这很奇怪。 Tire 确实会尝试为模型创建一个索引,当它不存在时,但它不会关闭应用程序。
注意我可以这样做:
$ 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
或其他方式通知用户搜索功能不工作的应用程序代码。
我是一名优秀的程序员,十分优秀!