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 で試してみましたが、同じ問題です。
何が起こっているか知っているなら、あなたは天才です!