2016-04-14 21 views
2

私はHerokuで本当に奇妙な問題を抱えています。HerokuでのResqueを使ったバックグラウンドジョブ

私のアプリには、ActiveJobをバックグラウンドで実行するように設定したいくつかの外部API呼び出しとメーラがあります。ヘロクで私は2人の従業員を雇っています。私は以下のスニペットに従って、仕事のためにResque/Redisコンボを使用しています。私はHerokuでRedis Cloudアドオンを使用しています。

コンフィグ/セットアップ

Procfile

web: bundle exec puma -C config/puma.rb 
resque: env TERM_CHILD=1 QUEUE=* bundle exec rake rescue:work 

のlib /タスク/ resque.rake

require "resque/tasks" 
require "resque/scheduler/tasks" 

task "resque:setup": :environment do 
    Resque.before_fork = proc { ActiveRecord::Base.connection.disconnect! } 
    Resque.after_fork = proc { ActiveRecord::Base.establish_connection } 
end 

設定/初期化子/ active_job.rb

Rails.application.config.active_job.queue_adapter = :resque 

設定/初期化子/ redis.rb

if ENV["REDISCLOUD_URL"] 
    $redis = Redis.new(url: ENV["REDISCLOUD_URL"]) 
end 

設定/初期化子/ resque.rb

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

問題

私が午前問題があるときユーザーがブラウザでアプリを使用している(つまり、ウェブワーカーとのインタフェイス) Active Jobジョブの1つをトリガーするアクションを形成し、ワーカーではなく、webワーカーを使用してジョブが「インライン」で実行されます。 Herokuアプリケーションコンソール(heroku run rails consoleを実行して開く)でジョブをキューに入れる特定のモデルメソッドを実行すると、Redisにジョブが追加され、期待通りにresqueワーカーを使用して実行されます。

一方向が正常に動作し、もう一方が正常に動作しないのはなぜですか?私はトピックに関するほぼすべてのチュートリアル/ SOの質問を見てきたので、仕事を実行するのに役立つが、適切な作業者はすばらしいだろう。

ありがとうございます!

答えて

2

私の設定で少し遊んで問題を解決することができました。 ActiveJobの "Inline"デフォルトでは、Resque経由ではなく、アクションがトンネリングされていたようです。私がちょうどResque.redis$redis変数に設定したconfig/initializers/redis.rbに等しくなるように指示しなければならなかったので、すべてが同じRedisインスタンスを指していたので、config/initializers/active_job.rbの設定をapplication.rbに移動してください。参考のため

、そのすべての作品の新しい&改善configがある:

コンフィグ/セットアップ

Procfile

web: bundle exec puma -C config/puma.rb 
resque: env TERM_CHILD=1 RESQUE_TERM_TIMEOUT=7 QUEUE=* bundle exec rake resque:work 

のlib /タスク/ resque。熊手

require "resque/tasks" 

task "resque:setup" => :environment 

設定/ application.rb

module App 
    class Application < Rails::Application 
    ... 

    # Set Resque as ActiveJob queue adapter. 
    config.active_job.queue_adapter = :resque 
    end 
end 

設定/イニシャライザ/ redis.rb

if ENV["REDISCLOUD_URL"] 
    $redis = Redis.new(url: ENV["REDISCLOUD_URL"]) 
end 

設定/イニシャライザ/ resque.rb

Resque.redis = Rails.env.production? ? $redis : "localhost:6379" 
2

お返事いただきありがとうございます。それは私に多くの時間を節約しました。

Procfileの中に誤植が1つあります。

レスキューの代わりに再調整する必要があります。

resque: env TERM_CHILD=1 RESQUE_TERM_TIMEOUT=7 QUEUE=* bundle exec rake resque:work 

また、このすべてを本番環境で使用するにはもう1つのコマンドを入力する必要がありました。うまくいけば、これは誰かを助けるでしょう

heroku ps:scale resque=1 --app appname 

このコマンドは、resqueプロセスを1 dyno(フリー)にスケーリングします。ヒロクのダッシュボードからもこれを行うことができます。

herokuのドキュメントで詳しく読むことができますhttps://devcenter.heroku.com/articles/scaling

関連する問題