Resque、Resque Server在RedisToGo和Heroku上的应用

8

我一直在尝试在Heroku(Cedar)上使Resque(与Resque服务器)和RedisToGo正常工作,但我一直遇到以下错误:

Redis::CannotConnectError (Error connecting to Redis on 127.0.0.1:6379 (ECONNREFUSED)):

我的本地环境可以正常工作,并且我可以在Heroku的应用程序控制台中很好地访问redis。

我的Procfile文件内容如下:

web: bundle exec thin start -p $PORT -e $RACK_ENV
web: bundle exec unicorn -p $PORT -c ./config/unicorn.rb
resque: env TERM_CHILD=1 RESQUE_TERM_TIMEOUT=10 bundle exec rake resque:work

我的Gemfile文件中有:

gem 'redis'

#Background queue
gem 'resque', '~> 1.22.0', :require => "resque/server"

lib/tasks/resque.rake:

require 'resque/tasks'

task "resque:setup" => :environment do
  ENV['QUEUE'] = '*'
end

desc "Alias for resque:work (To run workers on Heroku)"
task "jobs:work" => "resque:work"

routes.rb:

  mount Resque::Server.new, :at => "/resque" 

initializers: redis.rb:

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

resque.rb:

Dir["#{Rails.root}/app/workers/*.rb"].each { |file| require file }
Resque.after_fork = Proc.new { ActiveRecord::Base.establish_connection }

那么在我的app/workers目录中,我有一个类似myjob.rb的东西

我觉得我在这里打转了,有什么想法吗?


你能确认一下是否安装了 RedisToGo 插件吗?检查 heroku config 的输出并确保有 REDISTOGO_URL 条目。 - Jonathan
你解决了吗?我也遇到了同样的问题。 - Kohanz
1个回答

9
我认为你的Procfile中有一个错别字。你为什么要有两个“web”进程?我建议只保留一个并使用“unicorn”。
以下是相关文件,当使用resque时,必须在每次unicorn分叉时定义resque redis连接。 web: bundle exec unicorn -p $PORT -c ./config/unicorn.rb config/initializers/redis.rb
uri = URI.parse(ENV["REDIS_WORKER"])
REDIS_WORKER = Redis.new(host: uri.host, port: uri.port, password: uri.password)

config/initializers/resque.rb

Resque.redis = REDIS_WORKER

config/unicorn.rb

before_fork do |server, worker|
  if defined?(Resque)
    Resque.redis.quit
    Rails.logger.info("Disconnected from Redis")
  end
end

after_fork do |server, worker|
  if defined?(Resque)
    Resque.redis = REDIS_WORKER
    Rails.logger.info("Connected to Redis")
  end
end

请查看 这个链接 获取完整的 unicorn.rb 文件。


在这种情况下,有一个Web和一个Worker Dyno?而此配置跟踪Worker Dyno的IP地址?这是否考虑了所有需要在两者之间进行通信而无需其他服务的情况? - Dogweather
@Dogweather 一个网络和一个工作 dyno。REDIS_WORKER 是工作 dyno 的 Redis 连接。你不需要另外的服务。 - simeonwillbanks

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接