这是我参与「第五届青训营 」伴学笔记创作活动的第 11 天
本堂课的重点
- 发展历程
- 深入了解分布式定时任务的实现原理
简介
发展历程
分布式定时任务VS单机定时任务
- 关系:
- 都可以实现自动化的定时、延时、周
- 期任务调度
- 差异:
- 分布式定时任务可支撑更大的业务体量
- 分布式定时任务的性能、伸缩性、稳
- 定性更高
分布式定时任务VS大数据处理引擎
- 关系:
- 都可以对海量数据做处理
- 性能、伸缩性、稳定性都很高
- 差异:
- 定时并不是大数据处理引擎要解决的核心问题
- 大数据处理引擎往往致力于将源数据
- 处理成结果数据,分布式定时任务除了能做这个之外,还可以调用HTTP和RPC服务
定时任务案例
- 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锁
调度器
资源来源:
- 业务系统
- 定时任务平台
节点选择
- 随机节点执行:如定时对账
- 广播执行:如批量运维
- 分片执行:自定义分片,如海量日志统计
任务编排
任务之间存在逻辑先后关系,可用有向无环图可视化
高可用
调度器集群部署,靠消息队列的重试机制保证任务一定被调度
执行器
个人总结
经过这一天的学习,我学习到一些分布式定时任务的原理以及使用