这是我参与「第五届青训营 」笔记创作活动的第 12 天
本节课能给我们带来知识面的拓展,帮助我们建立起对分布式定时任务的比较宏观的一个认知,增强我们的项目实践能力,特别在实际业务场景的中间件选型和技术方案设计
本节课重点、难点:分布式定时任务实现原理、触发器
1、前言
分布式定时任务=自动化+定时执行+海量数据+高效稳定
1.1 项目案例设计-春节集卡瓜分20亿
抽卡->集齐->开奖
1.2 设计最终开奖环节技术方案
衡量用户规模、资金规模、读写QPS
发奖金额计算:扫描脚本扫描集卡信息,汇总计算发奖金额
定时开奖
2、发展历程
2.1 Windows批处理
例自动关机脚本
2.2 Windows任务计划程序
例打卡
2.3 Linux命令-CronJob
例定时清理机器日志
2.4 单机定时任务-Timer、Ticker
例每隔5分钟定时刷新本地缓存数据
2.4.1 ScheduledExecutorService
例每隔5分钟定时执行多个任务
2.5 任务调度-Quartz
单任务极致控制,没有负载均衡机制
2.6 分布式定时任务
平台化管理、分布式部署、支持海量数据
2.6.1 基本知识
定时任务是指系统为了自动完成特定任务,实时、延时、周期性完成任务调度的过程
分布式定时任务是把分散的、可靠性差的定时任务纳入统一的平台,并实现集群管理调度和分布式部署的一种定时任务的管理方式
按触发时机分类:定时任务、延时任务、周期任务
2.6.2 特点
自动化、平台化、分布式、伸缩性、高可用
2.6.3 执行方式
单机任务、广播任务、Map任务(适用于计算量大)、MapReduce任务(基于Map任务,可以对所有自子任务的结果做汇总计算)
春节集卡项目中MapReduce任务适用于发奖金额计算,Map任务适用于定时开奖
2.7 业内定时任务框架
Xxl-job(开源)、SchedulerX、TCT、Elastic-job(开源)、Saturn(开源)
2.8 知识面扩充
分布式定时任务对于单机定时任务:都可以实现自动化定时、延时、周期任务调度;分布式定时任务可支撑更大的业务体量,它的性能、伸缩性、稳定性更高
分布式定时任务对于大数据处理引擎:都可以对海量数据做处理;性能、伸缩性、稳定性都很高;定时不是大数据处理引擎要解决的核心问题,其往往致力于将源数据处理成结果数据,分布式定时任务除了能做这个以外,还可以调用HTTP和RPC服务
3、实现原理
3.1 核心架构
分布式定时任务核心要解决触发、调度、执行三个关键问题
触发器(Trigger):解析任务、生成触发事件
调度器(Scheduler):分配任务,管理任务生命周期
执行器(Executor):获取执行任务单元,执行任务逻辑
控制台(Admin):提供任务管理和干预的功能
3.1.1 数据流
任务创建->任务执行
3.1.2 功能架构
Admin、Trigger、Scheduler、Executor
3.2 控制台
3.2.1 任务(Job)
用户对任务属性定义,包括任务类型、调度时机、执行行为等
3.2.2 任务实例(JobInstance)
3.2.3 任务结果(JobResult)
3.2.4 任务历史(JobHistory)
用户可以修改任务信息,任务实例对应的任务元数据可以不同,因而使用任务历史存储
3.3 触发器
核心:给定一系列任务,解析触发规则,在规定的时间点触发任务的调度
设计约束:需支持大量任务、需支持秒级的调度、周期任务需要多次执行、需保证秒级扫描的高性能,并避免资源浪费
3.3.1 方案1
定期扫描+延时消息
定时扫描的机器集群部署,通过分布式锁保证只有一台在调度
3.3.2 方案2
(1)链表
(2)最小堆存储:按执行时间排序,每个节点存储同执行时间任务列表
(3)时间轮:是高效利用线程资源进行批量化调度的一种调度模型,是一个存储环形队列,底层采用数组实现,数组中的每个元素可以存放一个定时任务列表
(4)多级时间轮存储任务:上一级时间轮转过对应刻度后把任务塞入下级时间轮中
3.3.3 高可用
存储:不同国别、业务做资源隔离
运行:不同国别、业务分开执行
部署:采用多机房集群化部署,避免单点故障,通过数据库锁或分布式锁保证任务只能被触发一次
单Trigger模式:会有单点故障、机器故障时平台崩溃
Trigger集群模式:可避免单点故障、需要避免同一任务被多次触发,导致业务紊乱
数据库行锁模式:在触发调度前,更新数据库中JobInstance的状态,成功抢锁的才会触发调度,多台机器频繁竞争数据库锁,节点越多性能越差
分布式锁模式:在触发调度前,尝试抢占分布式锁,可使用Redis锁或Zookeeper锁
3.4 调度器
3.4.1 资源来源
业务系统提供机器资源 定时任务平台提供机器资源
3.4.2 资源调度
3.4.2.1 节点选择
随机节点执行:适用定时对账
广播执行:适用批量运维
分片执行:适用海量日志统计
3.4.2.2 任务分配
3.4.3 任务执行
3.4.3.1 任务编排
使用有向无环图DAG(Directed Acyclic Graph)进行可视化任务编排
3.4.3.2 故障转移
确保部分执行单元任务失败时,任务最终成功
3.4.4 高可用
集群部署,做到完全的无状态,靠消息队列的重试机制保障任务一定会被调度
3.5 执行器
基于注册中心,做到执行器的弹性扩缩容
4、业务应用
所有需要定时、延时、周期性执行任务的业务场景,都可以考虑使用分布式定时任务
电商、互动、游戏等场景
发货后超过十天未收货时系统自动确认收获:
使用分布式定时任务的延时任务
使用消息队列的延时消息或定时消息
春节集卡活动统计完成集卡的用户个数和总翻倍数:
使用分布式定时任务的MapReduce任务
使用大数据离线处理引擎Hive离线做统计
使用大数据实时处理引擎Flink实时做累计
课后个人总结
今天学习了分布式定时任务的基础知识,本节课给我带来了知识面的拓展,帮助我建立起对分布式定时任务的比较宏观的一个认知,让我知道了在不同实际业务场景的中间件选型和技术方案设计,知识点很多,收获也很多。