目录
XXL-Job
XXL-JOB是一个分布式任务调度平台,其核心设计目标是开发迅速、学习简单、轻量级、易扩展。现已开放源代码并接入多家公司线上产品线,开箱即用。
特性
1、简单:支持通过Web页面对任务进行CRUD操作,操作简单,一分钟上手;
2、动态:支持动态修改任务状态、启动/停止任务,以及终止运行中任务,即时生效;
3、调度中心HA(中心式):调度采用中心式设计,"调度中心"自研调度组件并支持集群部署,可保证调度中心HA;
4、执行器HA(分布式):任务分布式执行,任务"执行器"支持集群部署,可保证任务执行HA;
5、注册中心: 执行器会周期性自动注册任务, 调度中心将会自动发现注册的任务并触发执行。同时,也支持手动录入执行器地址;
6、弹性扩容缩容:一旦有新执行器机器上线或者下线,下次调度时将会重新分配任务;
还有多种特性,具体可以查看官网:
链接: https://www.xuxueli.com/xxl-job/
系统组成
xxl-job分为 调度中心和执行器两大模块
调度模块(调度中心):
负责管理调度信息,按照调度配置发出调度请求,自身不承担业务代码。调度系统与任务解耦,提高了系统可用性和稳定性,同时调度系统性能不再受限于任务模块;
支持可视化、简单且动态的管理调度信息,包括任务新建,更新,删除,GLUE开发和任务报警等,所有上述操作都会实时生效,同时支持监控调度结果以及执行日志,支持执行器Failover。
执行模块(执行器):
负责接收调度请求并执行任务逻辑。任务模块专注于任务的执行等操作,开发和维护更加简单和高效;
接收"调度中心"的执行请求、终止请求和日志请求等。
架构图
将调度行为抽象形成"调度中心"公共平台,而平台自身并不承担业务逻辑,"调度中心"负责发起调度请求。
将任务抽象成分散的JobHandler,交由"执行器"统一管理,"执行器"负责接收调度请求并执行对应的JobHandler中业务逻辑。
调度模块剖析
调度线程池
调度采用线程池方式实现,避免单线程因阻塞而引起任务调度延迟。
并行调度
XXL-JOB调度模块默认采用并行机制,在多线程调度的情况下,调度模块被阻塞的几率很低,大大提高了调度系统的承载量。
XXL-JOB的不同任务之间并行调度、并行执行。
XXL-JOB的单个任务,针对多个执行器是并行运行的,针对单个执行器是串行执行的。同时支持任务终止。
过期处理策略
任务调度错过触发时间时的处理策略:
可能原因:服务重启;调度线程被阻塞,线程被耗尽;上次调度持续阻塞,下次调度被错过;
处理策略:
过期超5s:本次忽略,当前时间开始计算下次触发时间
过期5s内:立即触发一次,当前时间开始计算下次触发时间
调度中心HA(集群)
基于数据库的集群方案,数据库选用Mysql;集群分布式并发环境中进行定时任务调度时,会在各个节点会上报任务,存到数据库中,执行时会从数据库中取出触发器来执行,如果触发器的名称和执行时间相同,则只有一个节点去执行此任务。
任务 "运行模式" 剖析
"Bean模式" 任务
原理:每个Bean模式任务都是一个Spring的Bean类实例,它被维护在"执行器"项目的Spring容器中。任务类需要加"@JobHandler(value="名称")"注解,因为"执行器"会根据该注解识别Spring容器中的任务。任务类需要继承统一接口"IJobHandler",任务逻辑在execute方法中开发,因为"执行器"在接收到调度中心的调度请求时,将会调用"IJobHandler"的execute方法,执行任务逻辑。
"GLUE模式(Java)" 任务
原理:每个 "GLUE模式(Java)" 任务的代码,实际上是"一个继承自"IJobHandler"的实现类的类代码","执行器"接收到"调度中心"的调度请求时,会通过Groovy类加载器加载此代码,实例化成Java对象,同时注入此代码中声明的Spring服务(请确保Glue代码中的服务和类引用在"执行器"项目中存在),然后调用该对象的execute方法,执行任务逻辑。
GLUE模式(Shell) + GLUE模式(Python) + GLUE模式(PHP) + GLUE模式(NodeJS) + GLUE模式(Powershell)
原理:脚本任务的源码托管在调度中心,脚本逻辑在执行器运行。当触发脚本任务时,执行器会加载脚本源码在执行器机器上生成一份脚本文件,然后通过Java代码调用该脚本;并且实时将脚本输出日志写到任务日志文件中,从而在调度中心可以实时监控脚本运行情况;
执行器
执行器实际上是一个内嵌的Server,默认端口9999(配置项:xxl.job.executor.port)。
在项目启动时,执行器会通过"@JobHandler"识别Spring容器中"Bean模式任务",以注解的value属性为key管理起来。
"执行器"接收到"调度中心"的调度请求时,如果任务类型为"Bean模式",将会匹配Spring容器中的"Bean模式任务",然后调用其execute方法,执行任务逻辑。如果任务类型为"GLUE模式",将会加载GLue代码,实例化Java对象,注入依赖的Spring服务(注意:Glue代码中注入的Spring服务,必须存在与该"执行器"项目的Spring容器中),然后调用execute方法,执行任务逻辑。
工作流程
1、"调度中心"向"执行器"发送http调度请求: "执行器"中接收请求的服务,实际上是一台内嵌Server,默认端口9999;
2、"执行器"执行任务逻辑;
3、"执行器"http回调"调度中心"调度结果: "调度中心"中接收回调的服务,是针对执行器开放一套API服务;