这是我参与「第五届青训营」伴学笔记创作活动的第 9 天。
-
介绍
-
单机定时任务:
-
windows,批处理,任务计划程序。
-
Linux,CornJob命令;优点,linux系统命令,使用简单,稳定可靠;缺点,只能控制单台机器,且无法适用于其他操作系统;
-
使用代码Timer,Ticker。优点,跨平台;缺点,仅单机使用
-
Quartz,任务调度,做到了单任务极致控制,但没有负载均衡机制
-
-
分布式定时任务
-
定时任务,指系统为了自动完成特定任务,实时、延时、周期性完成任务调度的过程。
-
分布式定时任务,把分散的、可靠性差的定时任务纳入统一的平台,并实现集群管理调度和分布式部署的一种定时任务的管理方式。
-
特点:
- 自动化:全自动完成定时任务的调度和执行;
- 平台化: 基于平台化的思维管控一系列的分布式定时任务;
- 分布式: 在分布式系统环境下运行任务调度,突破单机定时务的性能瓶颈;
- 伸缩性: 采用集群方式部署,可以随时按需扩缩容;
- 高可用: 单点故障不影响最终任务结果,可以做到故障转移;
-
按触发机制分类:
- 定时任务:特定时间触发;
- 延时任务,延时触发;
- 周期任务:固定周期时间,或固定频率周期调度触发
-
按执行方式分类:
-
单机任务: 随机触发一台机器执行任务,适用于计算量小、并发度低的任务;
-
广播任务: 广播到所有机器上执行同一个任务,比如所有机器一起清理日志;
-
Map任务: 一个任务可以分出多个子任务,每个子任务负责一部分的计算。适用于计算量大,单机无法满足要求的任务;
-
MapReduce任务: 在Map任务的基础上,还可以对所有子任务的结果做汇总计算,适用于计算量大,并且需要对子任务结果做汇总的任务;
-
春节集卡发奖,发奖金额计算,用MapReduce任务;定时开奖,用Map任务
-
-
-
-
实现原理
-
分布式定时任务核心要解决触发、调度、执行三个关键问题;
- 触发,任务在什么时间点准时触发
- 调度,任务触发后如何协调多台机器的调度
- 执行,单台机器如何执行好分配的任务,故障恢复等
-
基于三个问题有三个核心组件:
- 触发器: Trigger,解析任务规则,生成触发事件
- 调度器: Scheduler,分配任务,资源调度,管理任务生命周期
- 执行器: Executor,获取执行任务单元,执行任务逻辑
- 控制台: Admin,做整体管理,提供任务管理和干预的功能
-
分布式定时任务的业务流程
-
任务创建,用户提交任务基础信息,触发规则,任务代码到控制台,控制台将其存储到任务DB。任务执行,控制台判断任务执行时间,触发器做任务触发,调度器对任务做任务协调,在分配到执行器中真正的工作;
-
-
控制台
-
基本概念
-
任务元数据Job:是用户对任务属性定义,包括基础信息Who,任务调度时机When,执行行为What,执行方式How等;
-
任务实例JobInstance:一个确定的Job的一次运行实例。包括Job_id,用来与任务元数据建立关联;触发时间;状态&结果;过程信息,比如任务通过消息队列的方式去进行调度,记录消息ID
-
-
-
触发器
-
核心职责:给定一系列任务,解析它们的触发规则,在规定时间点触发任务的调度
-
设计约束:
- 需支持大量任务
- 需支持秒级的调度
- 周期任务需要多次执行
- 需保证秒级扫描的高性能,并避免资源浪费
-
为达到以上约束,有以下方案
-
方案1:定期扫描+延时消息(腾讯,字节方案)。scanner定时(比如10s)扫描DB,搜索最近10分钟将要执行的任务,将扫描信息发送给processor,由processor发送延时消息告知调度器10分钟后执行任务。为了避免任务被多次执行,修改DB中的任务状态。
-
方案2,触发器。时间轮(Quartz),是一种高效利用线程资源进行批量化调度的一种调度模型。时间轮是一个存储环形队列,底层采用数组实现,数组中的每个元素都可以存放一个定时任务列表
-
优化,不需要知道所有任务执行时间,只要知道最近要执行哪个任务就行。最小堆数据结构存储任务,底层是数组结构; 缺点:任务多的时候,数组长度很大,复杂度增加。优化,时间轮,最小堆首尾相连
-
存在问题,时钟有60个刻度,一圈表示一分钟,刻度不够怎么办?方法1,依然用该时间轮,加个count,表示时钟要转多少圈。方法2,使用多级时间轮
-
-
-
触发器高可用
-
核心问题:
- 不同业务之间,任务调度相互影响怎么办? 业务A创建很多秒级业务,导致机器资源都被占用,业务B受影响。
- 负责扫描和触发的机器挂了怎么办?
-
解决方法:
-
存储上,不同国家、业务做资源隔离;
-
运行时,不同国家、业务分开执行;
-
部署时,采用多机房集群化部署,避免单点故障,通过数据库锁或分布式锁保证任务只被触发一次。
-
-
-
-
调度器
-
核心问题:资源来源,机器谁给我的;资源调度;任务执行
-
资源来源:
-
业务系统提供机器资源,比如春节项目组提供资源
-
定时任务平台提供机器资源
-
-
资源调度:节点选择,
-
随机节点执行:选择集群中一个可用的执行节点执行调度任务。整体性能不太高,适合比较细粒度的任务。适合场景,定时对账
-
广播执行:在集群中所有的执行节点分发调度任务并执行。适用场景: 批量运维
-
分片执行: 按照用户自定义分片逻辑进行拆分,分发到集群中不同节点并行执行,提升资源利用效率。适用场景: 海量日志统计
-
-
高级特性:
-
任务编排
-
故障转移
-
-
高可用
-
调度器 无状态部署
-
-
-
执行器
- 真正执行任务的组件
- 首先,机器注册,把执行器自己注册到调度中心;执行过程中,上传日志,回调请求,定时做状态上报,类似心跳检测,调度中心可以快速感知;
-
-
业务应用
所有需要定时、延时、周期性执行任务的业务场景,都可以考虑使用分布式定时任务。
-
总结
通过学习,对分布式定时任务有了宏观认知,并了解了实现原理。