1

問題は:

ワーカーによって実行されるコードに変更を加えると、新しいコードをプッシュした後も、herokuで実行中のワーカーは以前のワーカーで実行されます。

次に、手動で停止して、resqueを再開する必要があります。しかし、それは間違っていると思います。なぜなら、労働者は何らかの仕事をしている可能性があり、登録が解除されるまでそれを待たなければならないからです。

これは私のresque.rakeです

require 'resque'
require "resque/tasks"

task "resque:setup" => :environment do
  ENV['QUEUE'] = '*' if ENV['QUEUE'].blank?

  Resque::Worker.all.each {|w| w.unregister_worker}
  Resque.after_fork do |job| 
    ActiveRecord::Base.establish_connection
  end
end

task "resque:clean_workers" => :environment do
  Resque::Worker.all.each {|w| w.unregister_worker}
end

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

Dir["#{Rails.root}/app/jobs/*.rb"].each { |file| require file }

アプリをherokuにプッシュすると、ワーカーが新しいコードで更新される可能性があるかどうかを知りたいです。どうすればそれができますか?

ありがとう!!

4

1 に答える 1

2

Herokuは、プラットフォーム機能としてデプロイ時にすべてのプロセスを再起動します。ただし、を介して生成された1回限りのプロセスは除きますheroku run

ワーカープロセスタイプをProcfileに追加します。

worker: bundle exec rake resque:work QUEUE=*

プッシュしてから、Herokuにワーカーを実行するように指示します。

$ heroku ps:scale worker=1

Herokuは、常に1つのworkerdynoを実行していることを確認します。アプリが再起動したとき(たとえば、プッシュ、ロールバック後)、ワーカーが何らかの理由で死亡した場合、またはアプリが存在するホストに障害が発生した場合に、アプリは自動的に再起動heroku restartます。Herokuは、適切な対策として、毎日新しいホストでワーカープロセスを正常にシャットダウンして再起動し、一時ファイルをパージし、メモリリークに上限を設定し、dynoグリッド周辺の負荷を再調整します。

これは、本番環境で24時間365日バックグラウンドジョブを実行している場合に必要な動作です。

于 2012-11-29T15:24:52.693 に答える