xxljob是一种分布式的调度框架,所谓分布式调度,是指调度器和执行器不在同一个进程里,因此必须进行远程服务调用,也需要考虑高可用问题。
但是由于调度器维护的数据是落库而在各个节点间共享的,因此不需要考虑数据的一致性问题,而执行器由于是无状态的,集群节点间不需要同步数据,也不需要考虑数据一致性问题。
总体来看,这个架构相对简单。
1. 源码结构
xxl-job主要有3个repo,其中xxl-job-admin放置的是调度器相关的代码,也就是源码中将admin与调度器画上了等号。
xxl-job-core中包含了执行器(executor)的代码,以及执行器和调度器共有的代码。
xxl-job-executor-samples也源码提供的一些样例代码。
2. 执行流程
xxl-job架构比较简单,从总体上看,就是包含了调度器和执行器。调度器用于触发定时任务的执行,而执行器是负责具体的任务执行。
两者都可以进行集群部署,交互基于http协议。两者间的交互包括:
(1)执行器注册到调度器(首次注册,定时注册充当心跳功能),解除注册;
(2)调度器触发调度器执行任务;
(3)执行器执行完(成功/失败)任务后,回调调度器,返回执行结果。
2.1 调度器集群
调度器使用集群部署,可以达到高可用,也可以分散调度压力。
调度器集群没有采用master/slaver的模式,而是采用对等节点模式,各节点在调度任务时使用数据库悲观锁来消除任务的重复调度。
2.2 执行器集群
执行器所执行的任务一般是无状态的,因此可以随机选择一个执行器执行,或者将大任务进行分片进行分摊执行,达到降低执行器压力的目的。
3. 一些统一说明
xxl-job并不是对quartz的包装,没有引用quartz的引用。为什么这么说,虽然xxl-job中在对cron表达式解析时用到了quartz的代码,但这个cron的解析可以说是一种工具类,并不包含任务的架构设计理念。