背景:
任務(wù)調(diào)度是日常開發(fā)中非常常見的一個(gè)業(yè)務(wù)場景。目前系統(tǒng)采用的是Quartz框架進(jìn)行任務(wù)調(diào)度,但與業(yè)務(wù)系統(tǒng)耦合性太高,極端情況下,耗時(shí)任務(wù)甚至?xí)谋M調(diào)度線程,導(dǎo)致大量任務(wù)堵塞與延遲。也可能拖垮業(yè)務(wù)系統(tǒng)。
另一方面Quartz沒有后臺(tái)管理界面。問題定位排查 手動(dòng)觸發(fā)任務(wù),隨時(shí)修改任務(wù)執(zhí)行時(shí)間等較難。
綜上所述,我們需要解決以下幾個(gè)問題:
1:有良好的后臺(tái)管理頁面。
2:任務(wù)動(dòng)態(tài)分片,數(shù)據(jù)龐大的大任務(wù)處理。
3:任務(wù)阻塞,路由及報(bào)警策略。
4:開發(fā)文檔和社區(qū)完善。
調(diào)度框架對比選型
此次主要對xxl-job(大眾),Elastic-job(當(dāng)當(dāng)),staturn(唯品會(huì)),lts,TBSchedule(阿里)五種調(diào)度框架進(jìn)行綜合對比。

對比總結(jié):
e-Job和xxl-job都有廣泛的用戶基礎(chǔ)和的技術(shù)文檔,都能滿足定時(shí)任務(wù)的基本功能需求。
e-Job已有2年左右沒更新,社區(qū)也已經(jīng)不維護(hù),后續(xù)穩(wěn)定性無法保證。
xxl-job 文檔詳細(xì),且任務(wù)報(bào)警、阻塞及路由策略豐富,社區(qū)完善。
?因此采用xxl-job調(diào)度框架。
XXL-JOB特性簡介
-路由策略:- 阻塞處理策略 -子任務(wù):-失敗報(bào)警 -分片廣播 & 動(dòng)態(tài)分片 等?
這里就不照搬官網(wǎng)參數(shù),參考:https://github.com/xuxueli/xxl-job/
-?任務(wù)調(diào)度錯(cuò)過觸發(fā)時(shí)間時(shí)的處理策略:
可能原因:服務(wù)重啟;調(diào)度線程被阻塞,線程被耗盡;上次調(diào)度持續(xù)阻塞,下次調(diào)度被錯(cuò)過;
處理策略:
過期超5s:本次忽略,當(dāng)前時(shí)間開始計(jì)算下次觸發(fā)時(shí)間
過期5s內(nèi):立即觸發(fā)一次,當(dāng)前時(shí)間開始計(jì)算下次觸發(fā)時(shí)間
目前壓測存在的問題:
1、在上萬任務(wù)同時(shí)并發(fā)時(shí) 。發(fā)現(xiàn)有部分任務(wù)丟失問題。
? ? ? 此問題可通過以下三種方案提升并發(fā)量:
? ? a.通過加大調(diào)度線程池?cái)?shù)量。
? ? b.增加調(diào)度中心集群數(shù)量。
? ? c.修改過期任務(wù)處理策略,默認(rèn)為5秒。
????官方數(shù)據(jù):單機(jī)并發(fā)5千,目前本地實(shí)測:單機(jī)并發(fā)1千
2、因外部因素導(dǎo)致服務(wù)宕機(jī)時(shí),正在執(zhí)行的任務(wù)可能會(huì)丟失。例如:服務(wù)器斷電。kill -9
? ? 此問題通過二次開發(fā)解決,方案如下:
? ? a.心跳檢測時(shí),將下線的機(jī)器中正在執(zhí)行的任務(wù)標(biāo)記為失敗,并重試。(默認(rèn)30秒檢測一次,3次失敗則將此執(zhí)行器下線,如果執(zhí)行器在心跳檢測間隔期重啟完成,則正在執(zhí)行中的任務(wù)會(huì)卡住無結(jié)果,解決方案參考b)
? ? b.有新執(zhí)行器注冊時(shí),查找此執(zhí)行器是否有正在執(zhí)行中的任務(wù),有則標(biāo)記為失敗,任務(wù)會(huì)自動(dòng)重試。
3、不支持重復(fù)性一次性任務(wù)
? ? ? ?二次開發(fā)可以解決,即利用同一個(gè)任務(wù),每次通過接口方式傳入需要執(zhí)行的參數(shù),例如:訂單號(hào)10086在15分鐘后超時(shí)取消。 通過調(diào)用啟動(dòng)任務(wù)接口,動(dòng)態(tài)傳參即可
接入指南:
1、在admin后臺(tái)添加對應(yīng)的執(zhí)行器。AppName為唯一標(biāo)識(shí)
2、添加Maven依賴
<dependency>
? ? <groupId>com.xuxueli</groupId>
? ? <artifactId>xxl-job-core</artifactId>
? ? <version>2.1.1-SNAPSHOT</version>
</dependency>
3、添加xxl-job.properties
### 調(diào)度中心部署跟地址:如調(diào)度中心集群部署存在多個(gè)地址則用逗號(hào)分隔。執(zhí)行器將會(huì)使用該地址進(jìn)行"執(zhí)行器心跳注冊"和"任務(wù)結(jié)果回調(diào)";為空則關(guān)閉自動(dòng)注冊;
xxl.job.admin.addresses=http://127.0.0.1:8080/xxl-job-admin
### 執(zhí)行器AppName:(在admin后臺(tái)配置的AppName) 執(zhí)行器心跳注冊分組依據(jù);為空則關(guān)閉自動(dòng)注冊,同一個(gè)執(zhí)行器集群內(nèi)AppName需要保持一致;調(diào)度中心根據(jù)該配置動(dòng)態(tài)發(fā)現(xiàn)不同集群的在線執(zhí)行器列表。
xxl.job.executor.appname=top-service-job
### 執(zhí)行器IP:默認(rèn)為空表示自動(dòng)獲取IP,多網(wǎng)卡時(shí)可手動(dòng)設(shè)置指定IP,該IP不會(huì)綁定Host僅作為通訊實(shí)用;地址信息用于 "執(zhí)行器注冊" 和 "調(diào)度中心請求并觸發(fā)任務(wù)";
xxl.job.executor.ip=
### 執(zhí)行器端口號(hào) :小于等于0則自動(dòng)獲?。荒J(rèn)端口為9999,單機(jī)部署多個(gè)執(zhí)行器時(shí),注意要配置不同執(zhí)行器端口;
xxl.job.executor.port=9999
### 執(zhí)行器通訊TOKEN :非空時(shí)啟用;
xxl.job.accessToken=
### 執(zhí)行器運(yùn)行日志文件存儲(chǔ)磁盤路徑 :需要對該路徑擁有讀寫權(quán)限;為空則使用默認(rèn)路徑;
xxl.job.executor.logpath=/data/applogs/xxl-job/jobhandler
### 執(zhí)行器日志保存天數(shù) :值大于3時(shí)生效,啟用執(zhí)行器Log文件定期清理功能,否則不生效;
xxl.job.executor.logretentiondays=-1
至此xxl-job接入完成,即可開始開發(fā)任務(wù)。