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