Resque工作者使用PostgreSQL服务器失败

时间:2011-10-18 13:10:48

标签: ruby-on-rails postgresql heroku redis resque

我已经成功设置了我的工作人员并且他们曾经没有问题(在开发中)执行,但现在他们不在生产或开发中(我猜测从SQlite3更改为PostgreSQL之后)。

当我运行rake命令运行rake resque:work QUEUE=*的worker时,我收到以下错误和堆栈跟踪:

getaddrinfo: nodename nor servname provided, or not known

在控制台中运行heroku rake resque:work QUEUE=*以测试队列中的待处理工作程序时,出现以下错误。

Class         SentimentJob
Arguments     [4, 5, 6]
Exception     ActiveRecord::StatementInvalid
Error         PGError: server closed the connection unexpectedly This probably means
              the server terminated abnormally before or while processing the request.
              : SELECT a.attname, format_type(a.atttypid, a.atttypmod), d.adsrc,
              a.attnotnull FROM pg_attribute a LEFT JOIN pg_attrdef d ON a.attrelid =
              d.adrelid AND a.attnum = d.adnum WHERE a.attrelid = '"taggings"'::regclass
              AND a.attnum > 0 AND NOT a.attisdropped ORDER BY a.attnum

对于我的Facebook工作人员:

Class         FBConnectionsJob
Arguments     1
Exception     OpenSSL::SSL::SSLError
Error         SSL_connect returned=1 errno=0 state=SSLv3 read server certificate B:
              certificate verify failed

Class         FBConnectionsJob
Arguments     1
Exception     ActiveRecord::StatementInvalid
Error         PGError: server closed the connection unexpectedly This probably means
              the server terminated abnormally before or while processing the request.
              : SELECT tablename FROM pg_tables WHERE schemaname = ANY
              (current_schemas(false)) 

为什么我在不同的环境中会遇到不同的错误?我的初始化文件看起来像:

我应该在这里添加ENV规范吗?

Resque.rb

uri = URI.parse(ENV["REDISTOGO_URL"])
Resque.redis = Redis.new(:host => uri.host, :port => uri.port, :password => uri.password)
Dir["#{Rails.root}/app/jobs/*.rb"].each { |file| require file }

Redis.rb

uri = URI.parse(ENV["REDISTOGO_URL"])
REDIS = Redis.new(:host => uri.host, :port => uri.port, :password => uri.password)
Resque.redis = REDIS

我的 environments / production.rb 文件没有引用Redis,而我的 environments / development.rb 文件对Redis设置没有:

ENV["REDISTOGO_URL"] = 'redis://username:password@my.host:6789' 

4 个答案:

答案 0 :(得分:29)

将以下内容添加到我的Rakefile中为我修复了类似的问题:

task "resque:setup" => :environment do
  Resque.before_fork = Proc.new { ActiveRecord::Base.establish_connection }
end

这将重新连接PostgreSQL,之后Resque会分叉其创建工作程序的进程。

答案 1 :(得分:0)

您的应用看起来无法连接到Redis服务器。您是否提供了生产环境的有效连接详细信息?你有Redis服务器吗?防火墙后面是不是有些私人网络?

我认为生产PostgreSQL服务器可能会遇到同样的问题。

答案 2 :(得分:0)

我已将初始化程序更改为以下内容,现在它可以在localhost上运行,因此@mirtinciu对服务器连接是正确的。还需要弄清楚生产服务器上出了什么问题。

if Rails.env.development?
  uri = URI.parse(ENV["REDISTOGO_URL"])
  Resque.redis = Redis.new(:host => 'localhost', :port => '6379')
else
  uri = URI.parse(ENV["REDISTOGO_URL"])
  Resque.redis = Redis.new(:host => uri.host, :port => uri.port, :password => uri.password)
end

答案 3 :(得分:0)

我认为它是重复的,它通过恢复ActiveRecord连接来解决: Rails Resque workers fail with PGError: server closed the connection unexpectedly