一个项目在集群中运行,如何让定时任务只运行一次?不加限制就会导致重复计算的问题。
人生最曼妙的风景,竟是内心的淡定与从容!
java的話,建議使用quartz,1.quartz做各類定時任務很方便2.它是支援集群的,原理是透過資料庫表來保證同一個任務只在一個服務上執行。
假設你最簡單的方式使用quartz,那麼你在代碼中就要修改了,在job邏輯中加入獲取鎖的操作,這個鎖可以做到數據庫,具體方法是:插入一條有業務意義主鍵記錄,執行時,叢集中相同的job只會有一條插入成功,這就代表它獲得了鎖,可以執行,否則退出此次job,不執行。
quartz
Configure Clustering with JDBC-JobStore
Quartz’s clustering features bring both high availability and scalability to your scheduler via fail-over and load balancing functionality.
quartz 本身就是支援集群,容錯,負載平衡的。不需要改任何程式碼即可實現。
quartz框架支援叢集
可以做一個中間件系統,專門管理定時任務的觸發和訊息的訂閱和消費,到了時間觸發時就發一個訊息出來,由集群系統來訂閱這條訊息。訊息可以隨機投遞到叢集中任何一台機器。
一台機器定時開始就要透過訊息廣播給其它機器。但每台機器時間間隔是個問題,沒等訊息發送就都定時開啟了...
使用zookeeper,redis等手動儲存定時任務執行狀態等信息,保證只執行一次。
將定時任務抽取到一個單獨的專案中(單機運作),但是任務具體內容透過遠端呼叫(dubbo,mq等)呼叫具體的分散式服務。也就是定時任務只是單獨的用於任務觸發,具體任務還是分散式執行的。
使用各種分佈任務調度系統,如Uncode-Schedule
傾向於單獨拉出來弄個stand-alone的程式
java的話,建議使用quartz,
1.quartz做各類定時任務很方便
2.它是支援集群的,原理是透過資料庫表來保證同一個任務只在一個服務上執行。
假設你最簡單的方式使用
quartz
,那麼你在代碼中就要修改了,在job邏輯中加入獲取鎖的操作,這個鎖可以做到數據庫,具體方法是:插入一條有業務意義主鍵記錄,執行時,叢集中相同的job只會有一條插入成功,這就代表它獲得了鎖,可以執行,否則退出此次job,不執行。Configure Clustering with JDBC-JobStore
Quartz’s clustering features bring both high availability and scalability to your scheduler via fail-over and load balancing functionality.
quartz 本身就是支援集群,容錯,負載平衡的。不需要改任何程式碼即可實現。
quartz框架支援叢集
可以做一個中間件系統,專門管理定時任務的觸發和訊息的訂閱和消費,到了時間觸發時就發一個訊息出來,由集群系統來訂閱這條訊息。訊息可以隨機投遞到叢集中任何一台機器。
一台機器定時開始就要透過訊息廣播給其它機器。但每台機器時間間隔是個問題,沒等訊息發送就都定時開啟了...
使用zookeeper,redis等手動儲存定時任務執行狀態等信息,保證只執行一次。
將定時任務抽取到一個單獨的專案中(單機運作),但是任務具體內容透過遠端呼叫(dubbo,mq等)呼叫具體的分散式服務。也就是定時任務只是單獨的用於任務觸發,具體任務還是分散式執行的。
使用各種分佈任務調度系統,如Uncode-Schedule
傾向於單獨拉出來弄個stand-alone的程式