这是我参与「第五届青训营 」笔记创作活动的第13天。注:笔记大部分图片内容及代码段为青训营课程视频提供,仅交流,不得做个人使用
一、本课主要内容
分布式定时任务实现原理
业务应用
二、本节详细知识点
实现原理
-整体架构
-业务模型
-触发器、调度器、执行器
-业务应用
1分布式定时任务整体架构
分布式定时任务核心要解决触发、调度、执行三个关键问题
触发器:Trigger,解析任务,生成触发事件
调度器:Scheduler,分配任务,管理任务生命周期
执行器:Executor,获取执行任务单元,执行任务逻辑
除此之外,还需要提供一个控制台(Admin),提供任务管理和干预的功能。
(高度抽象化结果,并不代表一定要为四层架构)
1.1数据流
1.2功能架构
1.2控制台
1.2.1控制台基本概念
任务:Job,任务元数据
任务实例:Joblnstance,任务运行的实例
任务结果:JobResult,任务实例运行的结果
任务历史:JobHistory,用户可以修改任务信息,任务实例对应的任务元数据可以不同,因而使用任务历史存储
1.2.2基本概念-任务元数据
任务元数据(Job)是用户对任务属性定义,包括任务类型调度时机、执行行为等。
元数据状态机
1.2.3基本概念-任务实例
任务实例(Joblnstance)是一个确定的Job的一次运行实例。
任务实例状态机(简单了解)
1.3触发器
1.3.1触发器核心职责
核心职责
·给定一系列任务,解析它们的触发规则,在规定的时间点触发任务的调度
设计约束
·需支持大量任务
·需支持秒级的调度
·周期任务需要多次执行
·需保证秒级扫描的高性能,并避免资源浪费
1.3.2触发器-方案1
定期扫描+延时消息(腾讯、字节方案)
1.3.3触发器-方案2
时间轮(Quartz所用方案)
时间轮是一种高效利用线程资源进行批量化调度的一种调度模型。时间轮是一个存储环形队列,底层采用数组实现,数组中的每个元素可以存放一个定时任务列表。
任务诉求解析
目标:遍历任务列表,从中找出当前时间点需触发的任务列表
简单方案:
进一步优化:
时间轮优化:
进一步优化:多级时间轮
1.3.4触发器-高可用
核心问题
·不同业务之间,任务的调度相互影响怎么办?
·负责扫描和触发的机器挂了怎么办?
解法思路
·存储上,不同国别、业务做资源隔离运行时,不同国别、业务分开执行
·部署时,采用多机房集群化部署,避免单点故障,通过数据库锁或分布式锁保证任务只被触发一次
高可用-问题引出
- 单机出现的问题
数据库行锁模式
在触发调度之前,更新数据库中Job lnstance的状态,成功抢锁的才会触发调度
明显缺点:多台机器频繁竞争数据库锁,节点越多性能越差
分布式锁模式
在触发调度之前,尝试抢占分布式锁,可使用Redis锁或Zookeeper锁
性能较高,多家公司运用此方案(ali的scX)
1.4 调度器
调度器承担责任
1.4.1 资源来源
- 业务系统提供机器资源
使用该方案的公司: ·阿里、美团、字节等
优点: 任务执行逻辑与业务系统共用同一份资源,利用率更高
缺点 : 更容易发生定时任务脚本影响在线服务的事故、不能由定时任务平台控制扩缩容 - 定时任务平台提供机器资源
使用该方案的公司:
字节等
优点: 任务执行逻辑与业务系统提供的在线服务隔离,避免相互影响、可以支持优雅地扩缩容
缺点: 消耗更多机器资源/需要额外为定时任务平台申请接口调用权限而不能直接继承业务系统的权限
1.4.2 资源调度
- 节点选择
随机节点执行:选择集群中一个可用的执行节点执行调度任务。适用场景:定时对账。
广播执行:在集群中所有的执行节点分发调度任务并执行。适用场景:批量运维。
分片执行:按照用户自定义分片逻辑进行拆分,分发到集群中不同节点并行执行,提升资源利用效率。适用场景:海量日志统计。
- 任务分片 通过任务分片来提高任务执行的效率和资源的利用率
N个执行器Executor, M个业务数据区段,最好M>=N 且M是N的整数倍
1.4.3 高级特性
- 任务编排
调度平台提供功能: 使用有向无环图 DAG(Directed Acyclic Graph)进行可视化任务编排
- 故障转移 故障转移:确保部分执行单元任务失败时,任务最终成功
分片任务基于一致性hash策略分发任务,当某Executor异常时,调度器会将任务分发到其他Executor
1.4.4 调度器-高可用
调度器可以集群部署,做到完全的无状态,靠消息队列的重试机制保障任务一定会被调度
1.5 执行器(executor)
基于注册中心,可以做到执行器的弹性扩缩容
1.6 小结
- 核心架构
控制台Admin、触发器Trigger、调度器Scheduler、执行器Executor - 业务模型
任务元数据Job、任务实例Joblnstance、任务结果JobResult、任务历史JobHistory - 触发器
-定时扫描+延时消息
-时间轮
链表、最小堆、时间轮、多级时间轮 - 调度器
-资源来源
-资源调度:节点选择、任务分片、任务编排、故障转移 - 执行器
注册、调度、回调、心跳检测
2业务应用
所有需要定时、延时、周期性执行任务的业务场景,都可以考虑使用分布式定时任务。
其他解决方案
- 发货后超过10天未收货时系统自动确认收货
使用分布式定时任务的延时任务
使用消息队列的延时消息或者定时消息 - 春节集卡活动统计完成集卡的用户个数和总翻倍数
使用分布式定时任务的MapReduce任务
使用大数据离线处理引擎Hive离线做统计
使用大数据实时处理引擎Flink实时做累计