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