2

Resque で非常に奇妙なバグに遭遇しました。

  • ジョブを待っている 1 つのキューで 5 つのワーカーを実行しています。
  • 1 種類の Resque ワーカーを取得しました: MediaAnalyzer

そして、これが世界で最も奇妙なことです: 時々 (ええ、時々)、resque はクラス MediaAnalyzer を見つけることができません。

なぜ時々?ジョブがまったく問題なく処理される場合があるためです。それでも何度か私は得uninitialized constant MediaAnalyzerました。さらに奇妙なことに、resque-web 経由でジョブを再試行すると、数回後にワーカーが見つかり、実行されます...

すべてのワーカーは、同じコマンドで同じ方法で開始されます (PID とログ パスを除く)。

su -c "cd /myapp/current; bundle exec rake environment resque:work RAILS_ENV=production QUEUES=* BACKGROUND=yes PIDFILE=/myapp/current/tmp/pids/resque_worker.1.pid 2>&1 >> /myapp/shared/log/resque_worker.1.log" - rails

注:コンソールでフォアグラウンドモードで手動で起動しても、同じバグが発生し続けます。

resque:setup タスクを介して手動でクラスをロードしようとしました:

task "resque:setup" => :environment do
  require Rails.root.join("app/workers/media_analyzer").to_s
end

これによりエラーは発生しません。この後require、クラス内のすべてを使用できます。出力できるため、このrakeタスクが実際に呼び出されます...しかし、resqueは後でこのクラスのロードに失敗し続けます。

最大の問題は、このバグが本当にランダムであることです。

例外バックトレースのペーストビンは次のとおりです: http://pastebin.com/jy5UakB8

resque 2.0 で試してみましたが、同じ問題です。

何が起こっているか知っているなら、あなたは天才です!

4

3 に答える 3

1

ActiveJob を使用していて、これに気付いた場合、問題を解決するために私が見つけたのは、Redis サーバーを再起動することだけです。なぜこれが機能するのかはまだわかりませんが、それを行った直後にすべてが機能し始め、すべてのワーカーを殺しました。

于 2015-03-05T01:27:13.310 に答える