xxl-job(分布式调度中心)
2021-03-01 23:52:05 2 举报
AI智能生成
xxl-job(分布式调度中心)
作者其他创作
大纲/内容
Spring原生定时任务的缺陷
不支持集群部署
避免任务重复执行,存在单点故障
不支持动态管理
不重启任务情况下,关闭和启动任务,修改cron表达式等
不支持失败重试
出现异常后任务终结,不能根据执行状态,控制任务重新执行
不支持分片任务
在处理有序数据时,不能多机器分片执行任务处理不同数据
无报警机制
任务失败后不能发送报警通知
任务数据难以统计
任务数据量大时,对于任务执行情况无法高效统计
基本概念
作业调度
作业
即任务,是需要计算机去执行的具体业务逻辑
调度器
根据预设好的调度规则调用对应的执行器执行作业
执行器
接受调度器的调度,是具体作业的执行者
调度架构
中心化
中心化的调度系统存在调度中心的概念,所有的调度都是由调度中心进行统筹协调
去中心化
去中心化的调度系统没有调度中心的概念,所有的任务都能够实行自治,即自行判断是否要执行任务
调度方式
作业竞争
多个执行器竞争一个任务,同一个任务只能由一个执行器竞争获取然后执行
作业预分配
调度器预先分配好任务执行节点,不需要执行器进行竞争执行权
功能特性
特点
xxl-job是一个轻量级分布式任务调度平台
属于中心化、作业竞争的分布式调度中间件
功能
动态化
支持动态修改任务状态、启动/停止任务,以及终止运行中任务,即时生效
事件触发
调度中心提供触发任务单次执行的API服务,可根据业务事件灵活触发
Rolling实时日志
支持在线查看调度结果,并且支持以Rolling方式实时查看执行器输出的完整的执行日志
脚本任务
支持以GLUE模式开发和运行脚本任务,包括Shell、Python、NodeJS、PHP、PowerShell等类型脚本
自定义任务参数
支持在线配置调度任务入参,即时生效
邮件报警
支持配置多邮件地址群发报警邮件
运行报表
支持实时查看运行数据,如任务数量、调度次数、执行器数量等
实现原理
定时触发任务是如何实现的?
使用时间轮实现
xxl-job-info用来记录定时任务,其中trigger_next_time字段,表示下一次触发的时间点
如何避免集群中的多个服务器同时调度任务?
通过mysql悲观锁实现分布式锁(for update语句)
任务执行器注册中心是如何实现的?
使用db表xxl_job_group记录下执行器的信息:执行器AppName、执行器名称title、执行器地址列表address_list(多地址逗号分隔)
如何实现任务执行器的路由?
第一个、最后一个、轮询、随机
都是简单读address_list即可
一致性HASH
TreeSet实现一致性hash算法
最不经常使用、最近最久未使用
HashMap、LinkedHashMap
故障转移
遍历address_list获取address时,逐个检查该address的心跳(请求返回状态);只有心跳正常的address才返回使用
忙碌转移
遍历address_list获取address时,逐个检查该address是否忙碌(请求返回状态);只有状态为idle的address才返回使用
如何实现任务分片、并行执行?
拉出任务的执行机器列表,逐个设置index / total,把index / total分发到任务执行器
任务执行器可根据index / total参数开发分片任务
阻塞处理策略
问题描述
调度过于密集,执行器来不及处理时的处理策略
当任务执行比较耗时,一次任务还没运行结束下一个调度又过来了
处理策略
单机串行(默认)
丢弃后续调度
会触发调度失败的报警
覆盖之前调度
有可能造成执行器线程开启过多
建议
调整好cron表达式,选择丢弃后续调度
0 条评论
下一页