ジョブ スケジューラを構築しようとしています。時間ベースで 2 ~ 3 台の異なるマシンで実行するジョブのリストがあります。したがって、どのマシンでも任意のジョブを選択でき、next_execution_time < current_time
. すべてのジョブをデータベース テーブルに格納しSELECT.... FOR UPDATE
、SQL でクエリを使用して実行するジョブを選択しています。
しかし、このアプローチの問題は、machine1 がジョブを選択した場合、書き込みロックしかないため、他のマシンも実行のために同じジョブを選択しますが、ロックが解除されるのを待つため実行できないことです。解放またはロックのタイムアウトが発生します。他のマシンがこのジョブをスキップし、SQL ロックを使用して他のジョブを実行する方法はありますか。データベースに他の列を追加する必要はありませんか?
フローは次のようなものです:
select a job and lock it -> execute the job -> release the lock
これを開発するために ruby-on-rails を使用しています。レールにノーウェイトまたは set_lock_timeout = 0 がある場合。おそらく問題を解決できます。存在する場合...構文は何ですか?