分布式調(diào)度任務(wù)技術(shù)選型-xxl-job二次開發(fā)優(yōu)化

背景:

任務(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ù)。

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

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容