分布式作业调度(定时任务)系统xxl-job快速上手及高级功能简述

分布式作业调度(定时任务)系统xxl-job快速上手及高级功能简述

文章目录

  • 分布式作业调度(定时任务)系统xxl-job快速上手及高级功能简述
    • 简单介绍
    • 快速启动
      • 下载源码
      • 准备MySQL数据库,建库表
      • 修改配置文件
        • 修改为自己的数据库地址
      • 运行
      • 浏览器查看
      • 后面自己可以瞎点,熟悉基本功能,看看高级功能,最后看看源码
    • 高级功能
      • 多种任务路由策略
      • 执行器上报执行结果
      • 实时查看系统日志
      • 分片调度
      • 通讯
    • 整体设计
      • 总体架构图
      • 设计思想
      • 全异步化 & 轻量级
    • 高可用
      • 执行器高可用
      • admin调度中心高可用
      • 任务处理失败高可用(故障转移)
    • 源码分析

作业调度(定时任务)系统作为一个分布式系统中的一环,xxl-job在业内也是几个比较出名的一个,所以来看看这款到底有什么优点。

简单介绍

一款作业调度框架,包括admin调度中心和执行器,admin调度中心需要单独部署,负责进行任务管理调度以及执行统计。执行器一般是我们自己的服务,引入xxl-job的jar包,开启服务,等着被admin调度中心调用。

官网写了很多特性,直接复制过来吧,一般过一眼,然后根据自己的业务选择是否合适自己的业务

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、权限控制:执行器维度进行权限控制,管理员拥有全量权限,普通用户需要分配执行器权限后才允许相关操作;

快速启动

xxl-job是为数不多框架中,快速上手,能直接运行的。

下载源码

下载源码:https://github.com/xuxueli/xxl-job/
网络不好的同学可以使用: https://gitee.com/xuxueli0323/xxl-job

使用idea下载源码,然后切到最新的分支

准备MySQL数据库,建库表

连上自己的数据库,然后执行下sql语句

“调度数据库初始化SQL脚本” 位置为: /xxl-job/doc/db/tables_xxl_job.sql

修改配置文件

修改为自己的数据库地址

分布式作业调度(定时任务)系统xxl-job快速上手及高级功能简述_第1张图片

运行

分布式作业调度(定时任务)系统xxl-job快速上手及高级功能简述_第2张图片

浏览器查看

输入地址: http://127.0.0.1:8080/xxl-job-admin/
初始化账号密码: admin / 123456
分布式作业调度(定时任务)系统xxl-job快速上手及高级功能简述_第3张图片

后面自己可以瞎点,熟悉基本功能,看看高级功能,最后看看源码

高级功能

多种任务路由策略

第一个(FIRST)、LAST(最后一个)、轮询(ROUND)、随机(RANDOM)、CONSISTENT_HASH(一致性 HASH)、最不经常使用(LEAST_FREQUENTLY_USED)、最近最久未使用(LEAST_RECENTLY_USED)、分片广播(SHARDING_BROADCAST)路由策略

执行器上报执行结果

执行器会将任务执行情况上报给admin调度中心

执行器因网络抖动回调失败或宕机等异常情况,会导致任务调度结果丢失。由于调度中心依赖执行器回调来感知调度结果,因此会导致调度日志永远处于 “运行中” 状态。

针对该问题,调度中心提供内置组件进行处理,逻辑为:调度记录停留在 “运行中” 状态超过10min,且对应执行器心跳注册失败不在线,则将本地调度主动标记失败;

实时查看系统日志

在admin调度中心,可以查看任务执行的日志

分片调度

admin持有所有的执行器信息,有一个总数和分片数量,可以路由到不同的机器

通讯

使用http进行通讯。客户端使用netty开的一个服务

整体设计

总体架构图

反正基本有xxl-job的文章都有这图,我就放上来吧
分布式作业调度(定时任务)系统xxl-job快速上手及高级功能简述_第4张图片

设计思想

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

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

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

全异步化 & 轻量级

全异步化设计:XXL-JOB系统中业务逻辑在远程执行器执行,触发流程全异步化设计。相比直接在调度中心内部执行业务逻辑,极大的降低了调度线程占用时间;
异步调度:调度中心每次任务触发时仅发送一次调度请求,该调度请求首先推送“异步调度队列”,然后异步推送给远程执行器
异步执行:执行器会将请求存入“异步执行队列”并且立即响应调度中心,异步运行。
轻量级设计:XXL-JOB调度中心中每个JOB逻辑非常 “轻”,在全异步化的基础上,单个JOB一次运行平均耗时基本在 “10ms” 之内(基本为一次请求的网络开销);因此,可以保证使用有限的线程支撑大量的JOB并发运行;
得益于上述两点优化,理论上默认配置下的调度中心,单机能够支撑 5000 任务并发运行稳定运行;

高可用

执行器高可用

执行器一般是自己的业务系统,保证业务系统多台进行路由即可

admin调度中心高可用

部署2台机器,前面挂一层nginx。

因为机器变多,那肯定有一个问题,如何避免job被执行2次? 基于数据库的分布式锁,“select * from xxl_job_lock where lock_name = ‘schedule_lock’ for update”。任务调度前需要获取锁,才能往下进行调度

基于数据库的集群方案,数据库选用Mysql;集群分布式并发环境中进行定时任务调度时,会在各个节点会上报任务,存到数据库中,执行时会从数据库中取出触发器来执行,如果触发器的名称和执行时间相同,则只有一个节点去执行此任务
分布式作业调度(定时任务)系统xxl-job快速上手及高级功能简述_第5张图片

任务处理失败高可用(故障转移)

执行器如若集群部署,调度中心将会感知到在线的所有执行器,如“127.0.0.1:9997, 127.0.0.1:9998, 127.0.0.1:9999”。

任务”路由策略”选择”故障转移(FAILOVER)”时,当调度中心每次发起调度请求时,会按照顺序对执行器发出心跳检测请求,第一个检测为存活状态的执行器将会被选定并发送调度请求。

源码分析

下回分解

你可能感兴趣的:(分布式框架,xxl-job,java,分布式,xxl-,xxl-job,作业调度)