xxl-job分布式定时任务

644 阅读6分钟

XXL-JOB分布式调度框架全面详解

一. XXL-JOB概述

1.1 XXL-JOB是什么?

  • 官方说明:XXL-JOB是一个轻量级分布式任务调度平台,其核心设计目标是开发迅速、学习简单、轻量级、易扩展。现已开放源代码并接入多家公司线上产品线,开箱即用。

  • 通俗来讲:XXL-JOB是一个任务调度框架,通过引入XXL-JOB相关的依赖,按照相关格式撰写代码后,可在其可视化界面进行任务的启动执行中止以及包含了日志记录与查询任务状态监控

  • Quartz的不足:Quartz作为开源任务调度中的佼佼者,是任务调度的首选。但是在集群环境中,Quartz采用API的方式对任务进行管理,这样存在以下问题:

    • 通过调用API的方式操作任务,不人性化。
    • 需要持久化业务的QuartzJobBean到底层数据表中,系统侵入性相当严重。
    • 调度逻辑和QuartzJobBean耦合在同一个项目中,这将导致一个问题,在调度任务数量逐渐增多,同时调度任务逻辑逐渐加重的情况下,此时调度系统的性能将大大受限于业务。 image.png
  • 一般定时任务的不足:

    • 不支持集群。
    • 不支持任务重试
    • 不支持动态调用规则
    • 无报警机制
    • 不支持生命周期的统一管理
    • 任务数据的难以统计

XXL-JOB弥补了Quartz的上述不足之处。

1.2 XXL-JOB架构图

image.png

架构设计

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 项目应该大家都会启动的哈,输入自己设置的账号密码 登录,搞定!