1

我正在将 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

当然,我将ES_DISABLED常量设置为trueHeroku。

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

4

2 回答 2

2

嗯,这很奇怪。当模型不存在时,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'

不应该将您的 etc 定义包装mapping在 begin/rescue 中——相反,您应该rescue_from在应用程序代码中使用一种或其他方式来通知用户搜索功能不起作用。

于 2013-03-06T18:44:17.993 回答
1

尼克和 Bonsai.io 在这里。对于影响您的应用程序的中断,我深表歉意。你可以在我们的博客上找到我的完整验尸报告。

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

看起来这种情况在问题 #180提交 (0df58dce)问题中得到了部分解决ECONNREFUSED,但这不包括来自与较大集群断开连接的节点的 503 错误响应,就像我们的集群所经历的那样。

也许这会对 Tire 提出一个很好的拉取请求,以便在测试索引存在或以其他方式尝试创建索引和映射时类似地挽救 50 倍错误?

或者,您也可以将tire.mapping呼叫包装begin/rescue在您的最后。

于 2013-03-06T06:23:55.097 回答