XXL-JOB 原理浅析
Emac
2021/4
产生背景
XXL-JOB是一个分布式任务调度平台,其核心设计目标是开发迅速、学习简单、轻量级、易扩展。
1.0版本发布于2015年(和elastic-job同年),最早基于quartz框架进行调度,后改为自研。
官网:https://www.xuxueli.com/xxl-job/
GitHub: https://github.com/xuxueli/xxl-job/
适用场景
- Spring框架
- 微服务应用
框架取舍
取:
- 轻量级
- 高性能
- 线程池隔离
- 全异步调度
- 高可用
- 集群部署
- 路由策略、调度过期策略、阻塞处理策略
- 失败重试
舍:
- 预先注册执行器、任务
- 不适用高精度调度场景
- 不适用超高频调度场景
同类对比
xxl-job | quartz | elastic-job | |
---|---|---|---|
框架依赖 | MySQL | MySQL | ZooKeeper |
中心化 | 是 | 否 | 否 |
高可用 | 调度中心:支持集群部署,通过DB锁保证同一时间只有一个节点能够进行调度 执行器:支持水平扩容,节点自动注册 |
支持水平扩容,通过DB锁保证同一时间只有一个节点能够执行任务 | 支持水平扩容,节点自动注册 通过ZK锁选举主节点,主节点处理分片、清理工作 |
任务分片 | 支持 | 不支持 | 支持 |
管理界面 | 有 | 没有 | 有 |
高级特性 | 路由策略、调度过期策略、阻塞处理策略、任务超时控制、任务失败重试、任务失败告警、任务依赖、GLUE | 非DB作业仓库(内存,Terracotta) | 失效转移、错过任务重执行、作业开放生态、错误处理策略 |
最新版本 | 2.3.0 (2021/2) | 2.3.2 (2019/1) | 3.0.0-RC1 (2020/12) |
系统架构
关键技术
时间轮
调度算法
路由策略 / ExecutorRouteStrategyEnum
- FIRST(第一个):固定选择第一个机器;
- LAST(最后一个):固定选择最后一个机器;
- ROUND(轮询):轮换选择一个机器;
- RANDOM(随机):随机选择在线的机器;
- CONSISTENT_HASH(一致性HASH):每个任务按照Hash算法固定选择某一台机器,且所有任务均匀散列在不同机器上。
- LEAST_FREQUENTLY_USED(最不经常使用):使用频率最低的机器优先被选举;
- LEAST_RECENTLY_USED(最近最久未使用):最久未使用的机器优先被选举;
- FAILOVER(故障转移):按照顺序依次进行心跳检测,第一个心跳检测成功的机器选定为目标执行器并发起调度;
- BUSYOVER(忙碌转移):按照顺序依次进行空闲检测,第一个空闲检测成功的机器选定为目标执行器并发起调度;
- SHARDING_BROADCAST(分片广播):广播触发对应集群中所有机器执行一次任务,同时系统自动传递分片参数;可根据分片参数开发分片任务;
阻塞处理策略 / ExecutorBlockStrategyEnum
- 单机串行(默认):调度请求进入单机执行器后,调度请求进入FIFO队列并以串行方式运行;
- 丢弃后续调度:调度请求进入单机执行器后,发现执行器存在运行的调度任务,本次请求将会被丢弃并标记为失败;
- 覆盖之前调度:调度请求进入单机执行器后,发现执行器存在运行的调度任务,将会终止运行中的调度任务并清空队列,然后运行本地调度任务;
调度中心:
- Web IDE:
codemirror库 - 版本回溯:
xxl_job_logglue表
执行器:
- 实时编译:
GroovyClassLoader - 依赖注入:
SpringGlueFactory
GLUE
其他特性
- 自研RPC
- 动态启停任务
- 执行超时
- 失败重试
- Rolling实时日志
- 国际化
That's
all!
XXL-JOB 原理浅析
By Emacoo Shen
XXL-JOB 原理浅析
- 2,316