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

130 阅读5分钟

这是我参与「第三届青训营 -后端场」笔记创作活动的的第4篇笔记

1、分布式定时任务的使用场景

分布式定时任务在目前很多项目中是重要的一环,我们在日常生活中可以频繁见到它的应用

  • 春节集卡赢红包

image.png

  • 快递到达十天自动收货
  • 外面订单超时30分钟未支付自动取消

2、发展历程

分布式定时任务的发展历程可以简单列为下方几个阶段

2.1、 windows批处理阶段

image.png

2.2、windows任务计划程序

image.png

2.3、linux命令-CronJob

image.png linux内置的CronJob功能简单易用,稳定性强,但无法用于分布式处理

2.4、Timer,Tiker

image.png 第三方框架Timer,Tiker具有跨平台的定时任务调度功能,但仍然限于单机

2.5、ScheduleExecutorService

image.png ScheduleExecutorService中引入了线程池,可以并发执行定时任务,但是还是只能处理单机任务

2.6、Quartz

image.png Quartz对分布式任务有了解决方案,但功能并不完善,如没有负载均衡机制等。

2.7、分布式定时任务

至此,我们终于印出来本次内容的主角--分布式定时任务,这里会对分布式定时任务作详细介绍 image.png

2.7.1、定义

定时任务是指系统为了自动完成特定任务,实时、延时、周期性完成任务调度的过程。分布式定时任务是把分散的、可靠性差的定时任务纳入统一的平台,并实现集群管理调度和分布式部署的一种定时任务的管理方式。

2.7.2、特点

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

2.7.3、执行方式

  • 单机任务:随机触发一台机器执行任务,适用于计算量小、并发度低的任务
  • 广播任务:广播到所有机器上执行同一个任务,比如所有机器一起清理日志
  • Map任务:一个任务可以分出多个子任务,每个子任务负责一部分的计算。适用于计算量大,单机无法满足要求的任务
  • MapReduce任务:在Map任务的基础上,还可以对所有子任务的结果做汇忌计异,也用于计算量大,并且需要对子任务结果做汇总的任务

2.7.4、业内分布式定时任务框架

image.png

2.7.5、知识面扩充

image.png

2.8、小结

第二节内容小结如下 image.png

3、实现原理

3.1、核心架构

分布式定时任务框架一般可以认为由以下四部分组成

  • 触发器:Trigger,解析任务,生成触发事件
  • 调度器: Scheduler,分配任务,管理任务生命周期
  • 执行器: Executor,获取执行任务单元,执行任务逻辑
  • 控制台:Admin,提供任务的管理与干预

image.png

3.1.1、一个分布式定时任务的处理过程

image.png 分布式定时任务框架对一个进来的分布式任务处理流程如上图:

1.用户为代码完善任务基础信息,设置触发规则

2.提交给控制台,控制台将任务存储

3.触发器扫描DB,发现新的需要调度任务,并且任务时间在范围内,将任务发给调度器

4.调度器安排任务应该如何交给执行器执行

5.执行器执行定时任务

3.1.2、功能架构

image.png

3.2、控制台

3.2.1、基本概念

image.png

3.2.2、任务元数据

任务元数据是用户对任务属性的定义,包括:

  • 调度时机
  • 执行行为
  • 任务状态
  • etc

3.2.3、任务实例

任务实力是一个确定的job的一次运行实例

3.3、触发器

3.3.1、核心职能

触发器解析给定的一系列任务,并且在贵刀时间触发任务的调度

触发器的设计应该满足:

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

3.3.2、实现方式1-定时扫描+延时消息

image.png

触发器定时对DB进行扫描,对数据项进行解析,寻找被触发的定时任务,并将他们通过延时MQ等发送给调度器,同时根据具体情况对DB内容进行修改(如只执行一次的任务应在下次不应该被触发)

3.3.3、实现方式2-时间轮

类比时钟,设置一个六十秒的轮盘,在每一秒钟有不同任务(可以用链表存储),抵达即执行

image.png

而对于时间范围更大的,可以引入多级时间轮,上一级时间轮抵达指定位置便将任务传给下一级时间轮

image.png

3.3.4、高可用

image.png

3.3.4、集群以及相关问题

为了高可用,可以引入集群,能够避免单点故障,并且增强性能

然而分布式带来了同一任务会被多次触发的问题

  • 可以用数据库行锁来解决
  • 可以用分布式锁来解决(redis锁,zookeeper锁)

3.4、调度器

调度器为分布式的协调提供了解决方案

3.4.1、资源来源

  • 业务系统提供机器资源
  • 分布式定时任务平台提供机器资源

image.png

3.4.2、节点选择

通过合理的节点选择可以降低单节点压力,提升整体性能 image.png

3.4.3、任务分片

对于复杂任务,可以分片处理 image.png

3.4.4、可视化

提供可视化界面,方便使用

image.png

3.4.5、故障转移

对于分别式系统,自然要对单点故障进行容灾

image.png

3.4.6、高可用

集群的设置保障了高可用 image.png

3.5、执行器

image.png

3.6、小结

image.png

4、尾声

分布式定时任务在业务中较常使用,并且框架架构包含了许多分布式框架的共同具有的概念,整体结构清晰,容易带我们了解分布式的思想