5xxljob高级特性和执行原理解析

任务调度机制的设计方法
xxl-job的基本工作原理

任务调度的设计方法

任务调度的核心问题

  • 任务调度过程和业务代码解耦
  • 确保集群环境下多个相同实例不会重复多次执行一个调度任务
  • 如何确定哪个服务实例执行调度任务
  • 如果一个调度任务短时间内重复出发,应该怎么办
  • 调度任务执行失败了,怎么办

xxl-job调度和执行机制

架构

分层架构 3层

  • 调度中心(服务端)
  • 服务实例(客户端)
  • 任务(客户端)
    客户端 启动 心跳 保活
    服务端 探针

任务调度方案

  • 线程启动,sleep,到时启动
    开启线程,线程sleep资源浪费(一个任务一个线程)
  • 守护线程循环扫描任务数据
    长任务阻塞(n个任务一个线程)
  • 调度线程+线程池

xxl如何实现任务调度

时间轮结构+任务调度

时间轮

将时间映射到环形结构,环形结构分刻度(槽位),每个槽位代表一个时间间隔(秒/毫秒)

将时间划分为一系列环形槽位,每个槽位代表一个时间间隔(秒/毫秒)

任务调度

调度线程将待执行任务放置到任务下次出发对应的槽位,时间轮处理线程ringThread即可消费这些任务。

具体实现

任务调度线程每秒查询 当前时间至其后五秒内待处理任务

  • 已超时5s的任务
    根据调度过期策略执行(忽略/立即执行一次)
  • 过期小于5s的任务
    立即执行一次,并判断下次出发时间在5s内,则将其放入时间轮,等待下次出发
  • 未到出发时间的任务
    放入时间轮等待处理

一致性问题

数据库排他锁,保证多服务实例只一个实例执行

调用路由策略

第一个
随机
一致性Hash
LRU

阻塞处理策略

同一个实例中同一个任务,短时间内重复提交,导致阻塞。

  • 单机串行,导致任务阻塞越来越多
  • 丢弃后续调度,丢弃重复任务(推荐)
  • 覆盖之前调度,终止运行中的任务,运行本地调度(不推荐)

容错策略 Failover

超时
重试
故障转移(只能在调度阶段)

xxl-job任务调度整体流程

https://iling.me/blog/posts/development-and-principles-of-xxl-job/#%E4%BB%BB%E5%8A%A1%E8%B0%83%E5%BA%A6%E7%BA%BF%E7%A8%8B
https://developer.baidu.com/article/details/3257612