背景介绍
XXL-JOB是一个开箱即用的轻量级分布式任务调度系统,其核心设计目标是开发迅速、学习简单、轻量级、易扩展,在开源社区广泛流行,已在多家公司投入使用。
因为XXL-JOB开源协议是GPL,云厂商无法直接商业化托管该产品,各大中小企业需要自建,增加了学习成本、机器成本、人工运维成本。
阿里巴巴商业化任务调度平台SchedulerX2.0兼容XXL-JOB任务接口,支持@XxlJob新注解和@JobHandler老注解方式,用户不需要修改一行代码,即可以将XXL-JOB任务在SchedulerX2.0平台上托管。
与开源XXL-JOB区别
开源xxl-job |
SchedulerX为底座的xxl-job任务 |
|
Bean模式 |
新版本@XxlJob注解,老版本@JobHandler注解,不兼容 |
同时兼容@XxlJob注解和@JobHandler注解 |
GLUE(JAVA) |
支持 |
不支持(有计划) |
Shell |
支持 |
支持 |
Nodejs |
支持 |
支持 |
http |
不支持 |
支持 |
单机 |
支持 |
支持 |
分片广播 |
支持 |
支持 |
路由策略 |
第一个、最后一个、轮询、随机等 |
轮询 |
定时 |
cron |
cron、fixed_rate、fixed_delay、one_time |
工作流 |
不支持 |
支持 |
运维操作 |
运行一次 |
运行一次、原地重跑、重刷数据、标记成功、停止运行 |
报警 |
邮件 |
邮件、钉钉群、短信、电话 |
如何接入
接入配置
将com.xuxueli:xxl-job-core的依赖去除,增加schedulerx客户端的依赖和com.aliyun:schedulerx2-plugin-xxljob这个插件,以schedulerx2-spring-boot-starter为例:
因为xxl-job在2.3.x版本重构了接口,请根据xxl-job版本选择不同的接入方式
- 2.3.x版本接入
<!-- 注释xxl-job-core --> <!-- <dependency> <groupId>com.xuxueli</groupId> <artifactId>xxl-job-core</artifactId> <version>${project.parent.version}</version> </dependency> --> <dependency> <groupId>com.aliyun.schedulerx</groupId> <artifactId>schedulerx2-spring-boot-starter</artifactId> <version>1.4.0</version> </dependency> <dependency> <groupId>com.aliyun.schedulerx</groupId> <artifactId>schedulerx2-plugin-xxljob</artifactId> <version>2.3.0</version> </dependency>
- 2.3.0以下版本接入
<!-- 注释xxl-job-core --> <!-- <dependency> <groupId>com.xuxueli</groupId> <artifactId>xxl-job-core</artifactId> <version>${project.parent.version}</version> </dependency> --> <dependency> <groupId>com.aliyun.schedulerx</groupId> <artifactId>schedulerx2-spring-boot-starter</artifactId> <version>1.4.0</version> </dependency> <dependency> <groupId>com.aliyun.schedulerx</groupId> <artifactId>schedulerx2-plugin-xxljob</artifactId> <version>1.3.4.1</version> </dependency>
application.properties增加配置
spring.schedulerx2.endpoint=xxxxxxx spring.schedulerx2.namespace=xxxxxxx spring.schedulerx2.groupId=xxxxxxxx spring.schedulerx2.appKey=xxxxxxx
创建任务
@XxlJob方法注解
以xxl-job-2.2.1接口为例,参考开源xxl-job-executor-sample-springboot工程,新建方法任务
控制台新建任务
手动运行一次,可以打印任务参数
@JobHandler类注解
新建代码如下
控制台新建任务如下
成功打印任务参数:
分片广播
以XxlJob方法注解为例,新建代码如下
控制台新建任务
启动2个客户端实例,运行一次,分别打印
XXL-JOB批量迁移工具
导出xxl-job任务配置
- 下载工具,地址:https://schedulerx2.oss-cn-hangzhou.aliyuncs.com/tools/xxljob-export.tar.gz
- 解压工具包,在application.properties文件中进行导出配置
### xxl-job, datasource datasource.url=jdbc:mysql://127.0.0.1:3306/xxl_job?useUnicode=true&characterEncoding=UTF-8&autoReconnect=true&serverTimezone=Asia/Shanghai datasource.username=root datasource.password=123456 datasource.driver-class-name=com.mysql.cj.jdbc.Driver ### 配置对应要导出的app-name(该步骤可选,不设置的情况下导出所有任务分组) #xxl-job.app-name=xxl-job-executor-sample
- 执行./start.sh命令运行导出操作
- 执行完成后,在当前目录下获得 "xxljob_*******.json"的任务配置文件(仅Bean模式的任务配置信息)
任务导入SchedulerX
- 进入SchedulerX控制台,进入“任务管理”菜单,选择“应用”->“导入任务”
- 选择上节中导出的任务配置文件执行导入,即可完成xxl-job任务配置信息至SchedulerX任务配置信息同步。
托管XXL-JOB的优势
免运维、低成本
自建XXL-JOB至少需要2个server+1个数据库
托管XXL-JOB可以省去机器成本,省去人力运维成本
海量任务、精准调度
开源XXL-JOB基于竞争数据库锁保证只有一个节点执行任务,对于数据库有压力,据统计,当任务超过1万,都是分钟级别的任务时,就会有比较明显的调度延时,如果是秒级别任务,延时就更加明显。
SchedulerX2.0采用分布式架构,不同的server调度不同的任务,且无锁竞争,真正实现可以水平扩展,可以支持百万级别任务调度。
SchedulerX2.0针对秒级别任务低延时的特性,采用了专门的架构,占用资源极低,可以作为实时业务的秒级别调度场景。
另外,SchedulerX2.0还支持一次性任务,可以指定未来某个时刻执行一次任务,执行完任务自动销毁,可以作为定时通知、订单定时关闭等场景。
高级特性
工作流:通过可视化的工作流进行任务编排
限流:可抢占的任务优先级队列
资源隔离:支持命名空间和应用级别资源隔离,支持多租户权限管理
高可用
SchedulerX2.0采用高可用架构,任务多备份机制,经历阿里集团多年双十一、容灾演练,可以做到整个集群挂掉任意2个节点或者任意一个机房断电,任务调度都不会收到影响。
商业化报警运维
SchedulerX2.0除了兼容XXL-JOB的邮件报警和基本运维操作,还提供了商业化报警和运维功能
- 报警:钉钉群、短信、电话
- 运维:原地重跑、重刷数据、标记成功、查看堆栈、停止任务