分布式定時任務

2021-10-13 05:21:53 字數 934 閱讀 7629

在做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...