我正在嘗試構建作業調度程序。我有一份要在2-3臺不同的計算機上按時執行的作業的列表。因此,任何機器都可以選擇任何作業,並且如果其next_execution_time < current_time
將執行它。我將所有作業存儲在數據庫表中,並且在SQL中使用SELECT.... FOR UPDATE
查詢來選擇要執行的作業。在數據庫表的一行上讀取鎖定
但是這種方法的問題是,如果machine1選擇了一個作業,因爲只有寫鎖定,其他機器也會選擇相同的作業執行,但不能執行,因爲它們將等待要釋放的鎖定或鎖定超時將發生。那麼有什麼辦法可以讓其他機器跳過這個作業並使用SQL鎖執行其他作業。數據庫中不應該添加其他列?
流程是這樣的:
select a job and lock it -> execute the job -> release the lock
我使用的Ruby-on-Rails使用開發這個。如果在rails中沒有等待或set_lock_timeout = 0。它可能可以解決問題。如果存在......語法是什麼?
您可以爲正在處理的行設置標誌,例如'being_processed =「Y」'並通過'being_processed!=「Y」'過濾行。 – fedorqui
@fedorqui是的,我正在使用額外的列「locked_by」= machine_ip來檢查作業是否被鎖定/執行,但這不被推薦,因爲如果一臺機器在執行任務時發生故障,鎖定將永遠不會被髮布。 –
是的,你是對的。你也可以使用'redis'來設置一個標誌,並在一段時間後過期。 – fedorqui