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

134 阅读7分钟

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

这是我参与【第五届青训营】伴学笔记创作活动的第11天。

一、重点知识

  • 分布式定时任务宏观认知,深入了解实现原理
  • 关联的单机定时任务、大数据处理引擎
  • 不同实现方案的优劣
  • 实际业务场景中的使用

二、详细知识点

1. 发展历程

1.1 Windows

  • 批处理:10分钟后电脑自动关机
    • 文本文档:自动关机.bat
    • 修改内容 shutdown -s -t 600
    • 双击运行批处理文件,10分钟后自动关机
  • 任务计划程序:自动打卡
    • 使用计算机管理,抓取包每天自动打卡
    • 电脑自带的定时任务

1.2 Linux命令-CronJob

  • 每天2:30定时清理机器日志
    • 30 2 * * * [command to be executed]
    • 30 2 * * * clean_log.sh
    • 缺点:只能控制一台机器

1.3 单机定时任务-Timer、Ticker

  • Java可以使用Timer
  • Go可以使用Ticker
  • 但是只能控制单机

1.4 单机定时任务 ScheduledExecutorService

  • 只能单机使用

1.5 任务调度 Quartz

  • 任务+触发器->调度器->调度

1.6 分布式定时任务

  • 使用大量机器并行处理任务
  • 如何协调机器?
  • 特点
    • 平台化管理
    • 分布式部署
    • 支持海量数据
  • 定义
    • 定时任务:系统为了自动完成特定任务,实时、延时、周期性完成任务调度的过程
    • 分布式定时任务:把分散的可靠性差的定时任务纳入统一的平台,实现集群管理调度、分布式部署的定时任务管理方式
    • 按触发时机分类
      • 定时任务:特定时间触发
      • 延时任务:延迟一段时间触发
      • 周期任务:固定周期时间或频率周期调度出发
  • 特点
    • 自动化:全自动完成定时任务的调度和执行
    • 平台化:基于平台化的思维,管控一系列的分布式定时任务
    • 分布式:在分布式系统环境下运行任务调度,突破单机定时任务性能瓶颈
    • 伸缩性:采用集群方式部署,可随时按需扩缩容
    • 高可用:单点故障不影响最终任务结果,可以做到故障转移
  • 执行方式
    • 单机任务:随机触发一台机器执行任务,适用于计算量小并发度低的任务
    • 广播任务:广播到所有机器上执行同一个任务,比如所有机器一起清理日志
    • Map任务:一个任务可以分出多个子任务,每个子任务负责一部分计算,适用于计算量大单机无法满足要求的任务
    • MapReduce任务:在Map的基础上可以对所有子任务结果做汇总计算,适用于计算量大并且需要对子任务结果做汇总的任务

1.7 其他知识点

  • 分布式vs单机
    • 都能实现自动化的定时延时周期任务调度
    • 分布式可以支撑更大的业务体量
    • 分布式的性能、伸缩性、稳定性更高
  • 分布式vs大数据
    • 都能对海量数据处理
    • 性能、伸缩性、稳定性都很高
    • 但定时不是大数据处理引擎要解决的问题
    • 大数据处理引擎致力于将原数据处理成结果数据,分布式定时任务还可以调用HTTP和RPC服务

2. 实现原理

2.1 核心架构

  • 分布式定时任务核心要解决触发、调度、执行三个关键问题
    • 触发器Triggr:解析任务,生成触发事件
    • 调度器Scheduler:分配任务,管理任务生命周期
    • 执行器Executor:获取执行任务单元,执行任务逻辑
    • 控制台Admin:任务管理、任务干预

2.2 数据流

Screen Shot 2023-02-07 at 10.22.27 PM.png

  • 任务基础信息:用户填写
  • 用户设置触发规则:周期性
  • 任务代码
  • 提交到Admin控制台,控制台连接并存储到任务DB
  • 进入执行阶段,Admin调度触发器、调度器、执行器
  • 触发器触发任务
  • 调度器对业务进行调度
  • 执行器执行

2.3 功能架构

Screen Shot 2023-02-07 at 10.24.36 PM.png

2.4 基本概念

  • 任务元数据:用户对人物属性的定义
    • 基础信息
    • 调度时机:什么时候触发
    • 执行行为:做什么
    • 执行方式:单机/分布式/Map
  • 任务实例:一个确定的Job的一次运行实例
    • Job_id
    • 触发时间
    • 状态&结果
    • 过程信息:消息队列需要记录id

2.5 触发器

  • 核心职责:给定一系列任务,解析触发规则,在规定的时间点触发任务调度
  • 设计约束
    • 需支持大量任务
    • 需支持秒级调度
    • 周期任务需要多次执行
    • 需保证秒级扫描的高性能,避免资源浪费
  • 方案
    • 定时扫描+延时消息
    • 时间轮Quartz:存储环形队列,底层采用述祖实现,数组中每个元素可以存放一个任务列表;遍历任务列表,从里面找出当前时间点需要触发的任务列表;(链表、最小堆)
  • 高可用
    • 不同业务之间调度影响?
    • 负责扫描和触发机器down怎么办
    • 解法:
      • 存储上:不同国别、业务做资源隔离
      • 运行时:不同国别、业务分开执行
      • 部署时:采用多机房集群化部署
    • Trigger
      • 单Trigger模式:单点故障会崩溃
      • 集群模式:避免单点故障,但需要避免一任务被多次触发导致业务紊乱
      • 数据库行锁模式:触发调度之前更新数据库中JobInstance状态,成功抢锁才能触发调度
        • 多台机器频繁抢锁,节点越多性能越差
      • 分布式锁模式:尝试抢占分布式锁,可以使用Redis或zookeeper锁
        • 性能较高

2.6 调度器

  • 问题:资源来源、资源调度、任务执行
  • 资源来源
    • 业务系统提供机器来源
      • 优点:任务执行逻辑与业务系统同一份资源,利用率更高
      • 缺点:更容易发生定时任务脚本影响在线服务事故;不能由定时平台控制扩缩容
    • 定时任务平台提供机器资源
      • 优点:任务执行逻辑与业务系统在线服务隔离,避免相互影响;可以优雅扩缩容
      • 缺点:消耗更多机器资源;需要额外为定时任务平台申请接口调用权限,不能直接继承业务系统权限
  • 节点选择
    • 随机节点执行:选择集群中一个可用的节点执行调度
    • 广播执行:在集群中所有执行节点分发调度任务并执行
    • 分片执行:按照用户自定义分片逻辑分片执行
  • 任务分片:提高任务执行效率和任务利用率(类似Map)
  • 任务编排:使用DAG进行可视化任务编排
  • 故障转移:确保部分执行单元任务失败时任务最终成功
    • 分片任务基于一致性hash分发任务,当某executor异常时调度器会把任务发到其他executor上
  • 高可用:可以集群部署,做到完全无状态,靠消息队列重试机制保证一定会调度

2.7 执行器

Screen Shot 2023-02-07 at 10.44.31 PM.png

  • 基于注册中心,可以做到执行器的弹性扩缩容
  • 调度、回调上报
  • 状态上报:心跳

三、实践例——业务应用

  • 电商
    • 订单30分钟未支付自动关闭
    • 定时给商家、达人发送消息
    • 发送优惠券
  • 互动
    • 支付宝集五福
    • 字节集卡
  • 游戏
    • 活动结束后补发奖励
    • 更新游戏内榜单
  • 业务场景
    • 系统自动确认收货
      • 分布式定时任务:延时任务
      • 消息队列延时消息、定时消息
    • 春节集卡活动
      • 使用分布式定时任务MapReduce
      • 大数据离线处理Hive
      • 大数据在线实时处理Flink

四、总结

本节课主要介绍了分布式定时任务的相关内容。分布式定时任务与之前大数据课程上介绍的大数据处理很相似,其主要区别在于“定时”,即需要有时间点的定义。时间轮是本节课的一个难点,需要结合具体代码进行进一步的学习。分片调度、故障转移等也是分布式定时任务的关键。