分布式定时任务

[TOC]

前言

春节活动非常重要,并且对后端的压力比较大:

  • 用户规模上亿
  • 资金规模上亿
  • QPS百万

image-20230206154511638

image-20230206154640446

目标:

  • 自动化
  • 定时执行
  • 海量数据
  • 高效稳定

发展历程

2.1-电脑自动关机

30秒后电脑自动关机,step:

  1. 新建 auto_shutdown.bat
  2. 填写 shutdown -s -t 30
  3. 双击处理

2.2-12:00自动打卡

image-20230206155114348

2.3-Linux命令CronJob

30 2 * * * clean_log.sh 代表每天2:30执行clean_log

image-20230206155232636

问题:

  • windows不能使用
  • 只能单机

2.4-Timer,Ticker

每隔一段时间刷新缓存

缺点:只能执行一个任务

image-20230206155504158

2.5-ScheduledExecutorService

每隔一段时间执行多个任务

  • 线程利用率比较高
  • 但还是只能单机用

image-20230206155644673

2.6-Quartz

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

image-20230206155750173

2.7-分布式定时任务

image-20230206155859397

挑战:

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

image-20230207141439729

定时任务

定时任务是指系统为了自动特定的任务,实时、延时、周期性完成任务调度的过程

分布式定时任务

分布式定时任务是指把分散的、可靠性差的定时任务纳入统一的平台,实现集群管理调度和分布式部署的定时任务管理的方式

分布式定时任务特点

按触发时机分类:

  • 定时任务:特定事件触发,如8:00
  • 延时任务:延时触发,如30s之后
  • 周期任务:固定周期时间,如每天23:59,或者每隔1min

按执行方式:

  • 单机任务:随机触发一台机器执行任务,适用于计算量小,并发度低的任务
  • 广播任务:广播到所有机器上执行所有任务,如清理日志
  • Map任务:一个任务分成几个子任务,每个子任务负责一部分计算
  • MapReduce任务:在map任务基础上对所有子任务的结果做汇总计算

特点:

  • 自动化:全自动完成任务的调度和执行
  • 平台化:基于平台化思维管控一系列分布式定时任务
  • 分布式:分布式环境下运行任务调度,突破单机定时任务瓶颈
  • 伸缩性:集群部署,按需扩容
  • 高可用:单节点故障不影响任务结果

案例:春节集卡

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

主流框架

image-20230207141137976

  • xxl-job:许雪里开发,应用于中小型公司
  • ScheduleX:功能强大,付费使用
  • TCT:腾讯内部使用

实现原理

3.1-核心架构

触发、调度、执行

  • 触发:Trigger,解析任务,生成触发事件
  • 调度器:Scheduler,分配任务,管理任务的生命周期
  • 执行器:Executor,获取执行任务单元,执行任务逻辑

image-20230207150013910

数据流

任务创建与执行流程

功能架构

image-20230207150240184

3.2-控制台

基本概念

ER图

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

任务元数据

image-20230207151029557

任务实例

image-20230207151159529

3.3-触发器

功能

职责:给定一系列任务,解析触发规则,在规定事件触发任务的调度

约束:

  • 支持大量任务
  • 支持秒级调度
  • 周期任务多次执行
  • 秒级扫描的高性能,避免资源浪费

方案

1-定时扫描+延时消息

腾讯、字节使用

每隔一段时间扫描DB,扫描出来之后放到processor,延时执行的放到MQ里,为了避免多次执行,改变状态。等时间一到就放到Scheduler里面。

image-20230207151430597

2-时间轮

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

image-20230207151658898

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

链表存储

image-20230207152029894

最小堆存储

不需要知道所有任务,只需要知道最近的任务

image-20230207152048999

时间轮存储。

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

image-20230207152944564

多级时间轮

分别代表小时、分钟、秒

image-20230207153133448

触发器高可用实现方案

核心问题:

  • 不同业务之间会相互影响怎么办
  • 扫描器和触发器挂了怎么办

解法:

  • 存储上资源隔离
  • 运行时分开执行
  • 部署时多机房集群化部署,数据库或分布式锁保证任务只执行一次

image-20230207153918762

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

image-20230207153935704

使用分布式锁

image-20230207154146850

3.3-调度器

问题:

  • 资源来源:哪来的
  • 资源调度:
  • 任务执行:

资源来源

业务系统提供机器资源

优点:

  • 共用同一份资源,利用率高

缺点:

  • 定时任务脚本影响在线服务
  • 不能由定时任务平台扩容缩容

定时任务平台提供机器资源

优点:

  • 服务隔离
  • 扩容缩容

缺点

  • 更多机器消耗
  • 定时任务平台权限管理问题,不能之间基础业务系统权限

资源调度

节点选择

image-20230207155123929

分片执行

可提高任务执行效率

image-20230207155305952

效率编排

拓扑排序?

image-20230207155348931

故障转移

image-20230207155454098

高可用调度器

image-20230207155650299

3.4-执行器

image-20230207155821446

业务应用

image-20230207160335354