这是我参与「第五届青训营 」伴学笔记创作活动的第 10 天
分布式定时任务 | 青训营笔记
简介
定时任务案例
- Windows批处理
- Windows任务计划程序
- Linux命令 CronJob
- 单机定时任务 Timer/Ticker
- 任务调度框架 Quartz 以上适合单机环境,不适合分布式定时任务
分布式定时任务优点
- 平台化管理
- 分布式部署
- 支持海量数据
定义
定时任务:系统 自动 完成特定任务,实时、延时、周期性 完成任务调度过程
分布式定时任务:把分散、可靠性差的定时任务纳入统一管理的平台,并实现集群管理调度和分布式部署的一种定时任务管理方式
特点
- 自动化
- 平台化
- 分布式
- 伸缩性
- 高可用
执行方式
- 单机任务:随机出发一台机器执行任务,适用于计算量小、并发度低的任务,和单机模式差别不大
- 广播任务: 广播所有机器上执行同一个任务,比如所有机器一起清日志
- Map任务(核心): 一个任务分出多个子任务,每个子任务负责一部分计算。适用于计算量大,单机无法满足要求的任务。
- MapReduce任务: 在Map任务基础上对所有子任务的结果做汇总计算
业内定时任务框架
原理
核心架构
核心是解决触发、调度、执行三个关键问题
- 触发器(Trigger): 解析任务,生成触发事件
- 调度器(Scheduler): 分配任务,管理任务生命周期
- 执行器(Executor): 获取执行任务单元,执行任务逻辑
初次之外,需要一个控制台(Admin)提供任务管理和干预
数据流
功能框架
基础概念
- Job:基础信息,调度时机,执行行为,执行方式
- JobInstance:Job_id,触发时间。状态&结果,过程信息
- JobResult
- JobHistory
触发器
解析触发规则,在规定的时间点触发任务的调度
设计约束
- 支持大量任务
- 支持秒级调度
- 周期任务要多次执行
- 保证秒级扫描的高性能,避免资源浪费
方案一:定期任务+延时消息
- scanner扫db,扫出来x时间后要执行的任务
- 告诉延时消息队列要执行的任务
- 修改Db中任务状态(避免任务被频繁扫描多次执行)
- 延时MQ执行
方案二:时间轮(Quartz所用)
模拟时钟
高可用问题
为避免单点故障使用多个触发器,为避免同一个任务被多次触发,在触发调度前:
- 数据库行锁:成功抢锁的才会触发调度。缺点:多台机器频繁竞争数据库锁,节点越多,性能越差。
- 分布式锁:Redis锁或Zookeeper锁
调度器
资源来源:
- 业务系统
- 定时任务平台
节点选择
- 随机节点执行:如定时对账
- 广播执行:如批量运维
- 分片执行:自定义分片,如海量日志统计
任务编排
任务之间存在逻辑先后关系,可用有向无环图可视化
高可用
调度器集群部署,靠消息队列的重试机制保证任务一定被调度