Ruby on rails 当盆景服务器关闭时,我应该怎么做?
我将ElasticSearch与Tire一起使用,并将我的应用程序托管在Heroku上 昨晚,当盆景服务器关闭时,我的整个应用程序崩溃了。 当我尝试将应用程序部署到Heroku时,Tire尝试连接并创建索引,并抛出错误,因此我必须将我的Ruby on rails 当盆景服务器关闭时,我应该怎么做?,ruby-on-rails,ruby,heroku,
elasticsearch,tire,Ruby On Rails,Ruby,Heroku,
elasticsearch,Tire,我将ElasticSearch与Tire一起使用,并将我的应用程序托管在Heroku上 昨晚,当盆景服务器关闭时,我的整个应用程序崩溃了。 当我尝试将应用程序部署到Heroku时,Tire尝试连接并创建索引,并抛出错误,因此我必须将我的Tire代码从所有型号移动到,除非语句: unless ENV['ES_DISABLED'] # Elastic Search # include Tire::Model::Search include Tire::Model::Callback
Tire
代码从所有型号移动到,除非语句:
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
我想为将来类似的错误做好准备。有没有更好的方法来避免它们呢?这里是Nick with Bonsai.io。对于影响您的应用程序的中断,我深表歉意。你可以在我们的博客上找到我的
除非我弄错了,否则我相信在Rails评估和加载模型类时,Tire会在运行Tire.mapping
方法调用时尝试创建索引
这类场景似乎在ECONNREFUSED
问题中得到了部分解决,但这不包括从更大集群断开连接的节点发出的503错误响应,就像我们的集群所经历的那样
在测试索引是否存在或试图创建索引和映射时,这可能会对轮胎发出一个良好的拉动请求,以类似地挽救一个50倍的错误
或者,您也可以将tire.mapping
调用打包到您的begin/rescue
。嗯,这很奇怪。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'
$ps aux| grep java
121:karmi 7197 0.0 0.0 2432768 472 s003 R+7:37 pm 0:00.00 grep java
$bundle exec rails控制台
加载开发环境(Rails 3.2.11)
文章
正在跳过索引创建,无法连接到Elasticsearch
(最初的例外是:#)
=>文章(id:integer,title:string,content:text,author:string,发布日期,创建日期,更新日期)
Article.search'*'
错误号::ECONREFUSSED:连接被拒绝-连接(2)
from/Users/karmi/.rbenv/versions/1.9.3-p0/lib/ruby/1.9.1/net/http.rb:762:in'initialize'
...
from/Users/karmi/playdry/ElasticSearch/Tire/Tire/lib/Tire/search.rb:35:in'results'
不应将您的映射
etc定义包装在begin/rescue中——相反,您应该在应用程序代码中有一个rescue\u from
或其他方式,通知用户搜索功能不起作用。我不认为在部署代码或启动应用程序时默认创建索引。你确定这不是你实现的东西吗?它发生在部署到heroku的过程中。所以,也许heroku会触发重新生成索引。@phoet Tire确实会这样做,但它会尝试处理连接问题。我看不到您链接到的问题与此错误之间的联系?在任何一种情况下,应用程序代码都应该有一种用户友好的方式来处理“Elasticsearch已关闭”的情况。编辑:因此,这里的建议是避免任何与网络相关的错误?我们似乎无法使用rescue\u from,因为Tire捕捉到错误号::ECONREFUNCE并返回false
。我错了吗?就索引创建而言,我似乎是正确的,但我可以在其他地方拯救Errno::econnreference。我认为问题更多的是50倍的错误,而不是econnreference。例如,请求被定向到一个无法加入集群其余部分的节点。Nick是对的,当前代码只处理ECONNREFUSED,而不是Elasticsearch返回的HTTP错误。它值得修复;看见