分布式定時任務調度框架

一、前言

在開發(fā)中會有定時任務的場景需要用到定時任務,如訂單超時需要自動取消訂單、數(shù)據(jù)需定時備份、定時短信郵件的發(fā)送等,如此涉及到幾個概念:

  • 任務:業(yè)務邏輯的實現(xiàn),如定時生日短信發(fā)送
  • 調度器:根據(jù)配置(cron表達式)來告知執(zhí)行器去執(zhí)行任務
  • 執(zhí)行器:任務執(zhí)行的載體

二、springBoot中的實現(xiàn)

1、代碼實現(xiàn)
@Configuration
@EnableScheduling//標識這個類是定時任務類
@EnableAsync//定義這個類可以用異步線程
public class MyTask{
  @Scheduled(cron = "* * * * * ?")//cron可以分為6個參數(shù)或者7個參數(shù)【秒、分、時、天、月、周、年】
  @Async//定義該方法用異步
  publicvoid task(){}
}

其中我們查看timer的源碼可以發(fā)現(xiàn),timer內部加了同步鎖,同一個timer默認是單線程的定時任務,如果任務持續(xù)時間較長,就會將后續(xù)定時任務拖延,導致丟失任務。

2、spring中定時任務存在的問題
  • 不支持集群部署:比如你啟動三個實例,每個實例都會去觸發(fā)執(zhí)行器去執(zhí)行“優(yōu)惠券要過期給用戶發(fā)送一個提醒”這個任務,這時候就產生了重復執(zhí)行的問題。
  • 通常是單機部署的,單機就存在掛掉的風險。
  • 不支持失敗重試:出現(xiàn)異常后任務終結,不能根據(jù)執(zhí)行狀態(tài),控制任務重新執(zhí)行
  • 不支持動態(tài)管理:不重啟任務情況下,關閉和啟動任務,修改cron表達式等。
  • 無報警:任務失敗后不能發(fā)送報警通知
  • 不支持分片任務

三、XXL-JOB簡要介紹

地址:https://gitee.com/xuxueli0323/xxl-job/https://github.com/xuxueli/xxl-job

XXL-JOB是一個輕量級分布式任務調度平臺,其實現(xiàn)原理是:調度中心會配置 cron表達式,路由策略,處理類的bean實例,執(zhí)行器需要向調度中心發(fā)生心跳,對于長時間沒有收到心跳的執(zhí)行器,調度中心會將其剔除
其中在高可用過程中xxl-job-admin是通過xxl_job_qrtz_locks表來競爭數(shù)據(jù)庫鎖保證多個調度中心分發(fā)任務只分發(fā)一次


image.png

以下是xxl-job的架構圖


image.png

四、PowerJob簡要介紹

地址:https://github.com/KFCFans/PowerJob

架構圖

五、定時任務調度框架的對比

image.png

六、公司目前的技術選型是XXL-JOB,故用XXL-JOB用來開發(fā)實踐

1、先把git上的文件clone下來,運行doc目錄下的tables_xxl_job.sql
image.png
2、啟動admin

修改admin中的配置文件,改成自己本地的信息

3、啟動"執(zhí)行器"
xxl-job-executor-sample-springboot/src/main/resources/application.properties配置說明


### 調度中心部署跟地址 [選填]:如調度中心集群部署存在多個地址則用逗號分隔。執(zhí)行器將會使用該地址進行"執(zhí)行器心跳注冊"和"任務結果回調";為空則關閉自動注冊;
xxl.job.admin.addresses=http://127.0.0.1:8080/xxl-job-admin

### 執(zhí)行器AppName [選填]:執(zhí)行器心跳注冊分組依據(jù);為空則關閉自動注冊
xxl.job.executor.appname=xxl-job-executor-sample

### 執(zhí)行器IP [選填]:默認為空表示自動獲取IP,多網(wǎng)卡時可手動設置指定IP,該IP不會綁定Host僅作為通訊實用;地址信息用于 "執(zhí)行器注冊" 和 "調度中心請求并觸發(fā)任務";
xxl.job.executor.ip=

### 執(zhí)行器端口號 [選填]:小于等于0則自動獲?。荒J端口為9999,單機部署多個執(zhí)行器時,注意要配置不同執(zhí)行器端口;
xxl.job.executor.port=9999

### 執(zhí)行器通訊TOKEN [選填]:非空時啟用;(注意與調度中心保持一致)
xxl.job.accessToken=

### 執(zhí)行器運行日志文件存儲磁盤路徑 [選填] :需要對該路徑擁有讀寫權限;為空則使用默認路徑;
xxl.job.executor.logpath=/data/applogs/xxl-job/jobhandler

### 執(zhí)行器日志保存天數(shù) [選填] :值大于3時生效,啟用執(zhí)行器Log文件定期清理功能,否則不生效;
xxl.job.executor.logretentiondays=-1

真是開箱即用,操作簡單

參考官網(wǎng)地址:https://www.xuxueli.com/xxl-job/#%E4%BA%8C%E3%80%81%E5%BF%AB%E9%80%9F%E5%85%A5%E9%97%A8

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯(lián)系作者
【社區(qū)內容提示】社區(qū)部分內容疑似由AI輔助生成,瀏覽時請結合常識與多方信息審慎甄別。
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發(fā)布,文章內容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務。

友情鏈接更多精彩內容