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

131 阅读6分钟

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

分布式定时任务

定义

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

按触发时机分类:

  • 定时任务:特定随时间触发,比如今天15:06执行
  • 延时任务:延时触发,比如10s后执行
  • 周期任务: 固定周期时间,或固定频率周期调度触发,每隔一段时间执行,周期性、持续地执行任务

执行方式

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

业内定时任务框架

Xxl-job、Scheduler、TCT、Elastic-job、Saturn

分布式定时任务和单机定时任务、大数据处理引擎的区别与联系

单机定时任务 联系:都可以实现自动化的定时、延时、周期任务调度
差异:分布式定时任务可支撑更大的业务体量,分布式定时任务的性能、伸缩性、稳定性更高
大数据处理引擎 联系:都可以对海量数据做处理,性能、伸缩性、稳定性都很高
差异:定时并不是大数据处理引擎要解决的核心问题 大数据处理引擎往往致力于将元数据处理成结果数据,分布式定时任务除此之外还可以调用HTTP和RPC服务

核心架构(重点)

分布式定时任务三个关键问题:触发、调度、执行
触发:定时任务需要在什么时候被触发 调度:任务触发后怎么让上万台机器进行任务的调度 执行:单台机器怎么将任务执行,做好故障恢复
三个核心组件:
触发器:解析任务,生成触发事件
调度器:分配任务,管理任务生命周期
执行器: 获取执行任务单元,执行任务逻辑

任务创建流程:用户填写任务基础信息,设置触发规则,编写任务代码提交到控制台

image.png

image.png

image.png

一个任务实例会有多个任务结果
原因:一次周期性的调度可能会失败,失败会重新调度,那么每一次调度就会有不同的任务结果

基本概念

任务元数据: 任务元数据是用户对任务属性定义,包括任务类型调度时机、执行行为等
任务实例:一个确定的JOB的一次运行实例,任务实例中有Job_id、触发事件、状态和结果、过程信息

触发器

核心职责

给定一系列任务,解析它们的触发规则,在规定的时间点触发任务的调度

需求:

  • 需支持大量任务
  • 需支持秒级的调度
  • 周期任务需要多次执行
  • 需保证秒级扫描的高性能,并避免资源浪费
    方案1: 定期扫描+延时消息
    Scanner:定期从DB中扫描将要执行的任务,将扫描的信息交给processor,可用消息队列发送延时消息给调度器,时间到了后,调度器开始执行任务。
    方案2: 时间轮 时间轮: 环形数组,每个数组的元素是一个在这个时间点需要执行的任务的列表 目标: 遍历任务列表,从中找出当前时间点需触发的任务列表 1.使用链表存储任务,每个元素代表一个任务,查询复杂度O(n),修改复杂度O(1)
    2.使用最小堆存储任务,按执行时间排序,每个节点存储同执行时间任务列表,查询复杂度O(1),修改复杂度O(logn) 缺点:任务非常多的时候,由于最小堆使用数组存储的,那么数组的长度就会变得较长,时间复杂度较高 3.时间轮:可以将环形数组理解为一个时钟,每一格存储这一时间需要执行的任务列表。问题:时钟只有60个刻度,当任务大于1分钟,我们可以设置一个count计数器,count代表时钟需要转了count圈才会开始执行。
    查询修改时间复杂度都是O(1) image.png
    4.多级时间轮 根据年月日时分秒划分不同的时间轮,到达对应的时分秒则执行任务调度 查询修改时间复杂度都是O(1) image.png

高可用

不同业务之间,任务的调度互相影响的问题,负责扫描和触发的机器挂了怎么办
解决方法:
存储上,不同业务,国别做资源隔离
运行上,不同国别、业务分开执行
部署时,采用多机房集群化部署,避免单点故障,通过数据库锁或分布式锁保证任务只被触发一次
数据库行锁模式:在触发调度之前,更新数据库中JobInstance的状态,成功抢锁的才会触发调度,多台机器竞争数据库锁,性能较差
分布式锁模式: 在触发调度之前,尝试抢占分布式锁,可使用Redis锁或Zookeeper锁,性能较高

调度器

问题:

  • 资源来源
  • 资源调度
  • 任务执行

资源来源

  • 业务系统提供机器资源 优点:任务执行逻辑也业务系统共用一份资源,利用率更高
    缺点: 更容易发生定时任务脚本影响在线服务的事故,不能由定时任务平台控制扩缩容

  • 定时任务平台提供机器资源 优点:任务执行逻辑与业务系统完全解耦,隔离,避免相互影响 支持扩缩容 缺点: 消耗更多机器资源,需要额外为定时任务平台申请接口调用权限,而不能直接继承业务系统的权限

节点选择

image.png
使用分片可以将任务并行的分配给不同的机器执行,提高执行效率

image.png

高级特性

  • 任务编排
  • 故障转移
  • 高可用

执行器

image.png
状态上报:确保机器发生故障时,调度中心可以感知,调度中心将有问题的机器的任务分配给其他机器。 基于注册中心,可以做到机器的扩缩容