現在為了提高服務的響應時間,避免單點故障,一般專案都會做集群部署,最少兩個節點。集群部署的時候就會暴露出一些單節點下不會遇到的問題,比如session問題、快取不一致問題等。還有一種情況是,定時任務重複執行的問題。
對於分布式環境下定時任務重複執行問題,常見的幾種解決方案有下面這幾種。
資料庫唯一索引,比較好理解:就是在定時表裡面加乙個新增了唯一索引的字段,乙個任務執行前先更新鎖定這個字段,然後再執行定時任務,執行完成後,更新釋放這個字段。
redis分布式鎖,是通過setnx來實現的,和資料的過程差不多:更新前先查詢有沒有,沒有的話鎖定後執行定時任務,執行完成後釋放鎖。優點是記憶體資料庫比傳統資料庫更快,不需要改資料庫,**改動相對較小,推薦。
單節點執行就是把專案中的定時任務邏輯都單獨拎出來作為乙個單獨的微服務來執行,並且不做集群,單節點執行。這樣就避免了集群重複執行的問題,優點是簡單直接,不是很重要的定時任務可以選擇此方法。缺點很明顯:單節點故障。
如果是使用的quartz框架的話,也可以考慮quartz本身提供的集群功能,搭建集群環境下的定時任務。缺點,quartz的集群實現比較複雜,需要額外的11張配置表。但是如果場景需要或者想做個公司內部通用的服務的話,可以考慮搭建乙個定時任務集群的話也是可以考慮的,可以單出拎出來作為乙個定時任務中心來使用。
Redis解決分布式定時任務重複執行問題
問題描述 有乙個定時任務是每週一給客戶傳送郵件的功能,後台部署了2臺伺服器,所以客戶 收到了2封重複郵件。解決思路 分布式鎖一般有三種實現方式 1.資料庫樂觀鎖 2.基於redis的分布式鎖 3.基於zookeeper的分布式鎖。這裡使用一台redis伺服器來解決上面的問題。部分比較簡單 加鎖 主要...
解決分布式集群環境下定時任務執行多次的方法彙總
在開發的過程中,專案中使用定時器已經不是乙個新鮮的事情了,但是如果你的專案後期部署到集群環境下,如果不做處理,就會出現意想不到的問題,原因 由於我們專案同時部署在多台集群機器上,因此到達指定的定時時間時,多台機器上的定時器可能會同時啟動,造成重複資料或者程式異常等問題,下面我提供幾種解決方案 一 固...
防止 crontab 定時任務重複執行
前言 crontab 定時任務很好使用,它的定時是很強硬的,直接跟系統時間打交道,不會去管程式本身執行是否需要時間。舉個栗子 乙個指令碼執行需要 1 小時,使用 crontab 每隔2小時執行一次,一般情況下下次執行指令碼時上次指令碼執行肯定是跑完了的 但是,假如,程式卡住了呢?下次執行時上次指令碼...