2013-04-16 23 views
12

私は、レールアプリケーションでバックグラウンドジョブの実行にdelayed_jobとdelayed_job_active_recordを使用しています。キューベースのdelayed_jobを使用しています。私は次のコマンドを使用して遅れて開始しています。delayed_job更新クエリが無限に実行されています

RAILS_ENV=staging script/delayed_job -i=1 --queue=queue_name start 

以下のクエリは無限に発火しています。

SQL (0.4ms) UPDATE `delayed_jobs` SET `locked_at` = '2013-04-16 09:27:23', `locked_by` = 'delayed_job.=2 host:ip-10-204-210-77 pid:2168' WHERE `delayed_jobs`.`queue` IN ('queue_name') AND ((run_at <= '2013-04-16 09:27:23' AND (locked_at IS NULL OR locked_at < '2013-04-16 05:27:23') OR locked_by = 'delayed_job.=2 host:ip-10-204-210-77 pid:2168') AND failed_at IS NULL) ORDER BY priority ASC, run_at ASC LIMIT 1 

delayed_jobカウントはゼロです。このため、アプリケーションは非常に遅く、ページは多くの場所で読み込まれません。

解決策を提案できます。

ありがとうございました よろしく。

+0

試してみてくださいdelayed_job_active_ record_threadedとこれが役立ちますか?あなたのご意見をお聞きしたいと思います=)https://github.com/zxiest/delayed_job_active_record_threaded – Abdo

+1

こちらも同じです。仕事がなく、UPDATEもやろうとしているので、それは欺かれています。ログに不要なノイズが多く発生するだけです。 –

+0

@Menonあなたは解決策に到達できましたか? – scanales

答えて

1

これはPostgres向けに特別に設計されたクエリです。それがなぜそうでなければならないのかについては、https://github.com/collectiveidea/delayed_job_active_record/blob/master/lib/delayed/backend/active_record.rb#L57を参照してください。

遅延ジョブのアイデアは実際にはdbを定期的に照会するため、作業者が実行されている限り、質問内のクエリが発生することが予想されます。これは毎秒起こるはずですが、これがあなたのアプリのパフォーマンスに重大な影響を与えているとは想像できません。

非常に小さな仮想マシンのように非常に限られたハードウェアで実行していますか?

+0

仮想マシンではありません。アマゾンの小さなインスタンス。私はPostgresではないMysqlを使用しています。 – apr

+0

ディスクにスワップしているのでおそらく遅いですか?あなたは、ルビプロセスのメモリフットプリントをチェックしましたか? – moritz

4

は、私が何を意味することはあると思うdelayed_jobポーリング(ちなみにデフォルトではすべての5秒で)あまりにも頻繁に - 私はそれがあなたのログをいっぱいにし、「無限」らしい知っている.. :)

これが意味するものなら、workless gemを実行することをおすすめします。これは、必要に応じてdelayed_jobを開始するだけです。多くの人がそれを使用して、Herokuワーキング・ダイノスがアイドル状態にならないようにしますが、developmentモードでも同様に動作します。

delayed_job_active_recordを使用している場合は、Gemfiledaemons)にgem 'daemons'を追加する必要があります。 Running Jobs section of delayed_jobを参照してください。

このように、あなたのGemfileが含まれます

gem 'delayed_job_active_record' 
gem 'daemons' 
gem 'workless' 

あなたはより多くの指導が必要な場合は、私は以下のコメントで知らせてください。

2

私はちょうどライン68の周りファイル[path/to/delayed_job_active_record/gem]/delayed_job_active_record-[any.latest.version]/lib/delayed/backend/active_record.rbに変更、ARのsilenceメソッドを使用する必要がありました:への歓迎...

count = ready_scope.limit(1).update_all(:locked_at => now, :locked_by => worker.name) 

count = silence {ready_scope.limit(1).update_all(:locked_at => now, :locked_by => worker.name)} 

に汚れたソリューションを、私は知っているが、それは動作しますより良いラッパーを提案しますが、私にとっては Job.reserveメソッドは、それを上書きするために任意の考えを殺すために十分大きいです

関連する問題