目標:應用可以部署在多台服務器上,但是定時任務只能由其中一台機器觸發。
方案:
1. 應用部署前修改代碼或者修改配置,確定某台服務器的某個應用可以啟用定時任務功能,其它禁用此功能。
優點:性能好
缺點:部署麻煩易出錯、應用一旦崩潰任務即停止。
2.使用分布式鎖,確保同一時刻,不會出現重復操作,然后記錄任務是否執行過,執行過的不執行。
優點:多應用分布式部署,只要有一個應用可用即可用
缺點:某些場景不適用(是否執行過很難判斷,比如每隔一分鍾執行一次的任務,因為不同服務器和數據庫服務器的時間很難確保一致,每隔1天的任務,就推薦這樣子做)
3.使用數據庫樂觀鎖,程序中存儲最新執行版本號$ver,數據庫記錄任務日志task_log:任務id、最新執行時間、執行版本號等,update task_log set time=now(),version=version+1 where version=$ver 成功,方可執行任務,然后存儲最新版本號。update失敗的獲取最新版本號也存儲下來。下次多應用並發或不並發均可僅執行一次任務。
優點:分布式部署高可用,使用數據庫樂觀鎖性能好,解決了方案2的弊端。
缺點:暫時沒發現