2012-09-04 102 views
7

我一直試圖讓Resque(與Resque服務器)& RedisToGo在Heroku(雪松)一段時間的工作了,但我一直運行到這個錯誤:Resque,Resque服務器上RedisToGo與Heroku的

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 /任務/ 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" 

初始化: 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 } 

然後在我的應用程序/工人目錄我有類似myjob.rb

我覺得我」米在這裏的圈子,任何想法?

+0

你能否確認你安裝了RedisToGo插件。檢查'heroku config'的輸出,並確保你有一個REDISTOGO_URL的條目 – Jonathan

+0

你知道了嗎?我有同樣的問題。 – Kohanz

回答

8

我認爲你的Procfile有一個錯字。爲什麼你有兩個web進程?我會堅持一個,並使用獨角獸

web: bundle exec unicorn -p $PORT -c ./config/unicorn.rb

當使用麒麟resque,你必須定義resque的Redis每次連接麒麟叉。這裏是相關的文件。

配置/初始化/ redis.rb

uri = URI.parse(ENV["REDIS_WORKER"]) 
REDIS_WORKER = Redis.new(host: uri.host, port: uri.port, password: uri.password) 

配置/初始化/ resque.rb

Resque.redis = REDIS_WORKER 

配置/ 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 

看到這個gist爲完整unicorn.rb

+0

在這種情況下,有一個網絡和一個工人dyno?這個配置跟蹤工人dyno的IP地址?這是否說明了在兩者之間沒有另一項服務的情況下需要進行的所有通信? – Dogweather

+0

@Dogweather一個網絡和一個工人測功機。 REDIS_WORKER是工作人員dyno Redis連接。你不需要另一項服務。 – simeonwillbanks