分布式定时任务|青训营笔记
这是我参与【第五届青训营】伴学笔记创作活动的第11天。
一、重点知识
- 分布式定时任务宏观认知,深入了解实现原理
- 关联的单机定时任务、大数据处理引擎
- 不同实现方案的优劣
- 实际业务场景中的使用
二、详细知识点
1. 发展历程
1.1 Windows
- 批处理:10分钟后电脑自动关机
- 文本文档:自动关机.bat
- 修改内容 shutdown -s -t 600
- 双击运行批处理文件,10分钟后自动关机
- 任务计划程序:自动打卡
- 使用计算机管理,抓取包每天自动打卡
- 电脑自带的定时任务
1.2 Linux命令-CronJob
- 每天2:30定时清理机器日志
- 30 2 * * * [command to be executed]
- 30 2 * * * clean_log.sh
- 缺点:只能控制一台机器
1.3 单机定时任务-Timer、Ticker
- Java可以使用Timer
- Go可以使用Ticker
- 但是只能控制单机
1.4 单机定时任务 ScheduledExecutorService
- 只能单机使用
1.5 任务调度 Quartz
- 任务+触发器->调度器->调度
1.6 分布式定时任务
- 使用大量机器并行处理任务
- 如何协调机器?
- 特点
- 平台化管理
- 分布式部署
- 支持海量数据
- 定义
- 定时任务:系统为了自动完成特定任务,实时、延时、周期性完成任务调度的过程
- 分布式定时任务:把分散的可靠性差的定时任务纳入统一的平台,实现集群管理调度、分布式部署的定时任务管理方式
- 按触发时机分类
- 定时任务:特定时间触发
- 延时任务:延迟一段时间触发
- 周期任务:固定周期时间或频率周期调度出发
- 特点
- 自动化:全自动完成定时任务的调度和执行
- 平台化:基于平台化的思维,管控一系列的分布式定时任务
- 分布式:在分布式系统环境下运行任务调度,突破单机定时任务性能瓶颈
- 伸缩性:采用集群方式部署,可随时按需扩缩容
- 高可用:单点故障不影响最终任务结果,可以做到故障转移
- 执行方式
- 单机任务:随机触发一台机器执行任务,适用于计算量小并发度低的任务
- 广播任务:广播到所有机器上执行同一个任务,比如所有机器一起清理日志
- Map任务:一个任务可以分出多个子任务,每个子任务负责一部分计算,适用于计算量大单机无法满足要求的任务
- MapReduce任务:在Map的基础上可以对所有子任务结果做汇总计算,适用于计算量大并且需要对子任务结果做汇总的任务
1.7 其他知识点
- 分布式vs单机
- 都能实现自动化的定时延时周期任务调度
- 分布式可以支撑更大的业务体量
- 分布式的性能、伸缩性、稳定性更高
- 分布式vs大数据
- 都能对海量数据处理
- 性能、伸缩性、稳定性都很高
- 但定时不是大数据处理引擎要解决的问题
- 大数据处理引擎致力于将原数据处理成结果数据,分布式定时任务还可以调用HTTP和RPC服务
2. 实现原理
2.1 核心架构
- 分布式定时任务核心要解决触发、调度、执行三个关键问题
- 触发器Triggr:解析任务,生成触发事件
- 调度器Scheduler:分配任务,管理任务生命周期
- 执行器Executor:获取执行任务单元,执行任务逻辑
- 控制台Admin:任务管理、任务干预
2.2 数据流
- 任务基础信息:用户填写
- 用户设置触发规则:周期性
- 任务代码
- 提交到Admin控制台,控制台连接并存储到任务DB
- 进入执行阶段,Admin调度触发器、调度器、执行器
- 触发器触发任务
- 调度器对业务进行调度
- 执行器执行
2.3 功能架构
2.4 基本概念
- 任务元数据:用户对人物属性的定义
- 基础信息
- 调度时机:什么时候触发
- 执行行为:做什么
- 执行方式:单机/分布式/Map
- 任务实例:一个确定的Job的一次运行实例
- Job_id
- 触发时间
- 状态&结果
- 过程信息:消息队列需要记录id
2.5 触发器
- 核心职责:给定一系列任务,解析触发规则,在规定的时间点触发任务调度
- 设计约束
- 需支持大量任务
- 需支持秒级调度
- 周期任务需要多次执行
- 需保证秒级扫描的高性能,避免资源浪费
- 方案
- 定时扫描+延时消息
- 时间轮Quartz:存储环形队列,底层采用述祖实现,数组中每个元素可以存放一个任务列表;遍历任务列表,从里面找出当前时间点需要触发的任务列表;(链表、最小堆)
- 高可用
- 不同业务之间调度影响?
- 负责扫描和触发机器down怎么办
- 解法:
- 存储上:不同国别、业务做资源隔离
- 运行时:不同国别、业务分开执行
- 部署时:采用多机房集群化部署
- Trigger
- 单Trigger模式:单点故障会崩溃
- 集群模式:避免单点故障,但需要避免一任务被多次触发导致业务紊乱
- 数据库行锁模式:触发调度之前更新数据库中JobInstance状态,成功抢锁才能触发调度
- 多台机器频繁抢锁,节点越多性能越差
- 分布式锁模式:尝试抢占分布式锁,可以使用Redis或zookeeper锁
- 性能较高
2.6 调度器
- 问题:资源来源、资源调度、任务执行
- 资源来源
- 业务系统提供机器来源
- 优点:任务执行逻辑与业务系统同一份资源,利用率更高
- 缺点:更容易发生定时任务脚本影响在线服务事故;不能由定时平台控制扩缩容
- 定时任务平台提供机器资源
- 优点:任务执行逻辑与业务系统在线服务隔离,避免相互影响;可以优雅扩缩容
- 缺点:消耗更多机器资源;需要额外为定时任务平台申请接口调用权限,不能直接继承业务系统权限
- 业务系统提供机器来源
- 节点选择
- 随机节点执行:选择集群中一个可用的节点执行调度
- 广播执行:在集群中所有执行节点分发调度任务并执行
- 分片执行:按照用户自定义分片逻辑分片执行
- 任务分片:提高任务执行效率和任务利用率(类似Map)
- 任务编排:使用DAG进行可视化任务编排
- 故障转移:确保部分执行单元任务失败时任务最终成功
- 分片任务基于一致性hash分发任务,当某executor异常时调度器会把任务发到其他executor上
- 高可用:可以集群部署,做到完全无状态,靠消息队列重试机制保证一定会调度
2.7 执行器
- 基于注册中心,可以做到执行器的弹性扩缩容
- 调度、回调上报
- 状态上报:心跳
三、实践例——业务应用
- 电商
- 订单30分钟未支付自动关闭
- 定时给商家、达人发送消息
- 发送优惠券
- 互动
- 支付宝集五福
- 字节集卡
- 游戏
- 活动结束后补发奖励
- 更新游戏内榜单
- 业务场景
- 系统自动确认收货
- 分布式定时任务:延时任务
- 消息队列延时消息、定时消息
- 春节集卡活动
- 使用分布式定时任务MapReduce
- 大数据离线处理Hive
- 大数据在线实时处理Flink
- 系统自动确认收货
四、总结
本节课主要介绍了分布式定时任务的相关内容。分布式定时任务与之前大数据课程上介绍的大数据处理很相似,其主要区别在于“定时”,即需要有时间点的定义。时间轮是本节课的一个难点,需要结合具体代码进行进一步的学习。分片调度、故障转移等也是分布式定时任务的关键。