8

複数のワーカーを実行するセットアップで遅延ジョブを使用しています。私の質問のために、それはあまり重要ではありませんが、10 個のワーカーを実行しているとしましょう (現在は開発モードで実行しています)。

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

私の理解の範囲では、Delayed Job は悲観的ロックを使用してこれが起こらないようにしていますが、最初のワーカーが実際にロックする前に、ジョブをロックするのに十分な時間があるようです。

他の誰かがこの問題を経験したかどうか、または私の設定が正しくないかどうかを確認したいだけです。私は Postrgres を使用していますが、これは開発マシンとホストしている Heroku の両方で発生します。

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

ありがとう!

4

1 に答える 1

1

私たちは 12 人のワーカーで遅延ジョブを介して約 6,000 万のジョブを実行しましたが、このような報告はありませんでした。遅延ジョブ ワーカーが実行している SQL は何ですか? postgres のロック動作を変更する gem を使用していますか?

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 つの Rails コンソール セッションを実行して、これを実行してみてください:

コンソール セッション 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 の前に終了する場合は、より一般的なロックの問題が発生し、ジョブが遅延します。

于 2014-05-02T21:20:21.163 に答える