XXL-JOB分布式调度框架全面详解
一. XXL-JOB概述
1.1 XXL-JOB是什么?
-
官方说明:XXL-JOB是一个轻量级分布式任务调度平台,其核心设计目标是开发迅速、学习简单、轻量级、易扩展。现已开放源代码并接入多家公司线上产品线,开箱即用。
-
通俗来讲:XXL-JOB是一个任务调度框架,通过引入XXL-JOB相关的依赖,按照相关格式撰写代码后,可在其可视化界面进行任务的启动,执行,中止以及包含了日志记录与查询和任务状态监控
-
Quartz的不足:Quartz作为开源任务调度中的佼佼者,是任务调度的首选。但是在集群环境中,Quartz采用API的方式对任务进行管理,这样存在以下问题:
- 通过调用API的方式操作任务,不人性化。
- 需要持久化业务的QuartzJobBean到底层数据表中,系统侵入性相当严重。
- 调度逻辑和QuartzJobBean耦合在同一个项目中,这将导致一个问题,在调度任务数量逐渐增多,同时调度任务逻辑逐渐加重的情况下,此时调度系统的性能将大大受限于业务。
-
一般定时任务的不足:
- 不支持集群。
- 不支持任务重试
- 不支持动态调用规则
- 无报警机制
- 不支持生命周期的统一管理
- 任务数据的难以统计
XXL-JOB弥补了Quartz的上述不足之处。
1.2 XXL-JOB架构图
架构设计
1.将调度行为抽象形成“调度中心”公共平台,而平台自身并不承担业务逻辑,“调度中心”负责发起调度请求。
2.将任务抽象成分散的 JobHandler,交由执行器统一管理,执行器负责接收调度请求并执行对应的JobHandler 中业务逻辑。
因此,调度和任务可以互相解耦,提高系统整体的稳定性和扩展性。
1.2 XXL-JOB核心组件
调度模块(调度中心):负责管理调度信息按照调度配置自身不承担业务代码。调度系统与任务解耦,提高了系统可用性和稳定性,同时调度系统性能不再受限于任务模块;支持可视化、简单且动态的管理调度信息,包括任务新建,更新,删除,GLUE开发任务报警类所有上述操作都会实时生效禾口?,同时支持监控调度结果以及执行日志,支持执行器Failover.
执行模块(执行器):负责接收调度请求并执行任务逻辑。任务块专注于任务的执行等操作,开发和维护更加简单和高效;接收“调度中心”的执行请求、终止请求和日志请求等。
1.2 XXL-JOB特点
- 简单:支持通过 web 页面对任务进行 CRUD 操作,操作作简单,一分钟上手。
- 动态:支持动态修改任务状态启动/停止任务,以及终止运行中任务,即时生效。
- 调度中心 HA(中心式):调度采用中心式设让,“调度中心”自研调度组件并支持集群部署,可保证调度中心HA。
- 执行器 HA(分布式):任务分布式执行,任务"执行器"支持集群部署,可保证任务执行HA。
- 注册中心:执行器会周期性自动注册任务,调度中心将会自动发现注册的任务并触发执行,同时,也支持手动录入执行器。
- 自定义任务参数支持在线配置调度任务入参,即时生效。
- 任务依赖:支持配置子任务依赖,当父任务执行结束且执行成功后将会主动触发一次子任务的执行,多个子任务用逗号分隔。
- 弹性扩容缩容:一旦有新执行器机器上线或者下线,下次调度时将会重新分配任务。
- 路由策略:执行器集群部署时提供丰富的路由策略,包括:第一个、最后一个、轮询、随机、一致性 HASH、最不经常使用、最近最久未使用、故障转移、忙碌转移等。
- 故障转移:任务路由策略选择"故障转移"情况下,如果执行器集群中某一台机器故障,将阻塞处理策略:调度过于密集执行器来不及处理时的处理策略,策略包括:单机串行(默认)、丢弃后续调度、覆盖之前调度。
- 事件触发:除了"cron,方式"和"任务依赖方式"触发任务执行之外,支持基于事件的触发任务方式。调度中心提供触发任务单次执行的 API 服务,可根据业务事件灵活触发。
- 任务进度监控:支持实时监控任务进度。
- Rolling 实时日志:支持在线查看调度结果,并且支持以
Rolling方式实时查看执行器输出的完整的执行日志。 - ...
安装xxl-job
下载源码
下载地址:(gitee.com/xuxueli0323…)
注意不要 clone 最新的 master 分支代码,master是正在开发的,应该点击 Releases 进入发布页面下载稳定版本(2.2.0),下载下来的源码如下:
- doc:文档资料,包括"调度数据库"建表脚本
- xxl-job-core:公共 Jar 依赖
- xxl-job-admin:调度中心,项目源码,spring boot 项目,可以直接启动
- xxl-job-executor-samples:执行器,sample 示例项目,其中的 spring boot 工程,可以直接启动。可以在该项目上进行开发,也可以将现有项目改造生成执行器项目。
初始化数据库
数据库脚本在 doc/db 目录下: 将这个sql在本地执行一下,执行完以后会生成8张表,它们的作用分别如下:
| 表名 | 作用 |
|---|---|
| xxl_job_group | 执行器信息表:维护任务执行器信息 |
| xxl_job_info | 调度扩展信息表:用于保存xxl-job调度任务的扩展信息,如任务分组、任务名、机器地址、执行器、执行入参和报警邮件等等 |
| xxl_job_lock | 任务调度锁表 |
| xxl_job_log | 调度日志表:用于保存xxl-job调度任务的历史信息,如调度结果、执行结果、调度入参、调度机器和执行器等等 |
| xxl_job_log_report | 调度日志报表:用户存储xxl-job任务调度日志的报表,调度中心报表功能页面会用到 |
| xxl_job_logglue | 任务GLUE日志:用于保存GLUE更新历史,用于支持GLUE的版本回溯功能 |
| xxl_job_registry | 执行器注册表,维护在线的执行器和调度中心机器地址信息 |
| xxl_job_user | 系统用户表 |
安装调度中心
上文介绍过 xxl-job 的架构体系,分为调度中心和执行器,下载下来的源码是把这两个放一起的,admin 和executor 的项目可以单独复制出来(两个spring boot工程),修改一下 pom 文件。实际上开发、运行的时候肯定也是独立的工程。
我们把 xxl-job-admin 单独拷到一个项目出来
pom文件里要引用 xxl-job-core
然后是修改配置文件application.properties里的值,主要是端口、数据库的配置
properties
### xxl-job, datasource
spring.datasource.url=jdbc:mysql://127.0.0.1:3306/xxl_job?useUnicode=true&characterEncoding=UTF-8&autoReconnect=true&serverTimezone=Asia/Shanghai
spring.datasource.username=root
spring.datasource.password=123456
spring.datasource.driver-class-name=com.mysql.cj.jdbc.Driver
显式的加上登录调度中心的账号密码
properties
xxl.job.login.username=admin
xxl.job.login.password=123456
好,然后启动项目,spirng boot 项目应该大家都会启动的哈,输入自己设置的账号密码 登录,搞定!