プラグイン初心者です。約 1 時間かかるプラグインを適応させようとしています。/sidekiq を確認すると、ジョブが 30 分ごとに実行されていることがわかります。つまり、最初のジョブが完了する前に、同じジョブの別のインスタンスが開始され、重複した結果が作成されてしまいます。これを防ぐにはどうすればよいでしょうか?
もちろん、ジョブを許可された 30 分以内に実行させるという選択肢もありますが、他の制約もあるため、できるだけ長く実行させたいと考えています。
以下を試してみましたが、ジョブの 2 番目のインスタンスの実行を防げないようです:
DistributedMutex.synchronize("custom_digest", validity: 180.minutes)
pfaffman
(Jay Pfaffman)
2
要約メールジョブは、今年初めに追加されたそのようなテストを実行していると思います。一度確認してみてください。
私は、https://review.discourse.org/t/feature-allow-post-process-mutex-to-be-held-longer/5017 と https://review.discourse.org/t/fix-post-and-topic-creation-race-condition/5247 とほぼ同じことを行っていますが、do/end の代わりに中括弧を使用している点を除きます。しかし、それは問題にならないと思います。
DistributedMutex.synchronize("custom_digest", validity: 180.minutes) {
do_stuff
}
しかし、do_stuff は 180 分以内の期間に、複数回並行して実行されています。
Falco
(Falco)
4
ミューテックスが execute ブロック内にあれば、それはそこでミューテックスを待つためにブロックされることを意味します。つまり、2 つのジョブが実行されているように見え、実際に実行されているものと、ミューテックスを待っているものの両方が存在することになります。
もしかすると、他のインスタンスが実行中かどうかを確認し、その場合は早期にリターンする処理を追加したいのかもしれません。具体的なユースケースについてほとんど知らない状態では、確実なことは言えません。