分布式定时任务
[TOC]
前言
春节活动非常重要,并且对后端的压力比较大:
- 用户规模上亿
- 资金规模上亿
- QPS百万


目标:
- 自动化
- 定时执行
- 海量数据
- 高效稳定
发展历程
2.1-电脑自动关机
30秒后电脑自动关机,step:
- 新建
auto_shutdown.bat - 填写
shutdown -s -t 30 - 双击处理
2.2-12:00自动打卡

2.3-Linux命令CronJob
30 2 * * * clean_log.sh 代表每天2:30执行clean_log

问题:
- windows不能使用
- 只能单机
2.4-Timer,Ticker
每隔一段时间刷新缓存
缺点:只能执行一个任务

2.5-ScheduledExecutorService
每隔一段时间执行多个任务
- 线程利用率比较高
- 但还是只能单机用

2.6-Quartz
几乎是定时任务的标准,但是没有负载均衡机制,分布式支持不好

2.7-分布式定时任务

挑战:
- 如何协调多个机器?
- 如何支持海量数据
- 如何支持平台化管理和分布式部署

定时任务
定时任务是指系统为了自动特定的任务,实时、延时、周期性完成任务调度的过程
分布式定时任务
分布式定时任务是指把分散的、可靠性差的定时任务纳入统一的平台,实现集群管理调度和分布式部署的定时任务管理的方式
分布式定时任务特点
按触发时机分类:
- 定时任务:特定事件触发,如8:00
- 延时任务:延时触发,如30s之后
- 周期任务:固定周期时间,如每天23:59,或者每隔1min
按执行方式:
- 单机任务:随机触发一台机器执行任务,适用于计算量小,并发度低的任务
- 广播任务:广播到所有机器上执行所有任务,如清理日志
- Map任务:一个任务分成几个子任务,每个子任务负责一部分计算
- MapReduce任务:在map任务基础上对所有子任务的结果做汇总计算
特点:
- 自动化:全自动完成任务的调度和执行
- 平台化:基于平台化思维管控一系列分布式定时任务
- 分布式:分布式环境下运行任务调度,突破单机定时任务瓶颈
- 伸缩性:集群部署,按需扩容
- 高可用:单节点故障不影响任务结果
案例:春节集卡

发奖金额计算使用MapReduce任务,开奖阶段使用Map任务
主流框架

- xxl-job:许雪里开发,应用于中小型公司
- ScheduleX:功能强大,付费使用
- TCT:腾讯内部使用
实现原理
3.1-核心架构
触发、调度、执行
- 触发:Trigger,解析任务,生成触发事件
- 调度器:Scheduler,分配任务,管理任务的生命周期
- 执行器:Executor,获取执行任务单元,执行任务逻辑

数据流

功能架构

3.2-控制台
基本概念

- 任务:Job,任务元数据
- 任务示例:任务运行的实例。一个任务有多个实例
- 任务结果:JobResult,任务实例运行的结果。包括失败重试的结果
- 任务历史:JobHistory,用户可以修改任务信息,任务实例对应的任务元数据可以不同,因而使用任务历史存储
任务元数据

任务实例

3.3-触发器
功能
职责:给定一系列任务,解析触发规则,在规定事件触发任务的调度
约束:
- 支持大量任务
- 支持秒级调度
- 周期任务多次执行
- 秒级扫描的高性能,避免资源浪费
方案
1-定时扫描+延时消息
腾讯、字节使用
每隔一段时间扫描DB,扫描出来之后放到processor,延时执行的放到MQ里,为了避免多次执行,改变状态。等时间一到就放到Scheduler里面。

2-时间轮
Quartz使用。高效的利用线程资源进行批量化调度的调度模型。

时间伦是一个环形队列,底层使用数组实现,数组中每个元素可以存放一个定时任务列表
链表存储

最小堆存储
不需要知道所有任务,只需要知道最近的任务

时间轮存储。
问题是时间可能在10min而不是60s之后。解决办法:使用cnt,cnt为0时再执行。

多级时间轮
分别代表小时、分钟、秒

触发器高可用实现方案
核心问题:
- 不同业务之间会相互影响怎么办
- 扫描器和触发器挂了怎么办
解法:
- 存储上资源隔离
- 运行时分开执行
- 部署时多机房集群化部署,数据库或分布式锁保证任务只执行一次

使用数据库锁,节点越多性能越差

使用分布式锁

3.3-调度器
问题:
- 资源来源:哪来的
- 资源调度:
- 任务执行:
资源来源
业务系统提供机器资源
优点:
- 共用同一份资源,利用率高
缺点:
- 定时任务脚本影响在线服务
- 不能由定时任务平台扩容缩容
定时任务平台提供机器资源
优点:
- 服务隔离
- 扩容缩容
缺点
- 更多机器消耗
- 定时任务平台权限管理问题,不能之间基础业务系统权限
资源调度
节点选择

分片执行
可提高任务执行效率

效率编排
拓扑排序?

故障转移

高可用调度器

3.4-执行器

业务应用
