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