2013-03-25 7 views
7

私は複数のワーカーを実行するセットアップで遅延ジョブを使用しています。私の質問のために、それは本当に重要ではありませんが、私は10人の労働者を実行しているとしましょう(現時点で開発モードでこれを行っています)。同じジョブを開始する複数の遅延ジョブプロセス

私が抱えている問題は、2人の異なる労働者が同じジョブで作業を開始し、自分のジョブオブジェクトでperformメソッドを呼び出すことがあることです。

Delayed Jobは、これを防ぐために悲観的なロックを使用していますが、最初の作業者が実際にロックするまでにロックをかける時間があるようです。

他の誰かがこの問題を経験しているのか、それとも私の設定が間違っているのか確認するだけです。私はPostrgresを使っています。これは私の開発マシンと私がホストしているHerokuの両方で起こります。

私は自分の仕事の中でそれを回避しようとしますが、これはまだ起こりますが少し問題です。理想的には、遅れた仕事が2つのプロセスから同じ仕事に働くことは決して起こりません。

ありがとうございます!

+0

私は似たようなものを見ます。それを完全に追跡することはできませんでしたが、ロックのチェックとロックの間に、複数のワーカーがジョブをつかんで実行しているようです。 –

+0

私はイニシャライザで '' Delayed :: Worker.read_ahead = 1''を設定すると問題を緩和したようです。 –

+0

Resqueで同じ問題がありましたが解決策が見つかりませんでした –

答えて

0

私たちは12人の従業員と遅延した仕事で約6000万件のジョブを実行しましたが、これについての報告はありませんでした。遅れている職員が実行しているSQLは?あなたはポストグルのロック動作を変えている宝石を使っていますか?ここで

はDJのSQLが私のために次のようになります。

UPDATE "delayed_jobs" SET locked_at = '2014-05-02 21:16:35.419748', locked_by = 
'host:whatever.local pid:4729' WHERE id IN (SELECT id FROM "delayed_jobs" 
WHERE ((run_at <= '2014-05-02 21:16:35.415923' 
AND (locked_at IS NULL OR locked_at < '2014-05-02 17:16:35.415947') 
OR locked_by = 'host:whatever.local pid:4729') AND failed_at IS NULL) 
ORDER BY priority ASC, run_at ASC LIMIT 1 FOR UPDATE) RETURNING * 

は、あなたが他のコードとロックの問題を持っていますか?あなたは、コンソールセッション2本のレールを実行すると、このやってみてください:

コンソールセッション1:

User.find(1).with_lock do sleep(10); puts "worker 1 done" end 

コンソールセッション2:

User.find(1).with_lock do sleep(1); puts "worker 2 done" end 

スタートの両方を同時にそれらと2終了前であれば1、遅延した仕事よりも一般的なロック問題があります。

関連する問題