一、背景
服務有定時任務,當服務部署到多個節點時,每個節點在同一個時間點都會執行相同的定時任務,需要做的是,讓同一個時間點,每一個定時任務只在一個節點上執行。
二、 解決方案思路
- 單獨設置任務調度服務
- 使用Redis實現
- 使用XXL-JOB實現
- 使用Elastic-Job框架實現
- 使用LTS框架實現
三、方案
3.1 方案一:單獨設置任務調度服務
任務調度服務部署在單結點,定時任務以Http請求的方式去向網關調用任務請求,網關將請求分發到集群中的某一個節點,某一個節點執行任務。
3.2 方案二:使用Redis實現
每個定時任務都在Redis中設置一個Key-Value,Key為自定義的每個定時任務的名字(如task1:redis:lock),Value為服務器Ip,同時設置合適的過期時間(例如設置為5min)。
每個節點在執行時,都要進行以下操作:
- 1.是否存在Key,若不存在,則設置Key-Value,Value為當前節點的IP
- 2.若存在Key,則比較Value是否是當前Ip,若是則繼續執行定時任務,若不是,則不往下執行。
3.3 方案三:開源分布式框架(推薦)
1、使用XXL-JOB實現
分布式任務調度平台XXL-JOB 官網文檔
參考文檔
[1]: XXL-JOB 官網文檔地址
[2]: Elastic-Job
[3]: LTS