这是我参与「第三届青训营 -后端场」笔记创作活动的第5篇笔记
1.介绍
(一)单机定时任务 生活用途:
1.Windows批处理
2.Windows任务计划程序
工作用途:
3.Linux命令——CronJob
每天2:30定时清理机器日志
优点:Linux系统命令,使用简单,稳定可靠
缺点:只能控制单台机器,且不适用于其他操作系统
4.单机定时任务——Timer、Ticker
每隔5分钟定时刷新本地缓存数据
优点:跨平台 缺点:仅单机可用
5.单机定时任务——ScheduledExecutorService
每隔5分钟定时执行多个任务
优点:拥有线程池功能
缺点:仅单机可用
任务调度Quartz
优点:单任务极致控制
缺点:没有负载均衡机制
(二)分布式定时任务
平台化管理:是一个平台 分布式部署 支持海量数据
按触发时机可分为:定时,延时,周期任务 按执行方式可分为: 单机任务:随机触发一台机器执行任务,适用于计算量小,并发度低的任务 广播任务:广播到所有机器上执行同一个任务 Map任务:一个任务可分出多个子任务,每个子任务负责一部分的计算。适用于计算量大,单机无法满足要求的任务 MapReduce任务:在Map任务的基础上,还可以对所有子任务的结果做汇总计算,适用于计算量大,并且需要对子任务结果做汇总的任务
春节集卡执行方式
2.分布式定时任务核心架构
核心要解决触发、调度、执行三个关键问题
大概可以分为4层:
触发器:Trigger,解析任务,生成触发事件
调度器:Scheduler,分配任务,管理任务生命周期
执行器:Executor,获取任务执行单元,执行任务逻辑
控制台:Admin,提供任务管理和干预的功能
数据流
功能架构
1.控制台
任务元数据Job:
是用户对任务属性定义,包括任务类型调度时机、执行行为等
任务实例JobInstance:
是一个确定的Job的一次运行实例
2.触发器
大量任务,秒级调度,周期任务多次执行,高性能避免资源浪费 方案1:
方案2:
简单方案:
优化:
优化:
解决数组无限变长,查询修改只用取对应槽位O(1)
问题:刻度可能不够
解决:
1.加一个count,通过转了多少圈决定
2.多级时间轮(小时,分钟,秒)
触发器核心问题: 不同业务之间,任务的调度互相影响? 负责扫描和触发的机器挂了怎么办
解决思路: 存储上:不同国别、业务做资源隔离 运行时:不同国别、业务分开执行 部署:多机房集群化部署,避免单点故障,通过数据库锁/分布式锁保证任务纸杯触发一次
问题:避免同一任务被多次触发
解决:
1.数据库行锁
2.分布式锁
可使用Redis锁或者zookeeper锁
3.调度器
3.1资源来源
3.2资源调度
节点选择
任务分片
高级特性—任务编排
定义任务执行顺序关系
高级特性-故障转移
调度器-高可用
4.执行器
3.业务应用
定时延时周期