日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪(fǎng)問(wèn) 生活随笔!

生活随笔

當(dāng)前位置: 首頁(yè) > 编程语言 > python >内容正文

python

python任务调度平台 界面_分布式任务调度平台XXL-JOB

發(fā)布時(shí)間:2023/12/4 python 18 豆豆
生活随笔 收集整理的這篇文章主要介紹了 python任务调度平台 界面_分布式任务调度平台XXL-JOB 小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

以前帶我的人說(shuō)過(guò),最好的學(xué)習(xí)就是看官方文檔,個(gè)人也有4個(gè)T的學(xué)習(xí)視頻,但是會(huì)發(fā)現(xiàn)講的都是入門(mén),有的也比較淺。

官方文檔比較官方,也比較權(quán)威,打開(kāi)xxl-job的官網(wǎng),寫(xiě)的賊詳細(xì),有些人喜歡收博客,不喜歡看官網(wǎng),因此就直接復(fù)制過(guò)來(lái)了,

過(guò)段時(shí)間會(huì)參考文檔,自己來(lái)一遍。

一、簡(jiǎn)介

1.1 概述

XXL-JOB是一個(gè)分布式任務(wù)調(diào)度平臺(tái),其核心設(shè)計(jì)目標(biāo)是開(kāi)發(fā)迅速、學(xué)習(xí)簡(jiǎn)單、輕量級(jí)、易擴(kuò)展。現(xiàn)已開(kāi)放源代碼并接入多家公司線(xiàn)上產(chǎn)品線(xiàn),開(kāi)箱即用。

1.2 社區(qū)交流

1.3 特性

1、簡(jiǎn)單:支持通過(guò)Web頁(yè)面對(duì)任務(wù)進(jìn)行CRUD操作,操作簡(jiǎn)單,一分鐘上手;

2、動(dòng)態(tài):支持動(dòng)態(tài)修改任務(wù)狀態(tài)、啟動(dòng)/停止任務(wù),以及終止運(yùn)行中任務(wù),即時(shí)生效;

3、調(diào)度中心HA(中心式):調(diào)度采用中心式設(shè)計(jì),“調(diào)度中心”自研調(diào)度組件并支持集群部署,可保證調(diào)度中心HA;

4、執(zhí)行器HA(分布式):任務(wù)分布式執(zhí)行,任務(wù)”執(zhí)行器”支持集群部署,可保證任務(wù)執(zhí)行HA;

5、注冊(cè)中心: 執(zhí)行器會(huì)周期性自動(dòng)注冊(cè)任務(wù), 調(diào)度中心將會(huì)自動(dòng)發(fā)現(xiàn)注冊(cè)的任務(wù)并觸發(fā)執(zhí)行。同時(shí),也支持手動(dòng)錄入執(zhí)行器地址;

6、彈性擴(kuò)容縮容:一旦有新執(zhí)行器機(jī)器上線(xiàn)或者下線(xiàn),下次調(diào)度時(shí)將會(huì)重新分配任務(wù);

7、路由策略:執(zhí)行器集群部署時(shí)提供豐富的路由策略,包括:第一個(gè)、最后一個(gè)、輪詢(xún)、隨機(jī)、一致性HASH、最不經(jīng)常使用、最近最久未使用、故障轉(zhuǎn)移、忙碌轉(zhuǎn)移等;

8、故障轉(zhuǎn)移:任務(wù)路由策略選擇”故障轉(zhuǎn)移”情況下,如果執(zhí)行器集群中某一臺(tái)機(jī)器故障,將會(huì)自動(dòng)Failover切換到一臺(tái)正常的執(zhí)行器發(fā)送調(diào)度請(qǐng)求。

9、阻塞處理策略:調(diào)度過(guò)于密集執(zhí)行器來(lái)不及處理時(shí)的處理策略,策略包括:單機(jī)串行(默認(rèn))、丟棄后續(xù)調(diào)度、覆蓋之前調(diào)度;

10、任務(wù)超時(shí)控制:支持自定義任務(wù)超時(shí)時(shí)間,任務(wù)運(yùn)行超時(shí)將會(huì)主動(dòng)中斷任務(wù);

11、任務(wù)失敗重試:支持自定義任務(wù)失敗重試次數(shù),當(dāng)任務(wù)失敗時(shí)將會(huì)按照預(yù)設(shè)的失敗重試次數(shù)主動(dòng)進(jìn)行重試;其中分片任務(wù)支持分片粒度的失敗重試;

12、任務(wù)失敗告警;默認(rèn)提供郵件方式失敗告警,同時(shí)預(yù)留擴(kuò)展接口,可方便的擴(kuò)展短信、釘釘?shù)雀婢绞?#xff1b;

13、分片廣播任務(wù):執(zhí)行器集群部署時(shí),任務(wù)路由策略選擇”分片廣播”情況下,一次任務(wù)調(diào)度將會(huì)廣播觸發(fā)集群中所有執(zhí)行器執(zhí)行一次任務(wù),可根據(jù)分片參數(shù)開(kāi)發(fā)分片任務(wù);

14、動(dòng)態(tài)分片:分片廣播任務(wù)以執(zhí)行器為維度進(jìn)行分片,支持動(dòng)態(tài)擴(kuò)容執(zhí)行器集群從而動(dòng)態(tài)增加分片數(shù)量,協(xié)同進(jìn)行業(yè)務(wù)處理;在進(jìn)行大數(shù)據(jù)量業(yè)務(wù)操作時(shí)可顯著提升任務(wù)處理能力和速度。

15、事件觸發(fā):除了”Cron方式”和”任務(wù)依賴(lài)方式”觸發(fā)任務(wù)執(zhí)行之外,支持基于事件的觸發(fā)任務(wù)方式。調(diào)度中心提供觸發(fā)任務(wù)單次執(zhí)行的API服務(wù),可根據(jù)業(yè)務(wù)事件靈活觸發(fā)。

16、任務(wù)進(jìn)度監(jiān)控:支持實(shí)時(shí)監(jiān)控任務(wù)進(jìn)度;

17、Rolling實(shí)時(shí)日志:支持在線(xiàn)查看調(diào)度結(jié)果,并且支持以Rolling方式實(shí)時(shí)查看執(zhí)行器輸出的完整的執(zhí)行日志;

18、GLUE:提供Web IDE,支持在線(xiàn)開(kāi)發(fā)任務(wù)邏輯代碼,動(dòng)態(tài)發(fā)布,實(shí)時(shí)編譯生效,省略部署上線(xiàn)的過(guò)程。支持30個(gè)版本的歷史版本回溯。

19、腳本任務(wù):支持以GLUE模式開(kāi)發(fā)和運(yùn)行腳本任務(wù),包括Shell、Python、NodeJS、PHP、PowerShell等類(lèi)型腳本;

20、命令行任務(wù):原生提供通用命令行任務(wù)Handler(Bean任務(wù),”CommandJobHandler”);業(yè)務(wù)方只需要提供命令行即可;

21、任務(wù)依賴(lài):支持配置子任務(wù)依賴(lài),當(dāng)父任務(wù)執(zhí)行結(jié)束且執(zhí)行成功后將會(huì)主動(dòng)觸發(fā)一次子任務(wù)的執(zhí)行, 多個(gè)子任務(wù)用逗號(hào)分隔;

22、一致性:“調(diào)度中心”通過(guò)DB鎖保證集群分布式調(diào)度的一致性, 一次任務(wù)調(diào)度只會(huì)觸發(fā)一次執(zhí)行;

23、自定義任務(wù)參數(shù):支持在線(xiàn)配置調(diào)度任務(wù)入?yún)?#xff0c;即時(shí)生效;

24、調(diào)度線(xiàn)程池:調(diào)度系統(tǒng)多線(xiàn)程觸發(fā)調(diào)度運(yùn)行,確保調(diào)度精確執(zhí)行,不被堵塞;

25、數(shù)據(jù)加密:調(diào)度中心和執(zhí)行器之間的通訊進(jìn)行數(shù)據(jù)加密,提升調(diào)度信息安全性;

26、郵件報(bào)警:任務(wù)失敗時(shí)支持郵件報(bào)警,支持配置多郵件地址群發(fā)報(bào)警郵件;

27、推送maven中央倉(cāng)庫(kù): 將會(huì)把最新穩(wěn)定版推送到maven中央倉(cāng)庫(kù), 方便用戶(hù)接入和使用;

28、運(yùn)行報(bào)表:支持實(shí)時(shí)查看運(yùn)行數(shù)據(jù),如任務(wù)數(shù)量、調(diào)度次數(shù)、執(zhí)行器數(shù)量等;以及調(diào)度報(bào)表,如調(diào)度日期分布圖,調(diào)度成功分布圖等;

29、全異步:任務(wù)調(diào)度流程全異步化設(shè)計(jì)實(shí)現(xiàn),如異步調(diào)度、異步運(yùn)行、異步回調(diào)等,有效對(duì)密集調(diào)度進(jìn)行流量削峰,理論上支持任意時(shí)長(zhǎng)任務(wù)的運(yùn)行;

30、跨平臺(tái):原生提供通用HTTP任務(wù)Handler(Bean任務(wù),”HttpJobHandler”);業(yè)務(wù)方只需要提供HTTP鏈接即可,不限制語(yǔ)言、平臺(tái);

31、國(guó)際化:調(diào)度中心支持國(guó)際化設(shè)置,提供中文、英文兩種可選語(yǔ)言,默認(rèn)為中文;

32、容器化:提供官方docker鏡像,并實(shí)時(shí)更新推送dockerhub,進(jìn)一步實(shí)現(xiàn)產(chǎn)品開(kāi)箱即用;

33、線(xiàn)程池隔離:調(diào)度線(xiàn)程池進(jìn)行隔離拆分,慢任務(wù)自動(dòng)降級(jí)進(jìn)入”Slow”線(xiàn)程池,避免耗盡調(diào)度線(xiàn)程,提高系統(tǒng)穩(wěn)定性;

34、用戶(hù)管理:支持在線(xiàn)管理系統(tǒng)用戶(hù),存在管理員、普通用戶(hù)兩種角色;

35、權(quán)限控制:執(zhí)行器維度進(jìn)行權(quán)限控制,管理員擁有全量權(quán)限,普通用戶(hù)需要分配執(zhí)行器權(quán)限后才允許相關(guān)操作;

1.4 下載

文檔地址

源碼倉(cāng)庫(kù)地址

中央倉(cāng)庫(kù)地址

com.xuxueli

xxl-job-core

${最新穩(wěn)定版本}

1.6 環(huán)境

Maven3+

Jdk1.7+

Mysql5.7+

二、快速入門(mén)

2.1 初始化“調(diào)度數(shù)據(jù)庫(kù)”

請(qǐng)下載項(xiàng)目源碼并解壓,獲取 “調(diào)度數(shù)據(jù)庫(kù)初始化SQL腳本” 并執(zhí)行即可。

“調(diào)度數(shù)據(jù)庫(kù)初始化SQL腳本” 位置為:

/xxl-job/doc/db/tables_xxl_job.sql

調(diào)度中心支持集群部署,集群情況下各節(jié)點(diǎn)務(wù)必連接同一個(gè)mysql實(shí)例;

如果mysql做主從,調(diào)度中心集群節(jié)點(diǎn)務(wù)必強(qiáng)制走主庫(kù);

2.2 編譯源碼

解壓源碼,按照maven格式將源碼導(dǎo)入IDE, 使用maven進(jìn)行編譯即可,源碼結(jié)構(gòu)如下:

xxl-job-admin:調(diào)度中心

xxl-job-core:公共依賴(lài)

xxl-job-executor-samples:執(zhí)行器Sample示例(選擇合適的版本執(zhí)行器,可直接使用,也可以參考其并將現(xiàn)有項(xiàng)目改造成執(zhí)行器)

:xxl-job-executor-sample-springboot:Springboot版本,通過(guò)Springboot管理執(zhí)行器,推薦這種方式;

:xxl-job-executor-sample-spring:Spring版本,通過(guò)Spring容器管理執(zhí)行器,比較通用;

:xxl-job-executor-sample-frameless:無(wú)框架版本;

:xxl-job-executor-sample-jfinal:JFinal版本,通過(guò)JFinal管理執(zhí)行器;

:xxl-job-executor-sample-nutz:Nutz版本,通過(guò)Nutz管理執(zhí)行器;

:xxl-job-executor-sample-jboot:jboot版本,通過(guò)jboot管理執(zhí)行器;

2.3 配置部署“調(diào)度中心”

調(diào)度中心項(xiàng)目:xxl-job-admin

作用:統(tǒng)一管理任務(wù)調(diào)度平臺(tái)上調(diào)度任務(wù),負(fù)責(zé)觸發(fā)調(diào)度執(zhí)行,并且提供任務(wù)管理平臺(tái)。

步驟一:調(diào)度中心配置:

調(diào)度中心配置文件地址:

/xxl-job/xxl-job-admin/src/main/resources/application.properties

調(diào)度中心配置內(nèi)容說(shuō)明:

### 調(diào)度中心JDBC鏈接:鏈接地址請(qǐng)保持和 2.1章節(jié) 所創(chuàng)建的調(diào)度數(shù)據(jù)庫(kù)的地址一致

spring.datasource.url=jdbc:mysql://127.0.0.1:3306/xxl_job?Unicode=true&characterEncoding=UTF-8

spring.datasource.username=root

spring.datasource.password=root_pwd

spring.datasource.driver-class-name=com.mysql.jdbc.Driver

### 報(bào)警郵箱

spring.mail.host=smtp.qq.com

spring.mail.port=25

spring.mail.username=xxx@qq.com

spring.mail.password=xxx

spring.mail.properties.mail.smtp.auth=true

spring.mail.properties.mail.smtp.starttls.enable=true

spring.mail.properties.mail.smtp.starttls.required=true

spring.mail.properties.mail.smtp.socketFactory.class=javax.net.ssl.SSLSocketFactory

### 調(diào)度中心通訊TOKEN [選填]:非空時(shí)啟用;

xxl.job.accessToken=

### 調(diào)度中心國(guó)際化配置 [選填]: 默認(rèn)為空,表示中文; "en" 表示英文;

xxl.job.i18n=

## 調(diào)度線(xiàn)程池最大線(xiàn)程配置【必填】

xxl.job.triggerpool.fast.max=200

xxl.job.triggerpool.slow.max=100

### 調(diào)度中心日志表數(shù)據(jù)保存天數(shù) [必填]:過(guò)期日志自動(dòng)清理;限制大于等于7時(shí)生效,否則, 如-1,關(guān)閉自動(dòng)清理功能;

xxl.job.logretentiondays=30

步驟二:部署項(xiàng)目:

如果已經(jīng)正確進(jìn)行上述配置,可將項(xiàng)目編譯打包部署。

默認(rèn)登錄賬號(hào) “admin/123456”, 登錄后運(yùn)行界面如下圖所示。

至此“調(diào)度中心”項(xiàng)目已經(jīng)部署成功。

步驟三:調(diào)度中心集群(可選):

調(diào)度中心支持集群部署,提升調(diào)度系統(tǒng)容災(zāi)和可用性。

調(diào)度中心集群部署時(shí),幾點(diǎn)要求和建議:

DB配置保持一致;

集群機(jī)器時(shí)鐘保持一致(單機(jī)集群忽視);

建議:推薦通過(guò)nginx為調(diào)度中心集群做負(fù)載均衡,分配域名。調(diào)度中心訪(fǎng)問(wèn)、執(zhí)行器回調(diào)配置、調(diào)用API服務(wù)等操作均通過(guò)該域名進(jìn)行。

其他:Docker 鏡像方式搭建調(diào)度中心:

下載鏡像

// Docker地址:https://hub.docker.com/r/xuxueli/xxl-job-admin/ (建議指定版本號(hào))

docker pull xuxueli/xxl-job-admin

創(chuàng)建容器并運(yùn)行

docker run -p 8080:8080-v /tmp:/data/applogs --name xxl-job-admin -d xuxueli/xxl-job-admin

/**

* 如需自定義 mysql 等配置,可通過(guò) "PARAMS" 指定,參數(shù)格式 RAMS="--key=value --key2=value2" ;

* 配置項(xiàng)參考文件:/xxl-job/xxl-job-admin/src/main/resources/application.properties

*/

docker run -e PARAMS="--spring.datasource.url=jdbc:mysql://127.0.0.1:3306/xxl_job?Unicode=true&characterEncoding=UTF-8"-p 8080:8080-v /tmp:/data/applogs --name xxl-job-admin -d xuxueli/xxl-job-admin

2.4 配置部署“執(zhí)行器項(xiàng)目”

“執(zhí)行器”項(xiàng)目:xxl-job-executor-sample-springboot (提供多種版本執(zhí)行器供選擇,現(xiàn)以springboot 版本為例,可直接使用,也可以參考其并將現(xiàn)有項(xiàng)目改造成執(zhí)行器)

作用:負(fù)責(zé)接收“調(diào)度中心”的調(diào)度并執(zhí)行;可直接部署執(zhí)行器,也可以將執(zhí)行器集成到現(xiàn)有業(yè)務(wù)項(xiàng)目中。

步驟一:maven依賴(lài)

確認(rèn)pom文件中引入了 “xxl-job-core” 的maven依賴(lài);

步驟二:執(zhí)行器配置

執(zhí)行器配置,配置文件地址:

/xxl-job/xxl-job-executor-samples/xxl-job-executor-sample-springboot/src/main/resources/application.properties

執(zhí)行器配置,配置內(nèi)容說(shuō)明:

### 調(diào)度中心部署跟地址 [選填]:如調(diào)度中心集群部署存在多個(gè)地址則用逗號(hào)分隔。執(zhí)行器將會(huì)使用該地址進(jìn)行"執(zhí)行器心跳注冊(cè)"和"任務(wù)結(jié)果回調(diào)";為空則關(guān)閉自動(dòng)注冊(cè);

xxl.job.admin.addresses=http://127.0.0.1:8080/xxl-job-admin

### 執(zhí)行器AppName [選填]:執(zhí)行器心跳注冊(cè)分組依據(jù);為空則關(guān)閉自動(dòng)注冊(cè)

xxl.job.executor.appname=xxl-job-executor-sample

### 執(zhí)行器IP [選填]:默認(rèn)為空表示自動(dòng)獲取IP,多網(wǎng)卡時(shí)可手動(dòng)設(shè)置指定IP,該IP不會(huì)綁定Host僅作為通訊實(shí)用;地址信息用于 "執(zhí)行器注冊(cè)" 和 "調(diào)度中心請(qǐng)求并觸發(fā)任務(wù)";

xxl.job.executor.ip=

### 執(zhí)行器端口號(hào) [選填]:小于等于0則自動(dòng)獲取;默認(rèn)端口為9999,單機(jī)部署多個(gè)執(zhí)行器時(shí),注意要配置不同執(zhí)行器端口;

xxl.job.executor.port=9999

### 執(zhí)行器通訊TOKEN [選填]:非空時(shí)啟用;

xxl.job.accessToken=

### 執(zhí)行器運(yùn)行日志文件存儲(chǔ)磁盤(pán)路徑 [選填] :需要對(duì)該路徑擁有讀寫(xiě)權(quán)限;為空則使用默認(rèn)路徑;

xxl.job.executor.logpath=/data/applogs/xxl-job/jobhandler

### 執(zhí)行器日志文件保存天數(shù) [選填] : 過(guò)期日志自動(dòng)清理, 限制值大于等于3時(shí)生效; 否則, 如-1, 關(guān)閉自動(dòng)清理功能;

xxl.job.executor.logretentiondays=30

步驟三:執(zhí)行器組件配置

執(zhí)行器組件,配置文件地址:

/xxl-job/xxl-job-executor-samples/xxl-job-executor-sample-springboot/src/main/java/com/xxl/job/executor/core/config/XxlJobConfig.java

執(zhí)行器組件,配置內(nèi)容說(shuō)明:

@Bean

publicXxlJobSpringExecutorxxlJobExecutor(){

logger.info(">>>>>>>>>>> xxl-job config init.");

XxlJobSpringExecutorxxlJobSpringExecutor =newXxlJobSpringExecutor();

xxlJobSpringExecutor.setAdminAddresses(adminAddresses);

xxlJobSpringExecutor.setAppName(appName);

xxlJobSpringExecutor.setIp(ip);

xxlJobSpringExecutor.setPort(port);

xxlJobSpringExecutor.setAccessToken(accessToken);

xxlJobSpringExecutor.setLogPath(logPath);

xxlJobSpringExecutor.setLogRetentionDays(logRetentionDays);

returnxxlJobSpringExecutor;

}

步驟四:部署執(zhí)行器項(xiàng)目:

如果已經(jīng)正確進(jìn)行上述配置,可將執(zhí)行器項(xiàng)目編譯打部署,系統(tǒng)提供多種執(zhí)行器Sample示例項(xiàng)目,選擇其中一個(gè)即可,各自的部署方式如下。

xxl-job-executor-sample-springboot:項(xiàng)目編譯打包成springboot類(lèi)型的可執(zhí)行JAR包,命令啟動(dòng)即可;

xxl-job-executor-sample-spring:項(xiàng)目編譯打包成WAR包,并部署到tomcat中。

xxl-job-executor-sample-jfinal:同上

xxl-job-executor-sample-nutz:同上

xxl-job-executor-sample-jboot:同上

至此“執(zhí)行器”項(xiàng)目已經(jīng)部署結(jié)束。

步驟五:執(zhí)行器集群(可選):

執(zhí)行器支持集群部署,提升調(diào)度系統(tǒng)可用性,同時(shí)提升任務(wù)處理能力。

執(zhí)行器集群部署時(shí),幾點(diǎn)要求和建議:

執(zhí)行器回調(diào)地址(xxl.job.admin.addresses)需要保持一致;執(zhí)行器根據(jù)該配置進(jìn)行執(zhí)行器自動(dòng)注冊(cè)等操作。

同一個(gè)執(zhí)行器集群內(nèi)AppName(xxl.job.executor.appname)需要保持一致;調(diào)度中心根據(jù)該配置動(dòng)態(tài)發(fā)現(xiàn)不同集群的在線(xiàn)執(zhí)行器列表。

2.5 開(kāi)發(fā)第一個(gè)任務(wù)“Hello World”

本示例以新建一個(gè) “GLUE模式(Java)” 運(yùn)行模式的任務(wù)為例。更多有關(guān)任務(wù)的詳細(xì)配置,請(qǐng)查看“章節(jié)三:任務(wù)詳解”。

( “GLUE模式(Java)”的執(zhí)行代碼托管到調(diào)度中心在線(xiàn)維護(hù),相比“Bean模式任務(wù)”需要在執(zhí)行器項(xiàng)目開(kāi)發(fā)部署上線(xiàn),更加簡(jiǎn)便輕量)

前提:請(qǐng)確認(rèn)“調(diào)度中心”和“執(zhí)行器”項(xiàng)目已經(jīng)成功部署并啟動(dòng);

步驟一:新建任務(wù):

登錄調(diào)度中心,點(diǎn)擊下圖所示“新建任務(wù)”按鈕,新建示例任務(wù)。然后,參考下面截圖中任務(wù)的參數(shù)配置,點(diǎn)擊保存。

步驟二:“GLUE模式(Java)” 任務(wù)開(kāi)發(fā):

請(qǐng)點(diǎn)擊任務(wù)右側(cè) “GLUE” 按鈕,進(jìn)入 “GLUE編輯器開(kāi)發(fā)界面” ,見(jiàn)下圖。“GLUE模式(Java)” 運(yùn)行模式的任務(wù)默認(rèn)已經(jīng)初始化了示例任務(wù)代碼,即打印Hello World。

( “GLUE模式(Java)” 運(yùn)行模式的任務(wù)實(shí)際上是一段繼承自IJobHandler的Java類(lèi)代碼,它在執(zhí)行器項(xiàng)目中運(yùn)行,可使用@Resource/@Autowire注入執(zhí)行器里中的其他服務(wù),詳細(xì)介紹請(qǐng)查看第三章節(jié))

步驟三:觸發(fā)執(zhí)行:

請(qǐng)點(diǎn)擊任務(wù)右側(cè) “執(zhí)行” 按鈕,可手動(dòng)觸發(fā)一次任務(wù)執(zhí)行(通常情況下,通過(guò)配置Cron表達(dá)式進(jìn)行任務(wù)調(diào)度出發(fā))。

步驟四:查看日志:

請(qǐng)點(diǎn)擊任務(wù)右側(cè) “日志” 按鈕,可前往任務(wù)日志界面查看任務(wù)日志。

在任務(wù)日志界面中,可查看該任務(wù)的歷史調(diào)度記錄以及每一次調(diào)度的任務(wù)調(diào)度信息、執(zhí)行參數(shù)和執(zhí)行信息。運(yùn)行中的任務(wù)點(diǎn)擊右側(cè)的“執(zhí)行日志”按鈕,可進(jìn)入日志控制臺(tái)查看實(shí)時(shí)執(zhí)行日志。

在日志控制臺(tái),可以Rolling方式實(shí)時(shí)查看任務(wù)在執(zhí)行器一側(cè)運(yùn)行輸出的日志信息,實(shí)時(shí)監(jiān)控任務(wù)進(jìn)度;

三、任務(wù)詳解

配置屬性詳細(xì)說(shuō)明:

-執(zhí)行器:任務(wù)的綁定的執(zhí)行器,任務(wù)觸發(fā)調(diào)度時(shí)將會(huì)自動(dòng)發(fā)現(xiàn)注冊(cè)成功的執(zhí)行器,實(shí)現(xiàn)任務(wù)自動(dòng)發(fā)現(xiàn)功能;另一方面也可以方便的進(jìn)行任務(wù)分組。每個(gè)任務(wù)必須綁定一個(gè)執(zhí)行器,可在"執(zhí)行器管理"進(jìn)行設(shè)置;

-任務(wù)描述:任務(wù)的描述信息,便于任務(wù)管理;

-路由策略:當(dāng)執(zhí)行器集群部署時(shí),提供豐富的路由策略,包括;

FIRST(第一個(gè)):固定選擇第一個(gè)機(jī)器;

LAST(最后一個(gè)):固定選擇最后一個(gè)機(jī)器;

ROUND(輪詢(xún)):;

RANDOM(隨機(jī)):隨機(jī)選擇在線(xiàn)的機(jī)器;

CONSISTENT_HASH(一致性HASH):每個(gè)任務(wù)按照Hash算法固定選擇某一臺(tái)機(jī)器,且所有任務(wù)均勻散列在不同機(jī)器上。

LEAST_FREQUENTLY_USED(最不經(jīng)常使用):使用頻率最低的機(jī)器優(yōu)先被選舉;

LEAST_RECENTLY_USED(最近最久未使用):最久為使用的機(jī)器優(yōu)先被選舉;

FAILOVER(故障轉(zhuǎn)移):按照順序依次進(jìn)行心跳檢測(cè),第一個(gè)心跳檢測(cè)成功的機(jī)器選定為目標(biāo)執(zhí)行器并發(fā)起調(diào)度;

BUSYOVER(忙碌轉(zhuǎn)移):按照順序依次進(jìn)行空閑檢測(cè),第一個(gè)空閑檢測(cè)成功的機(jī)器選定為目標(biāo)執(zhí)行器并發(fā)起調(diào)度;

SHARDING_BROADCAST(分片廣播):廣播觸發(fā)對(duì)應(yīng)集群中所有機(jī)器執(zhí)行一次任務(wù),同時(shí)系統(tǒng)自動(dòng)傳遞分片參數(shù);可根據(jù)分片參數(shù)開(kāi)發(fā)分片任務(wù);

-Cron:觸發(fā)任務(wù)執(zhí)行的Cron表達(dá)式;

-運(yùn)行模式:

BEAN模式:任務(wù)以JobHandler方式維護(hù)在執(zhí)行器端;需要結(jié)合"JobHandler"屬性匹配執(zhí)行器中任務(wù);

GLUE模式(Java):任務(wù)以源碼方式維護(hù)在調(diào)度中心;該模式的任務(wù)實(shí)際上是一段繼承自IJobHandler的Java類(lèi)代碼并"groovy"源碼方式維護(hù),它在執(zhí)行器項(xiàng)目中運(yùn)行,可使用@Resource/@Autowire注入執(zhí)行器里中的其他服務(wù);

GLUE模式(Shell):任務(wù)以源碼方式維護(hù)在調(diào)度中心;該模式的任務(wù)實(shí)際上是一段"shell"腳本;

GLUE模式(Python):任務(wù)以源碼方式維護(hù)在調(diào)度中心;該模式的任務(wù)實(shí)際上是一段"python"腳本;

GLUE模式(PHP):任務(wù)以源碼方式維護(hù)在調(diào)度中心;該模式的任務(wù)實(shí)際上是一段"php"腳本;

GLUE模式(NodeJS):任務(wù)以源碼方式維護(hù)在調(diào)度中心;該模式的任務(wù)實(shí)際上是一段"nodejs"腳本;

GLUE模式(PowerShell):任務(wù)以源碼方式維護(hù)在調(diào)度中心;該模式的任務(wù)實(shí)際上是一段"PowerShell"腳本;

-JobHandler:運(yùn)行模式為"BEAN模式"時(shí)生效,對(duì)應(yīng)執(zhí)行器中新開(kāi)發(fā)的JobHandler類(lèi)“@JobHandler”注解自定義的value值;

-阻塞處理策略:調(diào)度過(guò)于密集執(zhí)行器來(lái)不及處理時(shí)的處理策略;

單機(jī)串行(默認(rèn)):調(diào)度請(qǐng)求進(jìn)入單機(jī)執(zhí)行器后,調(diào)度請(qǐng)求進(jìn)入FIFO隊(duì)列并以串行方式運(yùn)行;

丟棄后續(xù)調(diào)度:調(diào)度請(qǐng)求進(jìn)入單機(jī)執(zhí)行器后,發(fā)現(xiàn)執(zhí)行器存在運(yùn)行的調(diào)度任務(wù),本次請(qǐng)求將會(huì)被丟棄并標(biāo)記為失敗;

覆蓋之前調(diào)度:調(diào)度請(qǐng)求進(jìn)入單機(jī)執(zhí)行器后,發(fā)現(xiàn)執(zhí)行器存在運(yùn)行的調(diào)度任務(wù),將會(huì)終止運(yùn)行中的調(diào)度任務(wù)并清空隊(duì)列,然后運(yùn)行本地調(diào)度任務(wù);

-子任務(wù):每個(gè)任務(wù)都擁有一個(gè)唯一的任務(wù)ID(任務(wù)ID可以從任務(wù)列表獲取),當(dāng)本任務(wù)執(zhí)行結(jié)束并且執(zhí)行成功時(shí),將會(huì)觸發(fā)子任務(wù)ID所對(duì)應(yīng)的任務(wù)的一次主動(dòng)調(diào)度。

-任務(wù)超時(shí)時(shí)間:支持自定義任務(wù)超時(shí)時(shí)間,任務(wù)運(yùn)行超時(shí)將會(huì)主動(dòng)中斷任務(wù);

-失敗重試次數(shù);支持自定義任務(wù)失敗重試次數(shù),當(dāng)任務(wù)失敗時(shí)將會(huì)按照預(yù)設(shè)的失敗重試次數(shù)主動(dòng)進(jìn)行重試;

-報(bào)警郵件:任務(wù)調(diào)度失敗時(shí)郵件通知的郵箱地址,支持配置多郵箱地址,配置多個(gè)郵箱地址時(shí)用逗號(hào)分隔;

-負(fù)責(zé)人:任務(wù)的負(fù)責(zé)人;

-執(zhí)行參數(shù):任務(wù)執(zhí)行所需的參數(shù);

3.1 BEAN模式(類(lèi)形式)

Bean模式任務(wù),支持基于類(lèi)的開(kāi)發(fā)方式,每個(gè)任務(wù)對(duì)應(yīng)一個(gè)Java類(lèi)。

優(yōu)點(diǎn):不限制項(xiàng)目環(huán)境,兼容性好。即使是無(wú)框架項(xiàng)目,如main方法直接啟動(dòng)的項(xiàng)目也可以提供支持,可以參考示例項(xiàng)目 “xxl-job-executor-sample-frameless”;

缺點(diǎn):

每個(gè)任務(wù)需要占用一個(gè)Java類(lèi),造成類(lèi)的浪費(fèi);

不支持自動(dòng)掃描任務(wù)并注入到執(zhí)行器容器,需要手動(dòng)注入。

步驟一:執(zhí)行器項(xiàng)目中,開(kāi)發(fā)Job類(lèi):

1、開(kāi)發(fā)一個(gè)繼承自"com.xxl.job.core.handler.IJobHandler"的JobHandler類(lèi),實(shí)現(xiàn)其中任務(wù)方法。

2、手動(dòng)通過(guò)如下方式注入到執(zhí)行器容器。

```

XxlJobExecutor.registJobHandler("demoJobHandler", new DemoJobHandler());

```

步驟二:調(diào)度中心,新建調(diào)度任務(wù)

后續(xù)步驟和 “3.2 BEAN模式(方法形式)”一致,可以前往參考。

3.2 BEAN模式(方法形式)

Bean模式任務(wù),支持基于方法的開(kāi)發(fā)方式,每個(gè)任務(wù)對(duì)應(yīng)一個(gè)方法。

優(yōu)點(diǎn):缺點(diǎn):要求Spring容器環(huán)境;

每個(gè)任務(wù)只需要開(kāi)發(fā)一個(gè)方法,并添加”@XxlJob”注解即可,更加方便、快速。

支持自動(dòng)掃描任務(wù)并注入到執(zhí)行器容器。

基于方法開(kāi)發(fā)的任務(wù),底層會(huì)生成JobHandler代理,和基于類(lèi)的方式一樣,任務(wù)也會(huì)以JobHandler的形式存在于執(zhí)行器任務(wù)容器中。

步驟一:執(zhí)行器項(xiàng)目中,開(kāi)發(fā)Job方法:

1、在SpringBean實(shí)例中,開(kāi)發(fā)Job方法,方式格式要求為"public ReturnT execute(String param)"

2、為Job方法添加注解"@XxlJob(value="自定義jobhandler名稱(chēng)", init = "JobHandler初始化方法", destroy = "JobHandler銷(xiāo)毀方法")",注解value值對(duì)應(yīng)的是調(diào)度中心新建任務(wù)的JobHandler屬性的值。

3、執(zhí)行日志:需要通過(guò)"XxlJobLogger.log"打印執(zhí)行日志;// 可參考Sample示例執(zhí)行器中的 "com.xxl.job.executor.service.jobhandler.SampleXxlJob" ,如下:

@XxlJob("demoJobHandler")

publicReturnTexecute(Stringparam){

XxlJobLogger.log("hello world.");

returnReturnT.SUCCESS;

}

步驟二:調(diào)度中心,新建調(diào)度任務(wù)

參考上文“配置屬性詳細(xì)說(shuō)明”對(duì)新建的任務(wù)進(jìn)行參數(shù)配置,運(yùn)行模式選中 “BEAN模式”,JobHandler屬性填寫(xiě)任務(wù)注解“@XxlJob”中定義的值;

原生內(nèi)置Bean模式任務(wù)

為方便用戶(hù)參考與快速實(shí)用,示例執(zhí)行器內(nèi)原生提供多個(gè)Bean模式任務(wù)Handler,可以直接配置實(shí)用,如下:

demoJobHandler:簡(jiǎn)單示例任務(wù),任務(wù)內(nèi)部模擬耗時(shí)任務(wù)邏輯,用戶(hù)可在線(xiàn)體驗(yàn)Rolling Log等功能;

shardingJobHandler:分片示例任務(wù),任務(wù)內(nèi)部模擬處理分片參數(shù),可參考熟悉分片任務(wù);

httpJobHandler:通用HTTP任務(wù)Handler;業(yè)務(wù)方只需要提供HTTP鏈接即可,不限制語(yǔ)言、平臺(tái);

commandJobHandler:通用命令行任務(wù)Handler;業(yè)務(wù)方只需要提供命令行即可;如 “pwd”命令;

3.3 GLUE模式(Java)

任務(wù)以源碼方式維護(hù)在調(diào)度中心,支持通過(guò)Web IDE在線(xiàn)更新,實(shí)時(shí)編譯和生效,因此不需要指定JobHandler。開(kāi)發(fā)流程如下:

步驟一:調(diào)度中心,新建調(diào)度任務(wù):

參考上文“配置屬性詳細(xì)說(shuō)明”對(duì)新建的任務(wù)進(jìn)行參數(shù)配置,運(yùn)行模式選中 “GLUE模式(Java)”;

步驟二:開(kāi)發(fā)任務(wù)代碼:

選中指定任務(wù),點(diǎn)擊該任務(wù)右側(cè)“GLUE”按鈕,將會(huì)前往GLUE任務(wù)的Web IDE界面,在該界面支持對(duì)任務(wù)代碼進(jìn)行開(kāi)發(fā)(也可以在IDE中開(kāi)發(fā)完成后,復(fù)制粘貼到編輯中)。

版本回溯功能(支持30個(gè)版本的版本回溯):在GLUE任務(wù)的Web IDE界面,選擇右上角下拉框“版本回溯”,會(huì)列出該GLUE的更新歷史,選擇相應(yīng)版本即可顯示該版本代碼,保存后GLUE代碼即回退到對(duì)應(yīng)的歷史版本;

3.4 GLUE模式(Shell)

步驟一:調(diào)度中心,新建調(diào)度任務(wù)

參考上文“配置屬性詳細(xì)說(shuō)明”對(duì)新建的任務(wù)進(jìn)行參數(shù)配置,運(yùn)行模式選中 “GLUE模式(Shell)”;

步驟二:開(kāi)發(fā)任務(wù)代碼:

選中指定任務(wù),點(diǎn)擊該任務(wù)右側(cè)“GLUE”按鈕,將會(huì)前往GLUE任務(wù)的Web IDE界面,在該界面支持對(duì)任務(wù)代碼進(jìn)行開(kāi)發(fā)(也可以在IDE中開(kāi)發(fā)完成后,復(fù)制粘貼到編輯中)。

該模式的任務(wù)實(shí)際上是一段 “shell” 腳本;

3.4 GLUE模式(Python)

步驟一:調(diào)度中心,新建調(diào)度任務(wù)

參考上文“配置屬性詳細(xì)說(shuō)明”對(duì)新建的任務(wù)進(jìn)行參數(shù)配置,運(yùn)行模式選中 “GLUE模式(Python)”;

步驟二:開(kāi)發(fā)任務(wù)代碼:

選中指定任務(wù),點(diǎn)擊該任務(wù)右側(cè)“GLUE”按鈕,將會(huì)前往GLUE任務(wù)的Web IDE界面,在該界面支持對(duì)任務(wù)代碼進(jìn)行開(kāi)發(fā)(也可以在IDE中開(kāi)發(fā)完成后,復(fù)制粘貼到編輯中)。

該模式的任務(wù)實(shí)際上是一段 “python” 腳本;

3.5 GLUE模式(NodeJS)

步驟一:調(diào)度中心,新建調(diào)度任務(wù)

參考上文“配置屬性詳細(xì)說(shuō)明”對(duì)新建的任務(wù)進(jìn)行參數(shù)配置,運(yùn)行模式選中 “GLUE模式(NodeJS)”;

步驟二:開(kāi)發(fā)任務(wù)代碼:

選中指定任務(wù),點(diǎn)擊該任務(wù)右側(cè)“GLUE”按鈕,將會(huì)前往GLUE任務(wù)的Web IDE界面,在該界面支持對(duì)任務(wù)代碼進(jìn)行開(kāi)發(fā)(也可以在IDE中開(kāi)發(fā)完成后,復(fù)制粘貼到編輯中)。

該模式的任務(wù)實(shí)際上是一段 “nodeJS” 腳本;

3.6 GLUE模式(PHP)

同上

3.7 GLUE模式(PowerShell)

同上

四、操作指南

4.1 配置執(zhí)行器

點(diǎn)擊進(jìn)入”執(zhí)行器管理”界面, 如下圖:

1、"調(diào)度中心OnLine:"右側(cè)顯示在線(xiàn)的"調(diào)度中心"列表,任務(wù)執(zhí)行結(jié)束后,將會(huì)以failover的模式進(jìn)行回調(diào)調(diào)度中心通知執(zhí)行結(jié)果,避免回調(diào)的單點(diǎn)風(fēng)險(xiǎn);

2、"執(zhí)行器列表"中顯示在線(xiàn)的執(zhí)行器列表,可通過(guò)"OnLine 機(jī)器"查看對(duì)應(yīng)執(zhí)行器的集群機(jī)器。

點(diǎn)擊按鈕 “+新增執(zhí)行器” 彈框如下圖, 可新增執(zhí)行器配置:

執(zhí)行器屬性說(shuō)明

AppName:是每個(gè)執(zhí)行器集群的唯一標(biāo)示AppName,執(zhí)行器會(huì)周期性以AppName為對(duì)象進(jìn)行自動(dòng)注冊(cè)。可通過(guò)該配置自動(dòng)發(fā)現(xiàn)注冊(cè)成功的執(zhí)行器,供任務(wù)調(diào)度時(shí)使用;

名稱(chēng):執(zhí)行器的名稱(chēng),因?yàn)锳ppName限制字母數(shù)字等組成,可讀性不強(qiáng),名稱(chēng)為了提高執(zhí)行器的可讀性;

排序:執(zhí)行器的排序,系統(tǒng)中需要執(zhí)行器的地方,如任務(wù)新增,將會(huì)按照該排序讀取可用的執(zhí)行器列表;

注冊(cè)方式:調(diào)度中心獲取執(zhí)行器地址的方式;

自動(dòng)注冊(cè):執(zhí)行器自動(dòng)進(jìn)行執(zhí)行器注冊(cè),調(diào)度中心通過(guò)底層注冊(cè)表可以動(dòng)態(tài)發(fā)現(xiàn)執(zhí)行器機(jī)器地址;

手動(dòng)錄入:人工手動(dòng)錄入執(zhí)行器的地址信息,多地址逗號(hào)分隔,供調(diào)度中心使用;

機(jī)器地址:"注冊(cè)方式"為"手動(dòng)錄入"時(shí)有效,支持人工維護(hù)執(zhí)行器的地址信息;

4.2 新建任務(wù)

進(jìn)入任務(wù)管理界面,點(diǎn)擊“新增任務(wù)”按鈕,在彈出的“新增任務(wù)”界面配置任務(wù)屬性后保存即可。詳情頁(yè)參考章節(jié) “三、任務(wù)詳解”。

4.3 編輯任務(wù)

進(jìn)入任務(wù)管理界面,選中指定任務(wù)。點(diǎn)擊該任務(wù)右側(cè)“編輯”按鈕,在彈出的“編輯任務(wù)”界面更新任務(wù)屬性后保存即可,可以修改設(shè)置的任務(wù)屬性信息:

4.4 編輯GLUE代碼

該操作僅針對(duì)GLUE任務(wù)。

選中指定任務(wù),點(diǎn)擊該任務(wù)右側(cè)“GLUE”按鈕,將會(huì)前往GLUE任務(wù)的Web IDE界面,在該界面支持對(duì)任務(wù)代碼進(jìn)行開(kāi)發(fā)。可參考章節(jié) “3.3 GLUE模式(Java)”。

4.5 啟動(dòng)/停止任務(wù)

可對(duì)任務(wù)進(jìn)行“啟動(dòng)”和“停止”操作。

需要注意的是,此處的啟動(dòng)/停止僅針對(duì)任務(wù)的后續(xù)調(diào)度觸發(fā)行為,不會(huì)影響到已經(jīng)觸發(fā)的調(diào)度任務(wù),如需終止已經(jīng)觸發(fā)的調(diào)度任務(wù),可查看“4.9 終止運(yùn)行中的任務(wù)”

4.6 手動(dòng)觸發(fā)一次調(diào)度

點(diǎn)擊“執(zhí)行”按鈕,可手動(dòng)觸發(fā)一次任務(wù)調(diào)度,不影響原有調(diào)度規(guī)則。

4.7 查看調(diào)度日志

點(diǎn)擊“日志”按鈕,可以查看任務(wù)歷史調(diào)度日志。在歷史調(diào)入日志界面可查看每次任務(wù)調(diào)度的調(diào)度結(jié)果、執(zhí)行結(jié)果等,點(diǎn)擊“執(zhí)行日志”按鈕可查看執(zhí)行器完整日志。

調(diào)度時(shí)間:"調(diào)度中心"觸發(fā)本次調(diào)度并向"執(zhí)行器"發(fā)送任務(wù)執(zhí)行信號(hào)的時(shí)間;

調(diào)度結(jié)果:"調(diào)度中心"觸發(fā)本次調(diào)度的結(jié)果,200表示成功,500或其他表示失敗;

調(diào)度備注:"調(diào)度中心"觸發(fā)本次調(diào)度的日志信息;

執(zhí)行器地址:本次任務(wù)執(zhí)行的機(jī)器地址

運(yùn)行模式:觸發(fā)調(diào)度時(shí)任務(wù)的運(yùn)行模式,運(yùn)行模式可參考章節(jié)"三、任務(wù)詳解";

任務(wù)參數(shù):本地任務(wù)執(zhí)行的入?yún)?/p>

執(zhí)行時(shí)間:"執(zhí)行器"中本次任務(wù)執(zhí)行結(jié)束后回調(diào)的時(shí)間;

執(zhí)行結(jié)果:"執(zhí)行器"中本次任務(wù)執(zhí)行的結(jié)果,200表示成功,500或其他表示失敗;

執(zhí)行備注:"執(zhí)行器"中本次任務(wù)執(zhí)行的日志信息;

操作:

"執(zhí)行日志"按鈕:點(diǎn)擊可查看本地任務(wù)執(zhí)行的詳細(xì)日志信息;詳見(jiàn)“4.8查看執(zhí)行日志”;

"終止任務(wù)"按鈕:點(diǎn)擊可終止本地調(diào)度對(duì)應(yīng)執(zhí)行器上本任務(wù)的執(zhí)行線(xiàn)程,包括未執(zhí)行的阻塞任務(wù)一并被終止;

4.8 查看執(zhí)行日志

點(diǎn)擊執(zhí)行日志右側(cè)的 “執(zhí)行日志” 按鈕,可跳轉(zhuǎn)至執(zhí)行日志界面,可以查看業(yè)務(wù)代碼中打印的完整日志,如下圖;

4.9 終止運(yùn)行中的任務(wù)

僅針對(duì)執(zhí)行中的任務(wù)。

在任務(wù)日志界面,點(diǎn)擊右側(cè)的“終止任務(wù)”按鈕,將會(huì)向本次任務(wù)對(duì)應(yīng)的執(zhí)行器發(fā)送任務(wù)終止請(qǐng)求,將會(huì)終止掉本次任務(wù),同時(shí)會(huì)清空掉整個(gè)任務(wù)執(zhí)行隊(duì)列。

任務(wù)終止時(shí)通過(guò) “interrupt” 執(zhí)行線(xiàn)程的方式實(shí)現(xiàn), 將會(huì)觸發(fā) “InterruptedException” 異常。因此如果JobHandler內(nèi)部catch到了該異常并消化掉的話(huà), 任務(wù)終止功能將不可用。

因此, 如果遇到上述任務(wù)終止不可用的情況, 需要在JobHandler中應(yīng)該針對(duì) “InterruptedException” 異常進(jìn)行特殊處理 (向上拋出) , 正確邏輯如下:

try{

// do something

}catch(Exceptione){

if(e instanceofInterruptedException){

throwe;

}

logger.warn("{}",e);

}

而且,在JobHandler中開(kāi)啟子線(xiàn)程時(shí),子線(xiàn)程也不可catch處理”InterruptedException”,應(yīng)該主動(dòng)向上拋出。

任務(wù)終止時(shí)會(huì)執(zhí)行對(duì)應(yīng)JobHandler的”destroy()”方法,可以借助該方法處理一些資源回收的邏輯。

4.10 刪除執(zhí)行日志

在任務(wù)日志界面,選中執(zhí)行器和任務(wù)之后,點(diǎn)擊右側(cè)的”刪除”按鈕將會(huì)出現(xiàn)”日志清理”彈框,彈框中支持選擇不同類(lèi)型的日志清理策略,選中后點(diǎn)擊”確定”按鈕即可進(jìn)行日志清理操作;

4.11 刪除任務(wù)

點(diǎn)擊刪除按鈕,可以刪除對(duì)應(yīng)任務(wù)。

4.12 用戶(hù)管理

進(jìn)入 “用戶(hù)管理” 界面,可查看和管理用戶(hù)信息;

目前用戶(hù)分為兩種角色:

管理員:擁有全量權(quán)限,支持在線(xiàn)管理用戶(hù)信息,為用戶(hù)分配權(quán)限,權(quán)限分配粒度為執(zhí)行器;

普通用戶(hù):僅擁有被分配權(quán)限的執(zhí)行器,及相關(guān)任務(wù)的操作權(quán)限;

五、總體設(shè)計(jì)

5.1 源碼目錄介紹

-/doc :文檔資料

-/db :“調(diào)度數(shù)據(jù)庫(kù)”建表腳本

-/xxl-job-admin :調(diào)度中心,項(xiàng)目源碼

-/xxl-job-core :公共Jar依賴(lài)

-/xxl-job-executor-samples :執(zhí)行器,Sample示例項(xiàng)目(大家可以在該項(xiàng)目上進(jìn)行開(kāi)發(fā),也可以將現(xiàn)有項(xiàng)目改造生成執(zhí)行器項(xiàng)目)

5.2 “調(diào)度數(shù)據(jù)庫(kù)”配置

XXL-JOB調(diào)度模塊基于自研調(diào)度組件并支持集群部署,調(diào)度數(shù)據(jù)庫(kù)表說(shuō)明如下:

-xxl_job_lock:任務(wù)調(diào)度鎖表;

-xxl_job_group:執(zhí)行器信息表,維護(hù)任務(wù)執(zhí)行器信息;

-xxl_job_info:調(diào)度擴(kuò)展信息表:用于保存XXL-JOB調(diào)度任務(wù)的擴(kuò)展信息,如任務(wù)分組、任務(wù)名、機(jī)器地址、執(zhí)行器、執(zhí)行入?yún)⒑蛨?bào)警郵件等等;

-xxl_job_log:調(diào)度日志表:用于保存XXL-JOB任務(wù)調(diào)度的歷史信息,如調(diào)度結(jié)果、執(zhí)行結(jié)果、調(diào)度入?yún)ⅰ⒄{(diào)度機(jī)器和執(zhí)行器等等;

-xxl_job_log_report:調(diào)度日志報(bào)表:用戶(hù)存儲(chǔ)XXL-JOB任務(wù)調(diào)度日志的報(bào)表,調(diào)度中心報(bào)表功能頁(yè)面會(huì)用到;

-xxl_job_logglue:任務(wù)GLUE日志:用于保存GLUE更新歷史,用于支持GLUE的版本回溯功能;

-xxl_job_registry:執(zhí)行器注冊(cè)表,維護(hù)在線(xiàn)的執(zhí)行器和調(diào)度中心機(jī)器地址信息;

-xxl_job_user:系統(tǒng)用戶(hù)表;

5.3 架構(gòu)設(shè)計(jì)

5.3.1 設(shè)計(jì)思想

將調(diào)度行為抽象形成“調(diào)度中心”公共平臺(tái),而平臺(tái)自身并不承擔(dān)業(yè)務(wù)邏輯,“調(diào)度中心”負(fù)責(zé)發(fā)起調(diào)度請(qǐng)求。

將任務(wù)抽象成分散的JobHandler,交由“執(zhí)行器”統(tǒng)一管理,“執(zhí)行器”負(fù)責(zé)接收調(diào)度請(qǐng)求并執(zhí)行對(duì)應(yīng)的JobHandler中業(yè)務(wù)邏輯。

因此,“調(diào)度”和“任務(wù)”兩部分可以相互解耦,提高系統(tǒng)整體穩(wěn)定性和擴(kuò)展性;

5.3.2 系統(tǒng)組成

調(diào)度模塊(調(diào)度中心):

負(fù)責(zé)管理調(diào)度信息,按照調(diào)度配置發(fā)出調(diào)度請(qǐng)求,自身不承擔(dān)業(yè)務(wù)代碼。調(diào)度系統(tǒng)與任務(wù)解耦,提高了系統(tǒng)可用性和穩(wěn)定性,同時(shí)調(diào)度系統(tǒng)性能不再受限于任務(wù)模塊;

支持可視化、簡(jiǎn)單且動(dòng)態(tài)的管理調(diào)度信息,包括任務(wù)新建,更新,刪除,GLUE開(kāi)發(fā)和任務(wù)報(bào)警等,所有上述操作都會(huì)實(shí)時(shí)生效,同時(shí)支持監(jiān)控調(diào)度結(jié)果以及執(zhí)行日志,支持執(zhí)行器Failover。

執(zhí)行模塊(執(zhí)行器):

負(fù)責(zé)接收調(diào)度請(qǐng)求并執(zhí)行任務(wù)邏輯。任務(wù)模塊專(zhuān)注于任務(wù)的執(zhí)行等操作,開(kāi)發(fā)和維護(hù)更加簡(jiǎn)單和高效;

接收“調(diào)度中心”的執(zhí)行請(qǐng)求、終止請(qǐng)求和日志請(qǐng)求等。

5.3.3 架構(gòu)圖

5.4 調(diào)度模塊剖析

5.4.1 quartz的不足

Quartz作為開(kāi)源作業(yè)調(diào)度中的佼佼者,是作業(yè)調(diào)度的首選。但是集群環(huán)境中Quartz采用API的方式對(duì)任務(wù)進(jìn)行管理,從而可以避免上述問(wèn)題,但是同樣存在以下問(wèn)題:

問(wèn)題一:調(diào)用API的的方式操作任務(wù),不人性化;

問(wèn)題二:需要持久化業(yè)務(wù)QuartzJobBean到底層數(shù)據(jù)表中,系統(tǒng)侵入性相當(dāng)嚴(yán)重。

問(wèn)題三:調(diào)度邏輯和QuartzJobBean耦合在同一個(gè)項(xiàng)目中,這將導(dǎo)致一個(gè)問(wèn)題,在調(diào)度任務(wù)數(shù)量逐漸增多,同時(shí)調(diào)度任務(wù)邏輯逐漸加重的情況下,此時(shí)調(diào)度系統(tǒng)的性能將大大受限于業(yè)務(wù);

問(wèn)題四:quartz底層以“搶占式”獲取DB鎖并由搶占成功節(jié)點(diǎn)負(fù)責(zé)運(yùn)行任務(wù),會(huì)導(dǎo)致節(jié)點(diǎn)負(fù)載懸殊非常大;而XXL-JOB通過(guò)執(zhí)行器實(shí)現(xiàn)“協(xié)同分配式”運(yùn)行任務(wù),充分發(fā)揮集群優(yōu)勢(shì),負(fù)載各節(jié)點(diǎn)均衡。

XXL-JOB彌補(bǔ)了quartz的上述不足之處。

5.4.2 自研調(diào)度模塊

XXL-JOB最終選擇自研調(diào)度組件(早期調(diào)度組件基于Quartz);一方面是為了精簡(jiǎn)系統(tǒng)降低冗余依賴(lài),另一方面是為了提供系統(tǒng)的可控度與穩(wěn)定性;

XXL-JOB中“調(diào)度模塊”和“任務(wù)模塊”完全解耦,調(diào)度模塊進(jìn)行任務(wù)調(diào)度時(shí),將會(huì)解析不同的任務(wù)參數(shù)發(fā)起遠(yuǎn)程調(diào)用,調(diào)用各自的遠(yuǎn)程執(zhí)行器服務(wù)。這種調(diào)用模型類(lèi)似RPC調(diào)用,調(diào)度中心提供調(diào)用代理的功能,而執(zhí)行器提供遠(yuǎn)程服務(wù)的功能。

5.4.3 調(diào)度中心HA(集群)

基于數(shù)據(jù)庫(kù)的集群方案,數(shù)據(jù)庫(kù)選用Mysql;集群分布式并發(fā)環(huán)境中進(jìn)行定時(shí)任務(wù)調(diào)度時(shí),會(huì)在各個(gè)節(jié)點(diǎn)會(huì)上報(bào)任務(wù),存到數(shù)據(jù)庫(kù)中,執(zhí)行時(shí)會(huì)從數(shù)據(jù)庫(kù)中取出觸發(fā)器來(lái)執(zhí)行,如果觸發(fā)器的名稱(chēng)和執(zhí)行時(shí)間相同,則只有一個(gè)節(jié)點(diǎn)去執(zhí)行此任務(wù)。

5.4.4 調(diào)度線(xiàn)程池

調(diào)度采用線(xiàn)程池方式實(shí)現(xiàn),避免單線(xiàn)程因阻塞而引起任務(wù)調(diào)度延遲。

5.4.5 并行調(diào)度

XXL-JOB調(diào)度模塊默認(rèn)采用并行機(jī)制,在多線(xiàn)程調(diào)度的情況下,調(diào)度模塊被阻塞的幾率很低,大大提高了調(diào)度系統(tǒng)的承載量。

XXL-JOB的每個(gè)調(diào)度任務(wù)雖然在調(diào)度模塊是并行調(diào)度執(zhí)行的,但是任務(wù)調(diào)度傳遞到任務(wù)模塊的“執(zhí)行器”確實(shí)串行執(zhí)行的,同時(shí)支持任務(wù)終止。

5.4.6 過(guò)期處理策略

任務(wù)調(diào)度錯(cuò)過(guò)觸發(fā)時(shí)間時(shí)的處理策略:

可能原因:服務(wù)重啟;調(diào)度線(xiàn)程被阻塞,線(xiàn)程被耗盡;上次調(diào)度持續(xù)阻塞,下次調(diào)度被錯(cuò)過(guò);

處理策略:

過(guò)期超5s:本次忽略,當(dāng)前時(shí)間開(kāi)始計(jì)算下次觸發(fā)時(shí)間

過(guò)期5s內(nèi):立即觸發(fā)一次,當(dāng)前時(shí)間開(kāi)始計(jì)算下次觸發(fā)時(shí)間

5.4.7 日志回調(diào)服務(wù)

調(diào)度模塊的“調(diào)度中心”作為Web服務(wù)部署時(shí),一方面承擔(dān)調(diào)度中心功能,另一方面也為執(zhí)行器提供API服務(wù)。

調(diào)度中心提供的”日志回調(diào)服務(wù)API服務(wù)”代碼位置如下:

xxl-job-admin#com.xxl.job.admin.controller.JobApiController.callback

“執(zhí)行器”在接收到任務(wù)執(zhí)行請(qǐng)求后,執(zhí)行任務(wù),在執(zhí)行結(jié)束之后會(huì)將執(zhí)行結(jié)果回調(diào)通知“調(diào)度中心”:

5.4.8 任務(wù)HA(Failover)

執(zhí)行器如若集群部署,調(diào)度中心將會(huì)感知到在線(xiàn)的所有執(zhí)行器,如“127.0.0.1:9997, 127.0.0.1:9998, 127.0.0.1:9999”。

當(dāng)任務(wù)”路由策略”選擇”故障轉(zhuǎn)移(FAILOVER)”時(shí),當(dāng)調(diào)度中心每次發(fā)起調(diào)度請(qǐng)求時(shí),會(huì)按照順序?qū)?zhí)行器發(fā)出心跳檢測(cè)請(qǐng)求,第一個(gè)檢測(cè)為存活狀態(tài)的執(zhí)行器將會(huì)被選定并發(fā)送調(diào)度請(qǐng)求。

調(diào)度成功后,可在日志監(jiān)控界面查看“調(diào)度備注”,如下;

“調(diào)度備注”可以看出本地調(diào)度運(yùn)行軌跡,執(zhí)行器的”注冊(cè)方式”、”地址列表”和任務(wù)的”路由策略”。”故障轉(zhuǎn)移(FAILOVER)”路由策略下,調(diào)度中心首先對(duì)第一個(gè)地址進(jìn)行心跳檢測(cè),心跳失敗因此自動(dòng)跳過(guò),第二個(gè)依然心跳檢測(cè)失敗……

直至心跳檢測(cè)第三個(gè)地址“127.0.0.1:9999”成功,選定為“目標(biāo)執(zhí)行器”;然后對(duì)“目標(biāo)執(zhí)行器”發(fā)送調(diào)度請(qǐng)求,調(diào)度流程結(jié)束,等待執(zhí)行器回調(diào)執(zhí)行結(jié)果。

5.4.9 調(diào)度日志

調(diào)度中心每次進(jìn)行任務(wù)調(diào)度,都會(huì)記錄一條任務(wù)日志,任務(wù)日志主要包括以下三部分內(nèi)容:

任務(wù)信息:包括“執(zhí)行器地址”、“JobHandler”和“執(zhí)行參數(shù)”等屬性,點(diǎn)擊任務(wù)ID按鈕可查看,根據(jù)這些參數(shù),可以精確的定位任務(wù)執(zhí)行的具體機(jī)器和任務(wù)代碼;

調(diào)度信息:包括“調(diào)度時(shí)間”、“調(diào)度結(jié)果”和“調(diào)度日志”等,根據(jù)這些參數(shù),可以了解“調(diào)度中心”發(fā)起調(diào)度請(qǐng)求時(shí)具體情況。

執(zhí)行信息:包括“執(zhí)行時(shí)間”、“執(zhí)行結(jié)果”和“執(zhí)行日志”等,根據(jù)這些參數(shù),可以了解在“執(zhí)行器”端任務(wù)執(zhí)行的具體情況;

調(diào)度日志,針對(duì)單次調(diào)度,屬性說(shuō)明如下:

執(zhí)行器地址:任務(wù)執(zhí)行的機(jī)器地址;

JobHandler:Bean模式表示任務(wù)執(zhí)行的JobHandler名稱(chēng);

任務(wù)參數(shù):任務(wù)執(zhí)行的入?yún)?#xff1b;

調(diào)度時(shí)間:調(diào)度中心,發(fā)起調(diào)度的時(shí)間;

調(diào)度結(jié)果:調(diào)度中心,發(fā)起調(diào)度的結(jié)果,SUCCESS或FAIL;

調(diào)度備注:調(diào)度中心,發(fā)起調(diào)度的備注信息,如地址心跳檢測(cè)日志等;

執(zhí)行時(shí)間:執(zhí)行器,任務(wù)執(zhí)行結(jié)束后回調(diào)的時(shí)間;

執(zhí)行結(jié)果:執(zhí)行器,任務(wù)執(zhí)行的結(jié)果,SUCCESS或FAIL;

執(zhí)行備注:執(zhí)行器,任務(wù)執(zhí)行的備注信息,如異常日志等;

執(zhí)行日志:任務(wù)執(zhí)行過(guò)程中,業(yè)務(wù)代碼中打印的完整執(zhí)行日志,見(jiàn)“4.8 查看執(zhí)行日志”;

5.4.10 任務(wù)依賴(lài)

原理:XXL-JOB中每個(gè)任務(wù)都對(duì)應(yīng)有一個(gè)任務(wù)ID,同時(shí),每個(gè)任務(wù)支持設(shè)置屬性“子任務(wù)ID”,因此,通過(guò)“任務(wù)ID”可以匹配任務(wù)依賴(lài)關(guān)系。

當(dāng)父任務(wù)執(zhí)行結(jié)束并且執(zhí)行成功時(shí),將會(huì)根據(jù)“子任務(wù)ID”匹配子任務(wù)依賴(lài),如果匹配到子任務(wù),將會(huì)主動(dòng)觸發(fā)一次子任務(wù)的執(zhí)行。

在任務(wù)日志界面,點(diǎn)擊任務(wù)的“執(zhí)行備注”的“查看”按鈕,可以看到匹配子任務(wù)以及觸發(fā)子任務(wù)執(zhí)行的日志信息,如無(wú)信息則表示未觸發(fā)子任務(wù)執(zhí)行,可參考下圖。

5.4.11 全異步化 & 輕量級(jí)

全異步化設(shè)計(jì):XXL-JOB系統(tǒng)中業(yè)務(wù)邏輯在遠(yuǎn)程執(zhí)行器執(zhí)行,觸發(fā)流程全異步化設(shè)計(jì)。相比直接在調(diào)度中心內(nèi)部執(zhí)行業(yè)務(wù)邏輯,極大的降低了調(diào)度線(xiàn)程占用時(shí)間;輕量級(jí)設(shè)計(jì):XXL-JOB調(diào)度中心中每個(gè)JOB邏輯非常 “輕”,在全異步化的基礎(chǔ)上,單個(gè)JOB一次運(yùn)行平均耗時(shí)基本在 “10ms” 之內(nèi)(基本為一次請(qǐng)求的網(wǎng)絡(luò)開(kāi)銷(xiāo));因此,可以保證使用有限的線(xiàn)程支撐大量的JOB并發(fā)運(yùn)行;

異步調(diào)度:調(diào)度中心每次任務(wù)觸發(fā)時(shí)僅發(fā)送一次調(diào)度請(qǐng)求,該調(diào)度請(qǐng)求首先推送“異步調(diào)度隊(duì)列”,然后異步推送給遠(yuǎn)程執(zhí)行器

異步執(zhí)行:執(zhí)行器會(huì)將請(qǐng)求存入“異步執(zhí)行隊(duì)列”并且立即響應(yīng)調(diào)度中心,異步運(yùn)行。

得益于上述兩點(diǎn)優(yōu)化,理論上默認(rèn)配置下的調(diào)度中心,單機(jī)能夠支撐 5000 任務(wù)并發(fā)運(yùn)行穩(wěn)定運(yùn)行;

實(shí)際場(chǎng)景中,由于調(diào)度中心與執(zhí)行器網(wǎng)絡(luò)ping延遲不同、DB讀寫(xiě)耗時(shí)不同、任務(wù)調(diào)度密集程度不同,會(huì)導(dǎo)致任務(wù)量上限會(huì)上下波動(dòng)。

如若需要支撐更多的任務(wù)量,可以通過(guò) “調(diào)大調(diào)度線(xiàn)程數(shù)” 、”降低調(diào)度中心與執(zhí)行器ping延遲” 和 “提升機(jī)器配置” 幾種方式優(yōu)化。

5.4.12 均衡調(diào)度

調(diào)度中心在集群部署時(shí)會(huì)自動(dòng)進(jìn)行任務(wù)平均分配,觸發(fā)組件每次獲取與線(xiàn)程池?cái)?shù)量(調(diào)度中心支持自定義調(diào)度線(xiàn)程池大小)相關(guān)數(shù)量的任務(wù),避免大量任務(wù)集中在單個(gè)調(diào)度中心集群節(jié)點(diǎn);

5.5 任務(wù) “運(yùn)行模式” 剖析

5.5.1 “Bean模式” 任務(wù)

開(kāi)發(fā)步驟:可參考 “章節(jié)三” ;

原理:每個(gè)Bean模式任務(wù)都是一個(gè)Spring的Bean類(lèi)實(shí)例,它被維護(hù)在“執(zhí)行器”項(xiàng)目的Spring容器中。任務(wù)類(lèi)需要加“@JobHandler(value=”名稱(chēng)”)”注解,因?yàn)椤皥?zhí)行器”會(huì)根據(jù)該注解識(shí)別Spring容器中的任務(wù)。任務(wù)類(lèi)需要繼承統(tǒng)一接口“IJobHandler”,任務(wù)邏輯在execute方法中開(kāi)發(fā),因?yàn)椤皥?zhí)行器”在接收到調(diào)度中心的調(diào)度請(qǐng)求時(shí),將會(huì)調(diào)用“IJobHandler”的execute方法,執(zhí)行任務(wù)邏輯。

5.5.2 “GLUE模式(Java)” 任務(wù)

開(kāi)發(fā)步驟:可參考 “章節(jié)三” ;

原理:每個(gè) “GLUE模式(Java)” 任務(wù)的代碼,實(shí)際上是“一個(gè)繼承自“IJobHandler”的實(shí)現(xiàn)類(lèi)的類(lèi)代碼”,“執(zhí)行器”接收到“調(diào)度中心”的調(diào)度請(qǐng)求時(shí),會(huì)通過(guò)Groovy類(lèi)加載器加載此代碼,實(shí)例化成Java對(duì)象,同時(shí)注入此代碼中聲明的Spring服務(wù)(請(qǐng)確保Glue代碼中的服務(wù)和類(lèi)引用在“執(zhí)行器”項(xiàng)目中存在),然后調(diào)用該對(duì)象的execute方法,執(zhí)行任務(wù)邏輯。

5.5.3 GLUE模式(Shell) + GLUE模式(Python) + GLUE模式(NodeJS)

開(kāi)發(fā)步驟:可參考 “章節(jié)三” ;

原理:腳本任務(wù)的源碼托管在調(diào)度中心,腳本邏輯在執(zhí)行器運(yùn)行。當(dāng)觸發(fā)腳本任務(wù)時(shí),執(zhí)行器會(huì)加載腳本源碼在執(zhí)行器機(jī)器上生成一份腳本文件,然后通過(guò)Java代碼調(diào)用該腳本;并且實(shí)時(shí)將腳本輸出日志寫(xiě)到任務(wù)日志文件中,從而在調(diào)度中心可以實(shí)時(shí)監(jiān)控腳本運(yùn)行情況;

目前支持的腳本類(lèi)型如下:

-shell腳本:任務(wù)運(yùn)行模式選擇為"GLUE模式(Shell)"時(shí)支持"shell"腳本任務(wù);

-python腳本:任務(wù)運(yùn)行模式選擇為"GLUE模式(Python)"時(shí)支持"python"腳本任務(wù);

-nodejs腳本:務(wù)運(yùn)行模式選擇為"GLUE模式(NodeJS)"時(shí)支持"nodejs"腳本任務(wù);

腳本任務(wù)通過(guò) Exit Code 判斷任務(wù)執(zhí)行結(jié)果,狀態(tài)碼可參考章節(jié) “5.15 任務(wù)執(zhí)行結(jié)果說(shuō)明”;

5.5.4 執(zhí)行器

執(zhí)行器實(shí)際上是一個(gè)內(nèi)嵌的Server,默認(rèn)端口9999(配置項(xiàng):xxl.job.executor.port)。

在項(xiàng)目啟動(dòng)時(shí),執(zhí)行器會(huì)通過(guò)“@JobHandler”識(shí)別Spring容器中“Bean模式任務(wù)”,以注解的value屬性為key管理起來(lái)。

“執(zhí)行器”接收到“調(diào)度中心”的調(diào)度請(qǐng)求時(shí),如果任務(wù)類(lèi)型為“Bean模式”,將會(huì)匹配Spring容器中的“Bean模式任務(wù)”,然后調(diào)用其execute方法,執(zhí)行任務(wù)邏輯。如果任務(wù)類(lèi)型為“GLUE模式”,將會(huì)加載GLue代碼,實(shí)例化Java對(duì)象,注入依賴(lài)的Spring服務(wù)(注意:Glue代碼中注入的Spring服務(wù),必須存在與該“執(zhí)行器”項(xiàng)目的Spring容器中),然后調(diào)用execute方法,執(zhí)行任務(wù)邏輯。

5.5.5 任務(wù)日志

XXL-JOB會(huì)為每次調(diào)度請(qǐng)求生成一個(gè)單獨(dú)的日志文件,需要通過(guò) “XxlJobLogger.log” 打印執(zhí)行日志,“調(diào)度中心”查看執(zhí)行日志時(shí)將會(huì)加載對(duì)應(yīng)的日志文件。

(歷史版本通過(guò)重寫(xiě)LOG4J的Appender實(shí)現(xiàn),存在依賴(lài)限制,該方式在新版本已經(jīng)被拋棄)

日志文件存放的位置可在“執(zhí)行器”配置文件進(jìn)行自定義,默認(rèn)目錄格式為:/data/applogs/xxl-job/jobhandler/“格式化日期”/“數(shù)據(jù)庫(kù)調(diào)度日志記錄的主鍵ID.log”。

在JobHandler中開(kāi)啟子線(xiàn)程時(shí),子線(xiàn)程將會(huì)將會(huì)把日志打印在父線(xiàn)程即JobHandler的執(zhí)行日志中,方便日志追蹤。

5.6 通訊模塊剖析

5.6.1 一次完整的任務(wù)調(diào)度通訊流程

-1、“調(diào)度中心”向“執(zhí)行器”發(fā)送http調(diào)度請(qǐng)求:“執(zhí)行器”中接收請(qǐng)求的服務(wù),實(shí)際上是一臺(tái)內(nèi)嵌Server,默認(rèn)端口9999;

-2、“執(zhí)行器”執(zhí)行任務(wù)邏輯;

-3、“執(zhí)行器”http回調(diào)“調(diào)度中心”調(diào)度結(jié)果:“調(diào)度中心”中接收回調(diào)的服務(wù),是針對(duì)執(zhí)行器開(kāi)放一套API服務(wù);

5.6.2 通訊數(shù)據(jù)加密

調(diào)度中心向執(zhí)行器發(fā)送的調(diào)度請(qǐng)求時(shí)使用RequestModel和ResponseModel兩個(gè)對(duì)象封裝調(diào)度請(qǐng)求參數(shù)和響應(yīng)數(shù)據(jù), 在進(jìn)行通訊之前底層會(huì)將上述兩個(gè)對(duì)象對(duì)象序列化,并進(jìn)行數(shù)據(jù)協(xié)議以及時(shí)間戳檢驗(yàn),從而達(dá)到數(shù)據(jù)加密的功能;

5.7 任務(wù)注冊(cè), 任務(wù)自動(dòng)發(fā)現(xiàn)

自v1.5版本之后, 任務(wù)取消了”任務(wù)執(zhí)行機(jī)器”屬性, 改為通過(guò)任務(wù)注冊(cè)和自動(dòng)發(fā)現(xiàn)的方式, 動(dòng)態(tài)獲取遠(yuǎn)程執(zhí)行器地址并執(zhí)行。

AppName:每個(gè)執(zhí)行器機(jī)器集群的唯一標(biāo)示,任務(wù)注冊(cè)以"執(zhí)行器"為最小粒度進(jìn)行注冊(cè);每個(gè)任務(wù)通過(guò)其綁定的執(zhí)行器可感知對(duì)應(yīng)的執(zhí)行器機(jī)器列表;

注冊(cè)表:見(jiàn)"xxl_job_registry"表,"執(zhí)行器"在進(jìn)行任務(wù)注冊(cè)時(shí)將會(huì)周期性維護(hù)一條注冊(cè)記錄,即機(jī)器地址和AppName的綁定關(guān)系;"調(diào)度中心"從而可以動(dòng)態(tài)感知每個(gè)AppName在線(xiàn)的機(jī)器列表;

執(zhí)行器注冊(cè):任務(wù)注冊(cè)Beat周期默認(rèn)30s;執(zhí)行器以一倍Beat進(jìn)行執(zhí)行器注冊(cè),調(diào)度中心以一倍Beat進(jìn)行動(dòng)態(tài)任務(wù)發(fā)現(xiàn);注冊(cè)信息的失效時(shí)間為三倍Beat;

執(zhí)行器注冊(cè)摘除:執(zhí)行器銷(xiāo)毀時(shí),將會(huì)主動(dòng)上報(bào)調(diào)度中心并摘除對(duì)應(yīng)的執(zhí)行器機(jī)器信息,提高心跳注冊(cè)的實(shí)時(shí)性;

為保證系統(tǒng)”輕量級(jí)”并且降低學(xué)習(xí)部署成本,沒(méi)有采用Zookeeper作為注冊(cè)中心,采用DB方式進(jìn)行任務(wù)注冊(cè)發(fā)現(xiàn);

5.8 任務(wù)執(zhí)行結(jié)果

自v1.6.2之后,任務(wù)執(zhí)行結(jié)果通過(guò) “IJobHandler” 的返回值 “ReturnT” 進(jìn)行判斷;

當(dāng)返回值符合 “ReturnT.code == ReturnT.SUCCESS_CODE” 時(shí)表示任務(wù)執(zhí)行成功,否則表示任務(wù)執(zhí)行失敗,而且可以通過(guò) “ReturnT.msg” 回調(diào)錯(cuò)誤信息給調(diào)度中心;

從而,在任務(wù)邏輯中可以方便的控制任務(wù)執(zhí)行結(jié)果;

5.9 分片廣播 & 動(dòng)態(tài)分片

執(zhí)行器集群部署時(shí),任務(wù)路由策略選擇”分片廣播”情況下,一次任務(wù)調(diào)度將會(huì)廣播觸發(fā)對(duì)應(yīng)集群中所有執(zhí)行器執(zhí)行一次任務(wù),同時(shí)系統(tǒng)自動(dòng)傳遞分片參數(shù);可根據(jù)分片參數(shù)開(kāi)發(fā)分片任務(wù);

“分片廣播” 以執(zhí)行器為維度進(jìn)行分片,支持動(dòng)態(tài)擴(kuò)容執(zhí)行器集群從而動(dòng)態(tài)增加分片數(shù)量,協(xié)同進(jìn)行業(yè)務(wù)處理;在進(jìn)行大數(shù)據(jù)量業(yè)務(wù)操作時(shí)可顯著提升任務(wù)處理能力和速度。

“分片廣播” 和普通任務(wù)開(kāi)發(fā)流程一致,不同之處在于可以可以獲取分片參數(shù),獲取分片參數(shù)進(jìn)行分片業(yè)務(wù)處理。

Java語(yǔ)言任務(wù)獲取分片參數(shù)方式:BEAN、GLUE模式(Java)// 可參考Sample示例執(zhí)行器中的示例任務(wù)"ShardingJobHandler"了解試用

ShardingUtil.ShardingVOshardingVO =ShardingUtil.getShardingVo();

腳本語(yǔ)言任務(wù)獲取分片參數(shù)方式:GLUE模式(Shell)、GLUE模式(Python)、GLUE模式(Nodejs)// 腳本任務(wù)入?yún)⒐潭槿齻€(gè),依次為:任務(wù)傳參、分片序號(hào)、分片總數(shù)。以Shell模式任務(wù)為例,獲取分片參數(shù)代碼如下

echo "分片序號(hào) index = $2"

echo "分片總數(shù) total = $3"

分片參數(shù)屬性說(shuō)明:

index:當(dāng)前分片序號(hào)(從0開(kāi)始),執(zhí)行器集群列表中當(dāng)前執(zhí)行器的序號(hào);

total:總分片數(shù),執(zhí)行器集群的總機(jī)器數(shù)量;

該特性適用場(chǎng)景如:

1、分片任務(wù)場(chǎng)景:10個(gè)執(zhí)行器的集群來(lái)處理10w條數(shù)據(jù),每臺(tái)機(jī)器只需要處理1w條數(shù)據(jù),耗時(shí)降低10倍;

2、廣播任務(wù)場(chǎng)景:廣播執(zhí)行器機(jī)器運(yùn)行shell腳本、廣播集群節(jié)點(diǎn)進(jìn)行緩存更新等

5.10 訪(fǎng)問(wèn)令牌(AccessToken)

為提升系統(tǒng)安全性,調(diào)度中心和執(zhí)行器進(jìn)行安全性校驗(yàn),雙方AccessToken匹配才允許通訊;

調(diào)度中心和執(zhí)行器,可通過(guò)配置項(xiàng) “xxl.job.accessToken” 進(jìn)行AccessToken的設(shè)置。

調(diào)度中心和執(zhí)行器,如果需要正常通訊,只有兩種設(shè)置;

設(shè)置一:調(diào)度中心和執(zhí)行器,均不設(shè)置AccessToken;關(guān)閉安全性校驗(yàn);

設(shè)置二:調(diào)度中心和執(zhí)行器,設(shè)置了相同的AccessToken;

5.11 調(diào)度中心API服務(wù)

調(diào)度中心提供了API服務(wù),主要分為兩種類(lèi)型:

5.11.1 提供給執(zhí)行器的API服務(wù):

1、任務(wù)結(jié)果回調(diào)服務(wù);

2、執(zhí)行器注冊(cè)服務(wù);

3、執(zhí)行器注冊(cè)摘除服務(wù);

4、觸發(fā)任務(wù)單次執(zhí)行服務(wù),支持任務(wù)根據(jù)業(yè)務(wù)事件觸發(fā);

API服務(wù)位置:com.xxl.job.core.biz.AdminBiz.java

API服務(wù)請(qǐng)求參考代碼:com.xxl.job.adminbiz.AdminBizTest.java

5.11.2 提供給業(yè)務(wù)的API服務(wù):

1、任務(wù)列表查詢(xún);

2、任務(wù)新增;

3、任務(wù)更新;

4、任務(wù)刪除;

5、任務(wù)啟動(dòng);

6、任務(wù)停止;

7、任務(wù)觸發(fā);

API服務(wù)位置:com.xxl.job.admin.controller.JobInfoController.java

API服務(wù)請(qǐng)求參考代碼:可參考任務(wù)界面操作的ajax請(qǐng)求。任何ajax接口均可配置成為API服務(wù),只需在待啟用的API服務(wù)上添加 “@PermissionLimit(limit = false)” 注解取消登陸態(tài)攔截即可;

5.12 執(zhí)行器API服務(wù)

執(zhí)行器提供了API服務(wù),供調(diào)度中心選擇使用,目前提供的API服務(wù)有:

1、心跳檢測(cè):調(diào)度中心使用

2、忙碌檢測(cè):調(diào)度中心使用

3、觸發(fā)任務(wù)執(zhí)行:調(diào)度中心使用;本地進(jìn)行任務(wù)開(kāi)發(fā)時(shí),可使用該API服務(wù)模擬觸發(fā)任務(wù);

4、獲取RollingLog:調(diào)度中心使用

5、終止任務(wù):調(diào)度中心使用

API服務(wù)位置:com.xxl.job.core.biz.ExecutorBiz

API服務(wù)請(qǐng)求參考代碼:com.xxl.job.executor.ExecutorBizTest

5.13 故障轉(zhuǎn)移 & 失敗重試

一次完整任務(wù)流程包括”調(diào)度(調(diào)度中心) + 執(zhí)行(執(zhí)行器)”兩個(gè)階段。

“故障轉(zhuǎn)移”發(fā)生在調(diào)度階段,在執(zhí)行器集群部署時(shí),如果某一臺(tái)執(zhí)行器發(fā)生故障,該策略支持自動(dòng)進(jìn)行Failover切換到一臺(tái)正常的執(zhí)行器機(jī)器并且完成調(diào)度請(qǐng)求流程。

“失敗重試”發(fā)生在”調(diào)度 + 執(zhí)行”兩個(gè)階段,支持通過(guò)自定義任務(wù)失敗重試次數(shù),當(dāng)任務(wù)失敗時(shí)將會(huì)按照預(yù)設(shè)的失敗重試次數(shù)主動(dòng)進(jìn)行重試;

5.14 執(zhí)行器灰度上線(xiàn)

調(diào)度中心與業(yè)務(wù)解耦,只需部署一次后常年不需要維護(hù)。但是,執(zhí)行器中托管運(yùn)行著業(yè)務(wù)作業(yè),作業(yè)上線(xiàn)和變更需要重啟執(zhí)行器,尤其是Bean模式任務(wù)。

執(zhí)行器重啟可能會(huì)中斷運(yùn)行中的任務(wù)。但是,XXL-JOB得益于自建執(zhí)行器與自建注冊(cè)中心,可以通過(guò)灰度上線(xiàn)的方式,避免因重啟導(dǎo)致的任務(wù)中斷的問(wèn)題。

步驟如下:

1、執(zhí)行器改為手動(dòng)注冊(cè),下線(xiàn)一半機(jī)器列表(A組),線(xiàn)上運(yùn)行另一半機(jī)器列表(B組);

2、等待A組機(jī)器任務(wù)運(yùn)行結(jié)束并編譯上線(xiàn);執(zhí)行器注冊(cè)地址替換為A組;

3、等待B組機(jī)器任務(wù)運(yùn)行結(jié)束并編譯上線(xiàn);執(zhí)行器注冊(cè)地址替換為A組+B組;

操作結(jié)束;

5.15 任務(wù)執(zhí)行結(jié)果說(shuō)明

系統(tǒng)根據(jù)以下標(biāo)準(zhǔn)判斷任務(wù)執(zhí)行結(jié)果,可參考之。

—Bean/Glue(Java)Glue(Shell) 等腳本任務(wù)

成功

IJobHandler.SUCCESS

0

失敗

IJobHandler.FAIL

-1(非0狀態(tài)碼)

5.16 任務(wù)超時(shí)控制

支持設(shè)置任務(wù)超時(shí)時(shí)間,任務(wù)運(yùn)行超時(shí)的情況下,將會(huì)主動(dòng)中斷任務(wù);

需要注意的是,任務(wù)超時(shí)中斷時(shí)與任務(wù)終止機(jī)制(可查看“4.9 終止運(yùn)行中的任務(wù)”)類(lèi)似,也是通過(guò) “interrupt” 中斷任務(wù),因此業(yè)務(wù)代碼需要將 “InterruptedException” 外拋,否則功能不可用。

5.17 跨平臺(tái) & 跨語(yǔ)言

跨平臺(tái)、跨語(yǔ)言主要體現(xiàn)在以下兩個(gè)方面:

1、提供Java、Python、PHP……等十來(lái)種任務(wù)模式,可參考章節(jié) “5.5 任務(wù) “運(yùn)行模式” ”;理論上可擴(kuò)展任意語(yǔ)言任務(wù)模式;

2、提供基于HTTP的任務(wù)Handler(Bean任務(wù),JobHandler=”HttpJobHandler”);業(yè)務(wù)方只需要提供HTTP鏈接即可,不限制語(yǔ)言、平臺(tái);

5.18 任務(wù)失敗告警

默認(rèn)提供郵件失敗告警,可擴(kuò)展短信、釘釘?shù)确绞?#xff0c;擴(kuò)展代碼位置為 “JobFailMonitorHelper.failAlarm”;

5.19 調(diào)度中心Docker鏡像構(gòu)建

可以通過(guò)以下命令快速構(gòu)建調(diào)度中心,并啟動(dòng)運(yùn)行;

mvn clean package

docker build -t xuxueli/xxl-job-admin ./xxl-job-admin

docker run --name xxl-job-admin -p 8080:8080-d xuxueli/xxl-job-admin

5.20 避免任務(wù)重復(fù)執(zhí)行

調(diào)度密集或者耗時(shí)任務(wù)可能會(huì)導(dǎo)致任務(wù)阻塞,集群情況下調(diào)度組件小概率情況下會(huì)重復(fù)觸發(fā);

針對(duì)上述情況,可以通過(guò)結(jié)合 “單機(jī)路由策略(如:第一臺(tái)、一致性哈希)” + “阻塞策略(如:單機(jī)串行、丟棄后續(xù)調(diào)度)” 來(lái)規(guī)避,最終避免任務(wù)重復(fù)執(zhí)行。

5.21 命令行任務(wù)

原生提供通用命令行任務(wù)Handler(Bean任務(wù),”CommandJobHandler”);業(yè)務(wù)方只需要提供命令行即可;

如任務(wù)參數(shù) “pwd” 將會(huì)執(zhí)行命令并輸出數(shù)據(jù);

5.22 日志自動(dòng)清理

XXL-JOB日志主要包含如下兩部分,均支持日志自動(dòng)清理,說(shuō)明如下:

調(diào)度中心日志表數(shù)據(jù):可借助配置項(xiàng) “xxl.job.logretentiondays” 設(shè)置日志表數(shù)據(jù)保存天數(shù),過(guò)期日志自動(dòng)清理;詳情可查看上文配置說(shuō)明;

執(zhí)行器日志文件數(shù)據(jù):可借助配置項(xiàng) “xxl.job.executor.logretentiondays” 設(shè)置日志文件數(shù)據(jù)保存天數(shù),過(guò)期日志自動(dòng)清理;詳情可查看上文配置說(shuō)明;

總結(jié)

以上是生活随笔為你收集整理的python任务调度平台 界面_分布式任务调度平台XXL-JOB的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。

如果覺(jué)得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。