基于线程池隔离调度中心节点触发任务调度程序设计

支持页面对任务CRUD操作;

支持在页面编撰脚本任务、命令行任务、Java代码任务并执行;

支持任务级联编排,父任务执行结束后触发子任务执行;

支持设置任务优先级;

支持设置指定任务执行节点路由策略,包括寻址、随机、广播、故障转移、忙碌转移等;

支持Cron形式、任务依赖、调度中心API插口方法触发任务执行

调度中心基于线程池多线程触发调度任务,快任务、慢任务基于线程池隔离调度,提供系统性能和稳定性;

任务调度流程全异步化设计实现,如异步调度、异步运行、异步反弹等,有效对密集调度进行流量削峰;

任务调度中心、任务执行节点均集群布署,支持动态扩充、故障转移

支持任务配置路由故障转移策略,执行器节点不可用是手动转移到其他节点执行

支持任务超时控制、失败重试配置

支持任务处理阻塞策略:调度当任务执行节点繁忙时来不及执行任务的处理策略,包括:串行、抛弃、覆盖策略

支持设置任务失败电邮告警,预留插口支持邮件、钉钉告警;

支持实时查看任务执行运行数据统计图表、任务进度监控数据、任务完整执行日志;

系统设计

1设计思路

将调度行为具象产生“调度中心”公共平台,而平台自身并不承当业务逻辑,“调度中心”负责发起调度恳求;

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

为此,“调度”和“任务”两部份可以互相前馈,增强系统整体稳定性和扩充性;

2系统组成

3工作原理

4HA设计

4.1调度中心高可用

调度中心支持多节点布署,基于数据库行锁保证同时只有一个调度中心节点触发任务调度,参考com.xxl.job.admin.core..#start

Connection conn = XxlJobAdminConfig.getAdminConfig().getDataSource().getConnection();
connAutoCommit = conn.getAutoCommit();
conn.setAutoCommit(false);
preparedStatement = conn.prepareStatement( "select * from xxl_job_lock where lock_name = 'schedule_lock' for update" );
preparedStatement.execute();
# 触发任务调度
# 事务提交
 conn.commit();

4.2任务调度高可用

调度中心基于路由策略路由选择一个执行器节点执行任务,XXL-JOB提供了如下路由策略保证任务调度高可用:

繁忙转移策略:下发任务前向执行器节点发起rpc脉搏恳求查询是否繁忙,倘若执行器节点返回繁忙则转移到其他执行器节点执行(参考com.xxl.job.admin.core.route..r)

故障转移策略:下发任务前向执行器节点发起rpc脉搏恳求查询是否在线,倘若执行器节点没返回或则返回不可用则转移到其他执行器节点执行(参考com.xxl.job.admin.core.route..r)

当执行器节点存在多个相同任务id的任务未执行完成,则须要基于阻塞策略对任务进行抉择:

串行策略:默认策略,任务进行排队、丢弃旧任务策略、丢弃新任务策略

(参考:com.xxl.job.core.biz.impl.#run)

同类框架比较

特点-job--依赖MySQL、、、、、maven高可用多节点布署,通过竞争数据库锁来保证只有一个节点执行任务通过的注册与发觉,可以动态的添加服务器基于竞争数据库锁保证只有一个节点执行任务,支持水平扩容。可以自动降低定时任务,启动和暂停任务,有监控集群布署,可以动态的添加服务器。可以自动降低定时任务,启动和暂停任务。有监控任务分片×√√√管理界面×√√√难易程度简单简单简单略复杂中级功能-弹性扩容,多种作业模式,失效转移,运行状态搜集,多线程处理数据,幂等性,容错处理,命名空间支持弹性扩容,分片广播,故障转移,实时日志,GLUE(支持在线编辑代码任务平台,免发布),任务进度监控,任务依赖,数据加密,短信报案,运行报表,国际化支持,boot,业务日志记录器,SPI扩充支持,故障转移,节点监控,多元化任务执行结果支持,容错,动态扩容。版本更新半年没更新2年没更新近来有更新1年没更新

使用

快速上手

具体怎么快速上手使用,官方文档:早已介绍得比较详尽和清楚,不再赘言

注意事项

调度中心和任务执行器须要时间同步,同步时间偏差须要在3分钟内,否则抛出异常

参考:com.xxl.rpc...y#

if (System.currentTimeMillis() - xxlRpcRequest.getCreateMillisTime() > 3*60*1000) {
 xxlRpcResponse.setErrorMsg("The timestamp difference between admin and executor exceeds the limit.");
 return xxlRpcResponse;
}

任务由调度中心触发,根据在调度中心设置任务的cron表达式触发时,须要注意布署调度中心的机器所在的时区,根据该时区多样化cron表达式

调度中心完成任务下发,执行器在执行任务的过程中,倘若执行器忽然服务宕掉,会造成任务的执行问题在调度中心是执行中,调度中心并不会发起失败重试。虽然任务设置了超时时间,执行器宕掉造成造成任务长时间未执行完成,调度中心界面也不会听到任务超时,由于任务超时是由执行器测量的并上报给调度中心的

因而遇见任务长时间未执行完成,可以关注是否发生了执行器忽然服务宕掉

执行器执行任务基于线程池异步执行,当须要重启时须要注意线程池中还有未执行完成任务的问题,须要高贵停机,可以直接基于.()高贵停机,注意该方式在v2.0.2之前的版本存在bug造成难以高贵停机,v2.0.2及以后的版本才修补(参考:

当执行器节点部份服务不可用,比如节点c盘受损,但在调度中心一直处于在线时,调度中心仍可能基于路由策略(包括故障转移策略)路由到该未下线的节点,并不断重试任务平台,不断失败,致使重试次数用尽。所以路由策略尽量不要采用固定化策略,比如固定第一个、固定最后一个

总结

XXL-JOB上手还是比较简单,项目源码还是比较整洁,容易看懂,学习以后可以愈发深入理解分布式系统设计、网络通讯、多线程协同处理等知识点,推荐阅读​

标签: 线程池 任务调度 高可用 路由