XXL-JOB分布式任务调度

一、什么是任务调度

任务调度是指系统为了自动完成特定任务,在约定的特定时刻去执行任务的过程。有了任务调度即可解放更多的人力由系统自动去执行任务。

二、什么是分布式调度?

由于采用微服务架构,一个服务往往会部署多个冗余实例来运行我们的业务,在这种分布式系统环境下运行任务调度,我们称之为分布式任务调度

分布式任务调度面临着许多挑战:

  • 分布式环境下的任务调度:在分布式环境下,任务调度需要考虑如何在多个节点之间分配任务,以及如何监控和管理这些节点上的任务执行。

  • 可扩展性:随着任务量的增加,任务调度系统需要具备可扩展性,以便能够处理大规模任务的并发执行。

  • 任务执行状态的可见性:在分布式环境下,任务可能会在多个节点上执行,因此需要确保任务的执行状态对于整个系统的所有组件都是可见的。

  • 容错性:由于节点之间的通信可能会发生故障,任务调度系统需要具备容错性,以便在节点故障时能够正确地处理任务。

  • 数据一致性:在分布式环境下,任务调度系统需要确保任务的执行结果和状态数据的一致性,以避免数据错误或不一致的情况发生。

  • 安全性:分布式任务调度系统需要保证数据和任务的安全,以避免机密信息泄露或系统被攻击的风险。

三、XXL-JOB国产开源分布式任务调度系统

1、XXL-JOB介绍

XXL-JOB是一个分布式任务调度平台

官网地址:分布式任务调度平台XXL-JOB

GitHub地址:GitHub - xuxueli/xxl-job: A distributed task scheduling framework.(分布式任务调度平台XXL-JOB)

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

特性如下:(简单了解即可不用死记)

  • 1、简单:支持通过Web页面对任务进行CRUD操作,操作简单,一分钟上手;

  • 2、动态:支持动态修改任务状态、启动/停止任务,以及终止运行中任务,即时生效;

  • 3、调度中心HA(中心式):调度采用中心式设计,“调度中心”自研调度组件并支持集群部署,可保证调度中心HA;

  • 4、执行器HA(分布式):任务分布式执行,任务”执行器”支持集群部署,可保证任务执行HA;

  • 5、注册中心: 执行器会周期性自动注册任务, 调度中心将会自动发现注册的任务并触发执行。同时,也支持手动录入执行器地址;

  • 6、弹性扩容缩容:一旦有新执行器机器上线或者下线,下次调度时将会重新分配任务;

  • 7、触发策略:提供丰富的任务触发策略,包括:Cron触发、固定间隔触发、固定延时触发、API(事件)触发、人工触发、父子任务触发;

  • 8、调度过期策略:调度中心错过调度时间的补偿处理策略,包括:忽略、立即补偿触发一次等;

  • 9、阻塞处理策略:调度过于密集执行器来不及处理时的处理策略,策略包括:单机串行(默认)、丢弃后续调度、覆盖之前调度;

  • 10、任务超时控制:支持自定义任务超时时间,任务运行超时将会主动中断任务;

  • 11、任务失败重试:支持自定义任务失败重试次数,当任务失败时将会按照预设的失败重试次数主动进行重试;其中分片任务支持分片粒度的失败重试;

  • 12、任务失败告警;默认提供邮件方式失败告警,同时预留扩展接口,可方便的扩展短信、钉钉等告警方式;

  • 13、路由策略:执行器集群部署时提供丰富的路由策略,包括:第一个、最后一个、轮询、随机、一致性HASH、最不经常使用、最近最久未使用、故障转移、忙碌转移等;

  • 14、分片广播任务:执行器集群部署时,任务路由策略选择”分片广播”情况下,一次任务调度将会广播触发集群中所有执行器执行一次任务,可根据分片参数开发分片任务;

  • 15、动态分片:分片广播任务以执行器为维度进行分片,支持动态扩容执行器集群从而动态增加分片数量,协同进行业务处理;在进行大数据量业务操作时可显著提升任务处理能力和速度。

  • 16、故障转移:任务路由策略选择”故障转移”情况下,如果执行器集群中某一台机器故障,将会自动Failover切换到一台正常的执行器发送调度请求。

  • 17、任务进度监控:支持实时监控任务进度;

  • 18、Rolling实时日志:支持在线查看调度结果,并且支持以Rolling方式实时查看执行器输出的完整的执行日志;

  • 19、GLUE:提供Web IDE,支持在线开发任务逻辑代码,动态发布,实时编译生效,省略部署上线的过程。支持30个版本的历史版本回溯。

  • 20、脚本任务:支持以GLUE模式开发和运行脚本任务,包括Shell、Python、NodeJS、PHP、PowerShell等类型脚本;

  • 21、命令行任务:原生提供通用命令行任务Handler(Bean任务,”CommandJobHandler”);业务方只需要提供命令行即可;

  • 22、任务依赖:支持配置子任务依赖,当父任务执行结束且执行成功后将会主动触发一次子任务的执行, 多个子任务用逗号分隔;

  • 23、一致性:“调度中心”通过DB锁保证集群分布式调度的一致性, 一次任务调度只会触发一次执行;

  • 24、自定义任务参数:支持在线配置调度任务入参,即时生效;

  • 25、调度线程池:调度系统多线程触发调度运行,确保调度精确执行,不被堵塞;

  • 26、数据加密:调度中心和执行器之间的通讯进行数据加密,提升调度信息安全性;

  • 27、邮件报警:任务失败时支持邮件报警,支持配置多邮件地址群发报警邮件;

  • 28、推送maven中央仓库: 将会把最新稳定版推送到maven中央仓库, 方便用户接入和使用;

  • 29、运行报表:支持实时查看运行数据,如任务数量、调度次数、执行器数量等;以及调度报表,如调度日期分布图,调度成功分布图等;

  • 30、全异步:任务调度流程全异步化设计实现,如异步调度、异步运行、异步回调等,有效对密集调度进行流量削峰,理论上支持任意时长任务的运行;

  • 31、跨语言:调度中心与执行器提供语言无关的 RESTful API 服务,第三方任意语言可据此对接调度中心或者实现执行器。除此之外,还提供了 “多任务模式”和“httpJobHandler”等其他跨语言方案;

  • 32、国际化:调度中心支持国际化设置,提供中文、英文两种可选语言,默认为中文;

  • 33、容器化:提供官方docker镜像,并实时更新推送dockerhub,进一步实现产品开箱即用;

  • 34、线程池隔离:调度线程池进行隔离拆分,慢任务自动降级进入”Slow”线程池,避免耗尽调度线程,提高系统稳定性;

  • 35、用户管理:支持在线管理系统用户,存在管理员、普通用户两种角色;

  • 36、权限控制:执行器维度进行权限控制,管理员拥有全量权限,普通用户需要分配执行器权限后才允许相关操作;

2、部署XXL-JOB

2.1、使用Git拉取代码

注意查看Maven的全局配置,避免出现问题!!!

直接在IDEA的首页选择Get from VCS

输入项目的Git地址:

项目结构如下:

目录说明如下:

xxl-job-admin:调度中心
xxl-job-core:公共依赖
xxl-job-executor-samples:执行器Sample示例(选择合适的版本执行器,可直接使用,也可以参考其并将现有项目改造成执行器)
    :xxl-job-executor-sample-springboot:Springboot版本,通过Springboot管理执行器,推荐这种方式;
    :xxl-job-executor-sample-frameless:无框架版本;

2.2、初始化 “调度数据库”

“调度数据库初始化SQL脚本” 位置为:

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

直接将该SQL脚本拖到Navicat中执行即可。

注意:

  • 调度中心支持集群部署,集群情况下各节点务必连接同一个mysql实例。

  • 如果mysql做主从,调度中心集群节点务必强制走主库。

2.3、配置部署“调度中心”

打开 xxl-job-admin 的全局配置文件application.properties,修改以下内容:

access token代码如下

xxl.job.accessToken=dasj2nd81jf9asjdkl5jk234

然后就可以运行启动类启动整个 xxl-job-admin 项目。

在浏览器中输入http://localhost:8080/xxl-job-admin/

账号:admin
密码:123456

即可登录XXL-admin的控制台。

至此 “调度中心” 项目已经部署成功。

2.4、配置部署“执行器”

打开 xxl-job-executor-sample-springboot 的全局配置文件application.properties,修改以下内容:

然后运行启动类启动即可。

2.5、测试运行

打开 任务管理,修改测试任务1

执行测试任务

观察E:/xxl-job-logs的日志输出情况

由于之前备课的时候,执行过很多次,所以这里不是从1开始的,而是从10开始的。

若要停止,则选择 停止 即可

四、XXL-JOB架构分析与关键设计

1、架构图

架构图如下:

2、设计思想

将调度行为抽象形成“调度中心”公共平台,而平台自身并不承担业务逻辑,“调度中心” 负责发起调度请求。

将任务抽象成分散的JobHandler,交由 “执行器” 统一管理,“执行器” 负责接收调度请求并执行对应的JobHandler中业务逻辑。

因此,“调度”和“任务”两部分可以相互解耦,提高系统整体稳定性和扩展性;

3、系统组成

● 调度模块(调度中心):

负责管理调度信息,按照调度配置发出调度请求,自身不承担业务代码。调度系统与任务解耦,提高了系统可用性和稳定性,同时调度系统性能不再受限于任务模块;

支持可视化、简单且动态的管理调度信息,包括任务新建,更新,删除,GLUE开发和任务报警等,所有上述操作都会实时生效,同时支持监控调度结果以及执行日志,支持执行器Failover。

● 执行模块(执行器):

负责接收调度请求并执行任务逻辑。任务模块专注于任务的执行等操作,开发和维护更加简单和高效;

接收“调度中心”的执行请求、终止请求和日志请求等。

4、整体执行流程

5、执行器注册流程

在执行器启动时,执行器会根据配置的调用中心地址,调用对应的接口了实现执行器的注册(以便后续调用器进行调度),注册后每隔30S还会进行一次心跳,证明自己还活着,在关闭时也会调用接口将自己摘除。

xxl-job整体没有使用zookeeper之类的注册中心,在接收到执行器的注册请求后,会新增(更新)执行器的信息到对应的MySQL表(xxl_job_registry)中,同时在接收到心跳请求时更新其中的update_time字段。

调用中心内部有一个检测线程,每隔30S检测一次,当发现有执行器3次都没有心跳(当前时间 - 最后一次更新时间 > 30S)时,认为这个执行器已下线,此时删除对应的记录(同时也会更新执行器记录中的执行器地址信息)。

6、调度中心调度

7、“调度数据库”配置

XXL-JOB调度模块基于自研调度组件并支持集群部署,调度数据库表说明如下:

1. `- xxl_job_lock:任务调度锁表;`
2. `- xxl_job_group:执行器信息表,维护任务执行器信息;`
3. `- xxl_job_info:调度扩展信息表: 用于保存XXL-JOB调度任务的扩展信息,如任务分组、任务名、机器地址、执行器、执行入参和报警邮件等等;`
4. `- xxl_job_log:调度日志表: 用于保存XXL-JOB任务调度的历史信息,如调度结果、执行结果、调度入参、调度机器和执行器等等;`
5. `- xxl_job_log_report:调度日志报表:用户存储XXL-JOB任务调度日志的报表,调度中心报表功能页面会用到;`
6. `- xxl_job_logglue:任务GLUE日志:用于保存GLUE更新历史,用于支持GLUE的版本回溯功能;`
7. `- xxl_job_registry:执行器注册表,维护在线的执行器和调度中心机器地址信息;`
8. `- xxl_job_user:系统用户表;`

  • 23
    点赞
  • 24
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值