分布式定时任务 | 青训营笔记

97 阅读6分钟

这是我参与「第五届青训营 」笔记创作活动的第 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实时做累计

课后个人总结

今天学习了分布式定时任务的基础知识,本节课给我带来了知识面的拓展,帮助我建立起对分布式定时任务的比较宏观的一个认知,让我知道了在不同实际业务场景的中间件选型和技术方案设计,知识点很多,收获也很多。