分布式任務(wù)調(diào)度平臺 XXL-JOB

參考 分布式任務(wù)調(diào)度平臺xxl-job

源碼下載地址 https://github.com/xuxueli/xxl-job/releases

一蛋褥、需求背景

以往系統(tǒng)中的周期性任務(wù)執(zhí)行,一般有以下幾種方式

  • 引入quartz or spring-task 睛驳,每一個(gè)任務(wù)對應(yīng)編寫一個(gè)執(zhí)行類烙心,配置調(diào)度規(guī)則執(zhí)行
  • 使用系統(tǒng)的執(zhí)行器,比如centos的crontab乏沸,每一個(gè)任務(wù)對應(yīng)編寫一個(gè)執(zhí)行類淫茵,并在crontab 配置調(diào)度規(guī)則

此時(shí),又會出現(xiàn)以下的問題

  • 任務(wù)出現(xiàn)異常蹬跃,需增加報(bào)警功能
  • 任務(wù)出現(xiàn)阻塞匙瘪,比如上一次任務(wù)沒執(zhí)行完,下次任務(wù)會排隊(duì)等待蝶缀,以此累積
  • 任務(wù)超時(shí)丹喻,需自己主動(dòng)中斷任務(wù)
  • 單機(jī)任務(wù)調(diào)度下,系統(tǒng)出現(xiàn)異常翁都,比如內(nèi)存爆掉碍论,磁盤空間不夠用
  • 任務(wù)失敗,需hardcode 指定次數(shù)重試
  • 在沒有配日志可視化的前提下荐吵,查看日志需要去服務(wù)器上敲命令骑冗,面臨rm -rf *的風(fēng)險(xiǎn)
  • ...

二、什么是xxl-job

XXL-JOB是一個(gè)輕量級分布式任務(wù)調(diào)度平臺先煎,支持通過 Web 頁面對任務(wù)進(jìn)行 CRUD 操作贼涩,支持動(dòng)態(tài)修改任務(wù)狀態(tài)、暫停/恢復(fù)任務(wù)薯蝎,以及終止運(yùn)行中任務(wù)遥倦,支持在線配置調(diào)度任務(wù)入?yún)⒑驮诰€查看調(diào)度結(jié)果。

它的特點(diǎn)有:

平臺:

  • 調(diào)度中心式設(shè)計(jì)
  • 解耦
  • 用DB實(shí)現(xiàn)注冊中心,實(shí)現(xiàn)輕量級部署
  • 彈性擴(kuò)袒哥、縮容
  • 故障轉(zhuǎn)移:執(zhí)行器集群某臺機(jī)器出現(xiàn)故障缩筛,能夠自動(dòng)切換正常的執(zhí)行器
  • 分片廣播:且支持動(dòng)態(tài)分片,提升任務(wù)運(yùn)行效率
  • 路由策略:執(zhí)行器集群部署時(shí)提供豐富的路由策略堡称,包括:第一個(gè)瞎抛、最后一個(gè)、輪詢却紧、隨機(jī)桐臊、一致性HASH、最不經(jīng)常使用晓殊、最近最久未使用断凶、故障轉(zhuǎn)移、忙碌轉(zhuǎn)移等巫俺;
  • 全異步化:異步調(diào)度和異步執(zhí)行认烁。

任務(wù):

  • 任務(wù)分布式執(zhí)行
  • 簡單:支持通過web對任務(wù)進(jìn)行crud
  • 靈活:動(dòng)態(tài)修改任務(wù)狀態(tài),自定義失敗重試次數(shù)等介汹,且即時(shí)生效
  • 告警:任務(wù)失敗却嗡,支持郵件告警

三、概念說明

任務(wù)

調(diào)度任務(wù)痴昧,系統(tǒng)角色中的最小單元

  • 可通過webide(GLUE模式) 或者ide(BEAN模式)自定義任務(wù)內(nèi)容
  • 支持多種路由策略和阻塞處理策略的選擇
  • 支持自定義失敗重試次數(shù)和任務(wù)超時(shí)時(shí)間
  • 支持任務(wù)失敗告警
  • 支持動(dòng)態(tài)修改任務(wù)狀態(tài)和各個(gè)配置策略的修改

調(diào)度中心

統(tǒng)一管理任務(wù)調(diào)度平臺上的調(diào)度任務(wù)稽穆,負(fù)責(zé)觸發(fā)調(diào)度執(zhí)行,并提供可視化平臺管理

執(zhí)行器

主要負(fù)責(zé)接收“調(diào)度中心”的調(diào)度并執(zhí)行

四赶撰、安裝啟動(dòng)

下載

https://github.com/xuxueli/xxl-job

環(huán)境要求

  • Maven3+
  • JDK1.7+
  • MYSQL5.6+

入門

  • 初始化數(shù)據(jù)庫

sql腳本在源碼內(nèi)舌镶,用navicat工具導(dǎo)入即可

doc/db/tables_xxl_job.sql
  • 調(diào)度數(shù)據(jù)庫配置說明

- 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_logglue:任務(wù)GLUE日志:用于保存GLUE更新歷史崭别,用于支持GLUE的版本回溯功能;
- xxl_job_registry:執(zhí)行器注冊表,維護(hù)在線的執(zhí)行器和調(diào)度中心機(jī)器地址信息茅主;
- xxl_job_user:系統(tǒng)用戶表舞痰;
  • 項(xiàng)目結(jié)構(gòu)

xxl-job-admin:調(diào)度中心
xxl-job-core:公共依賴
xxl-job-executor-samples:執(zhí)行器Sample示例(選擇合適的版本執(zhí)行器,可直接使用诀姚,也可以參考其并將現(xiàn)有項(xiàng)目改造成執(zhí)行器)
    :xxl-job-executor-sample-springboot:Springboot版本响牛,通過Springboot管理執(zhí)行器,推薦這種方式赫段;
    :xxl-job-executor-sample-spring:Spring版本娃善,通過Spring容器管理執(zhí)行器,比較通用瑞佩;
    :xxl-job-executor-sample-frameless:無框架版本;
    :xxl-job-executor-sample-jfinal:JFinal版本坯台,通過JFinal管理執(zhí)行器炬丸;
    :xxl-job-executor-sample-nutz:Nutz版本,通過Nutz管理執(zhí)行器蜒蕾;
  • 配置部署“調(diào)度中心”(xxl-job-admin)

    更改配置

    ### web
    server.port=8080
    server.context-path=/xxl-job-admin
    
    ### resources
    spring.mvc.static-path-pattern=/static/**
    spring.resources.static-locations=classpath:/static/
    
    ### freemarker
    spring.freemarker.templateLoaderPath=classpath:/templates/
    spring.freemarker.suffix=.ftl
    spring.freemarker.charset=UTF-8
    spring.freemarker.request-context-attribute=request
    spring.freemarker.settings.number_format=0.##########
    
    ### mybatis
    mybatis.mapper-locations=classpath:/mybatis-mapper/*Mapper.xml
    
    ### xxl-job, datasource
    spring.datasource.url=jdbc:mysql://127.0.0.1:3306/xxl_job?Unicode=true&characterEncoding=UTF-8
    spring.datasource.username=root
    spring.datasource.password=123456
    spring.datasource.driver-class-name=com.mysql.jdbc.Driver
    
    spring.datasource.type=org.apache.tomcat.jdbc.pool.DataSource
    spring.datasource.tomcat.max-wait=10000
    spring.datasource.tomcat.max-active=30
    spring.datasource.tomcat.test-on-borrow=true
    spring.datasource.tomcat.validation-query=SELECT 1
    spring.datasource.tomcat.validation-interval=30000
    
    ### xxl-job email
    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
    
    ### xxl-job, access token
    xxl.job.accessToken=
    
    ### xxl-job, i18n (default empty as chinese, "en" as english)
    xxl.job.i18n=
    

    部署項(xiàng)目

    方式一:項(xiàng)目打包部署
    • 打包xxl-job-admin

    • 調(diào)度中心訪問地址:http://localhost:8080/xxl-job-admin (該地址執(zhí)行器將會使用到稠炬,作為回調(diào)地址)

      默認(rèn)登錄賬號:admin 默認(rèn)登錄密碼:123456

    center.jpg
    方式二:Docker鏡像搭建
    • 下載鏡像
    docker pull xuxueli/xxl-job-admin
    
    • 創(chuàng)建容器

      由于官方鏡像的配置文件(application.properties)是默認(rèn)的,這里需要通過 "PARAMS" 指定咪啡,參數(shù)格式 RAMS="--key=value --key2=value2" 去修改首启;

      docker run -e PARAMS="--spring.datasource.url=jdbc:mysql://127.0.0.1:3306/xxl_job?  
      Unicode=true&characterEncoding=UTF-8" -p 8082:8080 -v /tmp:/data/applogs --name xxl-job-admin  -d     
      xuxueli/xxl-job-admin
      
    • 運(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
      
    調(diào)度中心集群(可選 )

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

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

    • DB配置保持一致;
    • 登陸賬號配置保持一致准夷;
    • 集群機(jī)器時(shí)鐘保持一致(單機(jī)集群忽視)钥飞;
    • 建議:推薦通過nginx為調(diào)度中心集群做負(fù)載均衡,分配域名衫嵌。調(diào)度中心訪問读宙、執(zhí)行器回調(diào)配置、調(diào)用API服務(wù)等操作均通過該域名進(jìn)行楔绞。
  • 配置部署“執(zhí)行器項(xiàng)目”(xxl-job-executor-sample)

    執(zhí)行器配置application.properties

    # web port
    server.port=8081
    
    # log config
    logging.config=classpath:logback.xml
    
    
    ### 調(diào)度中心部署跟地址 [選填]:如調(diào)度中心集群部署存在多個(gè)地址則用逗號分隔结闸。執(zhí)行器將會使用該地址進(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 [選填]:執(zhí)行器心跳注冊分組依據(jù)酒朵;為空則關(guān)閉自動(dòng)注冊
    xxl.job.executor.appname=xxl-job-executor-sample
    ### 執(zhí)行器IP [選填]:默認(rèn)為空表示自動(dòng)獲取IP桦锄,多網(wǎng)卡時(shí)可手動(dòng)設(shè)置指定IP,該IP不會綁定Host僅作為通訊實(shí)用耻讽;地址信息用于 "執(zhí)行器注冊" 和 "調(diào)度中心請求并觸發(fā)任務(wù)"
    xxl.job.executor.ip=
    ### 執(zhí)行器端口號 [選填]:小于等于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)行日志文件存儲磁盤路徑 [選填] :需要對該路徑擁有讀寫權(quán)限香伴;為空則使用默認(rèn)路徑
    xxl.job.executor.logpath=/data/applogs/xxl-job/jobhandler
    ### 執(zhí)行器日志保存天數(shù) [選填] :值大于3時(shí)生效,啟用執(zhí)行器Log文件定期清理功能具则,否則不生效
    xxl.job.executor.logretentiondays=-1
    

    部署項(xiàng)目

    官方提供了多種執(zhí)行器的示例項(xiàng)目即纲,這里默認(rèn)使用springboot。

    執(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)注冊等操作。
    • 同一個(gè)執(zhí)行器集群內(nèi)AppName(xxl.job.executor.appname)需要保持一致病游;調(diào)度中心根據(jù)該配置動(dòng)態(tài)發(fā)現(xiàn)不同集群的在線執(zhí)行器列表唇跨。

五、開發(fā)

任務(wù)運(yùn)行模式主要有Bean模式和Gule模式(理解為腳本)

BEAN模式

在該模式下衬衬,任務(wù)的具體實(shí)現(xiàn)邏輯是 以JobHandler的形式存在于“執(zhí)行器項(xiàng)目”中买猖。

  • 步驟一:新建執(zhí)行器項(xiàng)目

這里只要copy 項(xiàng)目xxl-job-executor-sample-springboot 即可

  • 步驟二:修改執(zhí)行器appname
logging:
  config: "classpath:logback.xml"
server:
  port: 8081
xxl:
  job:
    accessToken: ''
    admin:
      addresses: http://127.0.0.1:8080/xxl-job-admin
    executor:
      appname: xxl-job-executor-test
      ip: ''
      logpath: /data/applogs/xxl-job/jobhandler
      logretentiondays: -1
      port: 9999


  • 步驟三:新建一個(gè)任務(wù)Handler:TestJobHandler
import com.xxl.job.core.biz.model.ReturnT;
import com.xxl.job.core.handler.IJobHandler;
import com.xxl.job.core.handler.annotation.JobHandler;
import com.xxl.job.core.log.XxlJobLogger;
import org.springframework.stereotype.Component;

import java.util.concurrent.TimeUnit;

/**
 * <p>Title:lyy-modular-saas-api</p>
 * <p>Desc: 運(yùn)行模式為Bean模式</p>
 * 開發(fā)步驟:
 * 1、繼承"IJobHandler":“com.xxl.job.core.handler.IJobHandler”滋尉;
 * 2玉控、注冊到Spring容器:添加“@Component”注解,被Spring容器掃描為Bean實(shí)例狮惜;
 * 3高诺、注冊到執(zhí)行器工廠:添加“@JobHandler(value="自定義jobhandler名稱")”注解,注解value值對應(yīng)的是調(diào)度中心新建任務(wù)的JobHandler屬性的值讽挟。
 * 4懒叛、執(zhí)行日志:需要通過 "XxlJobLogger.log" 打印執(zhí)行日志;
 * @author Jerry
 * @version 1.0
 * @since 2019/8/8
 */
@JobHandler(value = "testJobHandler")
@Component
public class TestJobHandler extends IJobHandler {

    @Override
    public ReturnT<String> execute(String s) throws Exception {
        XxlJobLogger.log("################# start to job test");

        for (int i = 0; i < 5; i++) {
            XxlJobLogger.log("beat at:" + i);
            TimeUnit.SECONDS.sleep(2);
        }
        XxlJobLogger.log("################# end to job test");
        return SUCCESS;
    }
}

  • 步驟四:執(zhí)行器管理耽梅,新增執(zhí)行器
actuator.jpg
  • 步驟五:任務(wù)管理薛窥,新建調(diào)度任務(wù)
task.jpg
  • 步驟六:執(zhí)行任務(wù),并查看日志
console_log.jpg

可以看到眼姐,這里成功執(zhí)行了先前自定義的調(diào)度任務(wù)诅迷,并輸出了log,結(jié)合代碼分析众旗,任務(wù)執(zhí)行的log通過XxlJobLogger.log記錄并寫到日志表內(nèi)罢杉,調(diào)度中心后臺讀取日志表得到詳細(xì)的log

GLUE模式

任務(wù)以源碼方式維護(hù)在調(diào)度中心,支持通過Web IDE在線更新贡歧,實(shí)時(shí)編譯和生效滩租,因此不需要指定JobHandler

拿GULE模式(JAVA)來解釋赋秀,每一個(gè)GLUE模式的代碼,在“執(zhí)行器”接受到調(diào)度請求時(shí)律想,會通過Groovy類加載器加載出代碼猎莲,并實(shí)例化成Java對象,同時(shí)注入此代碼中聲明的Spring服務(wù)(這里要確保代碼中所引用的類或服務(wù)在“執(zhí)行器項(xiàng)目中存在”)技即,接著調(diào)用該對象的execute方法著洼,執(zhí)行具體的任務(wù)邏輯。

  • 步驟一:任務(wù)管理而叼,新建調(diào)度任務(wù)

task_glue.jpg
  • 步驟二:點(diǎn)擊操作身笤,選擇GLUE IDE,進(jìn)入Web Ide界面

web_ide.jpg

任務(wù)執(zhí)行失敗-郵件告警

  • 步驟一:在之前 3.3.1 更改配置中葵陵,有相關(guān)郵件報(bào)警的發(fā)送方配置液荸,配置即可
### 這里是用騰訊企業(yè)郵箱測試
spring.mail.host=smtp.exmail.qq.com
spring.mail.port=465
spring.mail.username=error@leyaoyao.com
spring.mail.password=123456

  • 步驟二:在 任務(wù)管理,新建調(diào)度任務(wù)中脱篙,配置接收告警郵件的郵箱莹弊,多個(gè)用“,”隔開即可

相關(guān)的處理邏輯在調(diào)度中心的JobFailMonitorHelper類中

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

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

使用場景:

  1. 分片任務(wù)場景:10個(gè)執(zhí)行器的集群來處理10w條數(shù)據(jù),每臺機(jī)器只需要處理1w條數(shù)據(jù)蔗彤,耗時(shí)降低10倍川梅;

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

  • 步驟一:執(zhí)行器集群部署然遏,暫設(shè)置為2個(gè)節(jié)點(diǎn)

    執(zhí)行器管理可以看到:一個(gè)APP有兩個(gè)機(jī)器地址

    actuators.jpg
  • 步驟二:新增or更新任務(wù)贫途,更改路由策略為分片廣播

    broadcast.jpg
  • 步驟三:編寫業(yè)務(wù)代碼

    // 分片參數(shù)
    ShardingUtil.ShardingVO shardingVO = ShardingUtil.getShardingVo();
    log.info("分片參數(shù):當(dāng)前分片序號 = {}, 總分片數(shù) = {}", shardingVO.getIndex(), shardingVO.getTotal());
    XxlJobLogger.log("分片參數(shù)1:當(dāng)前分片序號 = {}, 總分片數(shù) = {}", shardingVO.getIndex(), shardingVO.getTotal());
    
    // 業(yè)務(wù)邏輯
    // ...
    
    
  • 步驟四:執(zhí)行任務(wù),查看運(yùn)行日志

    # 節(jié)點(diǎn)1
    2019-08-09 09:21:38 [com.xxl.job.executor.service.jobhandler.ShardingJobHandler#execute]-[30]-[Thread-14] 分片參數(shù):當(dāng)前分片序號 = 0, 總分片數(shù) = 2
    2019-08-09 09:21:38 [com.xxl.job.executor.service.jobhandler.ShardingJobHandler#execute]-[35]-[Thread-14] 第 0 片, 命中分片開始處理
    2019-08-09 09:21:38 [com.xxl.job.executor.service.jobhandler.ShardingJobHandler#execute]-[37]-[Thread-14] 第 1 片, 忽略
    
    # 節(jié)點(diǎn)2
    2019-08-09 09:21:38 [com.lyyopen.saas.service.jobhandler.ShardingJobHandler#execute]-[29]-[Thread-16] 分片參數(shù)1:當(dāng)前分片序號 = 1, 總分片數(shù) = 2
    2019-08-09 09:21:38 [com.lyyopen.saas.service.jobhandler.ShardingJobHandler#execute]-[36]-[Thread-16] 第 0 片, 忽略
    2019-08-09 09:21:38 [com.lyyopen.saas.service.jobhandler.ShardingJobHandler#execute]-[34]-[Thread-16] 第 1 片, 命中分片開始處理
    
    

    可以看到一個(gè)集群的兩個(gè)節(jié)點(diǎn)都收到了分片調(diào)度請求待侵,業(yè)務(wù)邏輯即可針對對應(yīng)的分片序號進(jìn)行業(yè)務(wù)邏輯分片處理丢早!

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

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

  • 實(shí)現(xiàn) 調(diào)度+任務(wù) 兩者解耦

  • 調(diào)度行為在調(diào)度中心(admin后臺)秧倾,負(fù)責(zé)發(fā)起調(diào)度請求

  • 任務(wù)抽象化為一個(gè)個(gè)JobHandler怨酝,交由“執(zhí)行器”統(tǒng)一管理,“執(zhí)行器”負(fù)責(zé)接收調(diào)度請求并找到對應(yīng)的JobHandler那先,執(zhí)行具體的業(yè)務(wù)邏輯(execute)

系統(tǒng)組成

  • 調(diào)度模塊(調(diào)度中心): 負(fù)責(zé)管理調(diào)度信息农猬,按照調(diào)度配置發(fā)出調(diào)度請求,自身不承擔(dān)業(yè)務(wù)代碼售淡。調(diào)度系統(tǒng)與任務(wù)解耦斤葱,提高了系統(tǒng)可用性和穩(wěn)定性慷垮,同時(shí)調(diào)度系統(tǒng)性能不再受限于任務(wù)模塊; 支持可視化揍堕、簡單且動(dòng)態(tài)的管理調(diào)度信息料身,包括任務(wù)新建,更新鹤啡,刪除惯驼,GLUE開發(fā)和任務(wù)報(bào)警等,所有上述操作都會實(shí)時(shí)生效递瑰,同時(shí)支持監(jiān)控調(diào)度結(jié)果以及執(zhí)行日志祟牲,支持執(zhí)行器Failover。
  • 執(zhí)行模塊(執(zhí)行器): 負(fù)責(zé)接收調(diào)度請求并執(zhí)行任務(wù)邏輯抖部。任務(wù)模塊專注于任務(wù)的執(zhí)行等操作说贝,開發(fā)和維護(hù)更加簡單和高效; 接收“調(diào)度中心”的執(zhí)行請求慎颗、終止請求和日志請求等乡恕。

架構(gòu)圖

architecture.png

架構(gòu)特性

  • 解耦

    調(diào)度中心 通過類rpc的調(diào)用模式,調(diào)用執(zhí)行器暴露的遠(yuǎn)程服務(wù)俯萎;

    詳見日志遠(yuǎn)程調(diào)用源碼:

    com.xxl.rpc.remoting.invoker.reference.XxlRpcReferenceBean#getObject
    
    
  • 線程池

    調(diào)度采用線程池方式實(shí)現(xiàn)傲宜,避免用單線程出現(xiàn)阻塞而導(dǎo)致任務(wù)調(diào)度延遲;

  • 并行調(diào)度

    調(diào)度模塊采用并行機(jī)制夫啊,而調(diào)度傳遞到執(zhí)行器則是串行執(zhí)行

  • 多種路由策略

  • 過期處理策略

    過期5s內(nèi)立即觸發(fā)一次函卒,過期超5s則忽略

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

    “執(zhí)行器”在收到調(diào)度請求并執(zhí)行任務(wù)后,會將任務(wù)的執(zhí)行結(jié)果回調(diào)通知給調(diào)度中心撇眯,調(diào)度中心再對應(yīng)更新日志表报嵌。

    執(zhí)行器觸發(fā)回調(diào)線程處理源碼:

    com.xxl.job.core.thread.TriggerCallbackThread#doCallback
    
    

    調(diào)度中心接受回調(diào)源碼:

    com.xxl.job.admin.service.impl.AdminBizImpl#callback(com.xxl.job.core.biz.model.HandleCallbackParam)
    
    
  • 任務(wù)集群

    執(zhí)行器如若集群部署,調(diào)度中心將會感知到在線的所有執(zhí)行器

  • 全異步化

    • 異步調(diào)度:調(diào)度中心每次任務(wù)觸發(fā)時(shí)僅發(fā)送一次調(diào)度請求熊榛,該調(diào)度請求首先推送“異步調(diào)度隊(duì)列”锚国,然后異步推送給遠(yuǎn)程執(zhí)行器
    • 異步執(zhí)行:執(zhí)行器會將請求存入“異步執(zhí)行隊(duì)列”并且立即響應(yīng)調(diào)度中心,異步運(yùn)行玄坦。
  • 輕量級設(shè)計(jì)

    XXL-JOB調(diào)度中心中每個(gè)JOB邏輯非常 “輕”血筑,在全異步化的基礎(chǔ)上,單個(gè)JOB一次運(yùn)行平均耗時(shí)基本在 "10ms" 之內(nèi)(基本為一次請求的網(wǎng)絡(luò)開銷)煎楣;因此云挟,可以保證使用有限的線程支撐大量的JOB并發(fā)運(yùn)行

通訊流程分析

  • 調(diào)度中心執(zhí)行器發(fā)送http調(diào)度請求: “執(zhí)行器”中接收請求的服務(wù),實(shí)際上是一臺內(nèi)嵌Server转质,默認(rèn)端口9999;
  • 執(zhí)行器執(zhí)行任務(wù)邏輯
  • 執(zhí)行器http回調(diào)調(diào)度中心調(diào)度結(jié)果: 調(diào)度中心中接收回調(diào)的服務(wù)园欣,是針對執(zhí)行器開放一套API服務(wù);
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市休蟹,隨后出現(xiàn)的幾起案子沸枯,更是在濱河造成了極大的恐慌日矫,老刑警劉巖,帶你破解...
    沈念sama閱讀 218,755評論 6 507
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件绑榴,死亡現(xiàn)場離奇詭異哪轿,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī)翔怎,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,305評論 3 395
  • 文/潘曉璐 我一進(jìn)店門窃诉,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人赤套,你說我怎么就攤上這事飘痛。” “怎么了容握?”我有些...
    開封第一講書人閱讀 165,138評論 0 355
  • 文/不壞的土叔 我叫張陵宣脉,是天一觀的道長。 經(jīng)常有香客問我剔氏,道長塑猖,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 58,791評論 1 295
  • 正文 為了忘掉前任谈跛,我火速辦了婚禮羊苟,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘感憾。我一直安慰自己践险,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,794評論 6 392
  • 文/花漫 我一把揭開白布吹菱。 她就那樣靜靜地躺著,像睡著了一般彭则。 火紅的嫁衣襯著肌膚如雪鳍刷。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 51,631評論 1 305
  • 那天俯抖,我揣著相機(jī)與錄音输瓜,去河邊找鬼。 笑死恩掷,一個(gè)胖子當(dāng)著我的面吹牛姑裂,可吹牛的內(nèi)容都是我干的捻悯。 我是一名探鬼主播,決...
    沈念sama閱讀 40,362評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼北戏,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了漫蛔?” 一聲冷哼從身側(cè)響起嗜愈,我...
    開封第一講書人閱讀 39,264評論 0 276
  • 序言:老撾萬榮一對情侶失蹤旧蛾,失蹤者是張志新(化名)和其女友劉穎,沒想到半個(gè)月后蠕嫁,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體锨天,經(jīng)...
    沈念sama閱讀 45,724評論 1 315
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,900評論 3 336
  • 正文 我和宋清朗相戀三年剃毒,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了病袄。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 40,040評論 1 350
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡赘阀,死狀恐怖益缠,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情纤壁,我是刑警寧澤左刽,帶...
    沈念sama閱讀 35,742評論 5 346
  • 正文 年R本政府宣布,位于F島的核電站酌媒,受9級特大地震影響欠痴,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜秒咨,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,364評論 3 330
  • 文/蒙蒙 一喇辽、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧雨席,春花似錦菩咨、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,944評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至糙置,卻和暖如春云茸,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背谤饭。 一陣腳步聲響...
    開封第一講書人閱讀 33,060評論 1 270
  • 我被黑心中介騙來泰國打工标捺, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人揉抵。 一個(gè)月前我還...
    沈念sama閱讀 48,247評論 3 371
  • 正文 我出身青樓亡容,卻偏偏與公主長得像,于是被迫代替她去往敵國和親冤今。 傳聞我的和親對象是個(gè)殘疾皇子闺兢,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,979評論 2 355

推薦閱讀更多精彩內(nèi)容

  • 為獲得更好的閱讀體驗(yàn),請?jiān)L問原文:傳送門 一戏罢、分布式任務(wù)調(diào)度概述 什么是任務(wù)調(diào)度平臺 任務(wù)調(diào)度是指基于給定的時(shí)間點(diǎn)...
    我沒有三顆心臟閱讀 3,052評論 0 34
  • 一列敲、簡介 1.1 概述 XXL-JOB是一個(gè)輕量級分布式任務(wù)調(diào)度平臺阱佛,其核心設(shè)計(jì)目標(biāo)是開發(fā)迅速、學(xué)習(xí)簡單戴而、輕量級凑术、...
    織夢少年666閱讀 3,584評論 0 0
  • 1.簡介 1.1概述 XXL-JOB是一個(gè)輕量級分布式任務(wù)調(diào)度框架,其核心設(shè)計(jì)目標(biāo)是開發(fā)迅速所意、學(xué)習(xí)簡單淮逊、輕量級、易...
    會飛的譚豬豬閱讀 8,802評論 1 8
  • 學(xué)經(jīng)日期:2017年3月4日 星期四 晴 寶貝年齡:8歲 學(xué)經(jīng)人員:茹茹 扶踊、爸爸泄鹏、媽媽 學(xué)經(jīng)方法:輪流帶讀:《老子...
    悅2017137閱讀 194評論 2 4
  • Kotlin語言的橫空出世,直接推進(jìn)了Android的語言開發(fā)的豐富性秧耗,目前Java做為Android開發(fā)的語言首...
    Kevin_Zhou閱讀 424評論 0 0