在做springboot專案的時候,需要定時做對賬任務。但因為專案是集群部署,就存在多個pod例項的定時任務同時執行,存在重複性。怎麼保證集群中不重複地完成定時任務?下面給出本人總結的方案。
對賬任務表(merchant)
idname
is_done(是否對賬,0沒有對賬)
1商家102
商家20
3商家304
商家40
5商家5
01.現開啟3個pod去同時執行定時任務
2.每個pod 都去查是否存在沒有對賬的商家,存在則返回最前面的那條記錄
;不存在則直接停止定時任務
select * from merchant limit 0,1 where is_done = 0
3.建立一張臨時表(check_lock),實現分布式鎖
name
描述約束
id主鍵id
merchant_id
商家id
唯一性約束
task_id
主鍵id
其中id為主鍵,merchant_id 新增唯一性約束
。
4.假如三個任務都查到是商家1
,則三個任務都去往臨時表插入一條資料,如下表,表示任務2搶到了商家1的對賬任務。假如其他任務也想往臨時表插入,會因為merchant_id
存在唯一性約束
,導致插入不成功。
insert into check_lock (check_id, task_id) values ('1', '2');
id
merchant_id
task_id11
25.其他插入不成功的任務,繼續查詢資料表中,是否還存在沒對賬的商家,存在則繼續步驟1,不存在則直接停止定時任務。
分布式定時任務元件對比
描述xxl job elastic job lite saturn 主要作者 大眾點評徐雪裡 當當網張亮 唯品會開源,基於elastic job 特殊環境 mysql5.7 zookeeper 同elastic job 特殊功能 策略豐富,支援分片 子任務 支援分片,分片策略比xxl job豐富,支...
redis解決分布式定時任務問題
場景分析 多伺服器針對於定時任務帶來的問題,保證任務只在乙個伺服器上在執行。解決方案1 redis bean public defaultredisscript redisscript scheduled cron 40 public void testscheduled else catch in...
分布式定時任務需要考慮的問題
定時任務的多機分布會產生幾個需要解決的問題 如果多台機器的時區不一致,那鎖基本上無從談起了。或者時區一致,但可能伺服器時間相差幾秒鐘,那麼也有可能導致鎖丟失。那麼如果servera在加鎖的過程中,出現宕機怎麼辦,是否會一直處於加鎖狀態 每個定時任務應該有不同的鎖命名,防止出現同名鎖。可以使用例項的i...