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

147 阅读6分钟

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

  • 春节集卡
    • 分布式定时任务
      • 自动化
      • 定时执行
      • 海量数据
      • 高效稳定
  • 发展历程
    • Windows批处理
    • Windows任务计划程序
    • Linux命令-CronJob
      • case 1:每天定时清理机器日志
        *****command to be executed
        // 前五个*代表时间
        //min hour (day of month) month (day of week)
        
      • linux系统命令,使用简单,稳定可靠
      • 只能控制单台机器,且无法适用于其他操作系统
    • 单机定时任务-Timer、Ticker
      • case 2: 每隔5分钟定时刷新本地缓存数据
      func main(){
          ticker := time.NewTicker(5*time.Minute)
          for{
              select{
              case <-ticker.C:
                  SyncLocalCache()
              }
          }
      }
      
      • 跨平台
      • 仅单机可用
    • 单机定时任务-ScheduledExecutorService
      • 拥有线程池资源
      • 单机可用
    • 任务调度-Quartz
      • 单任务极致控制
      • 没有负载均衡机制
    • 分布式定时任务
      • 定时任务是指系统为了自动完成特定任务,实时、延时、周期性完成任务调度的过程。分布式定时任务是把分散的、可靠性差的定时任务纳入统一平台,并实现集群管理调度和分布式部署的一种定时任务的管理方式。
      • 按触发时机分类
        • 定时任务
          • 特定时间触发
        • 延时任务
          • 延时触发
        • 周期任务
          • 固定周期时间,或固定频率周期调度触发
      • 特点
        • 自动化
          • 全自动完成定时任务的调度和执行
        • 平台化
          • 基于平台化思维管控一系列的分布式定时任务
        • 分布式
          • 在分布式系统环境下运行任务调度,突破单机定时任务的性能瓶颈
        • 伸缩性
          • 采用集群方式部署,可以随时按需扩缩容
        • 高可用
          • 单点故障不影响最终任务结果,可以做到故障转移
      • 执行方式
        • 单机任务
          • 随机触发一台机器执行任务,适用于计算量小、并发度低的任务
        • 广播任务
          • 广播到所有机器上执行同一个任务,比如所有机器一起清理日志
        • Map任务
          • 一个任务可以分出多个子任务,每个子任务负责一部分计算。适用于计算量大,单机无法满足要求的任务
        • MapReduce任务
          • 在Map任务的基础上,可以对所有子任务的结果做汇总计算,适用于计算量大,并且需要对子任务结果做汇总的任务
      • 分布式定时任务vs单机定时任务
        • 关系
          • 都可以实现自动化的定时、延时、周期任务调度
        • 差异
          • 分布式定时任务可支撑更大的业务体量
          • 分布式定时任务的性能、伸缩性、稳定性更高
      • 分布式定时任务vs大数据处理引擎
        • 关系
          • 都可以对海量数据做处理
          • 性能、伸缩性、稳定性都很高
        • 差异
          • 定时并不是大数据处理引擎要解决的核心问题
          • 大数据处理引擎往往致力于将源数据处理为结果数据,分布式定时任务除了能做这个之外,还可以调用HTTP的RPC服务
  • 实现原理
    • 核心架构
      • 分布式定时任务核心解决触发调度执行三个关键问题
        • 触发器Trigger
          • 解析任务,生成触发事件
        • 调度器Scheduler
          • 分配任务,管理任务生命周期
        • 执行器Executor
          • 获取执行任务单元,执行任务逻辑
        • 控制台Admin
          • 任务管理和干预
    • 控制台Admin
      • 基本概念
        • 任务Job
          • 任务元数据
            • 用户对任务属性定义,包括任务类型、调度时机、执行行为、执行方式等
        • 任务实例JobInstance
          • 任务执行的实例
            • Job_id
            • 触发时间
            • 状态&结果
            • 过程信息
        • 任务结果JobResult
          • 任务实例运行的结果
        • 任务历史JobHistory
          • 用户可以修改任务信息,任务实例对应的任务元数据可以不同,因而使用任务历史存储
    • 触发器Trigger
      • 核心职责
        • 给定一系列任务,解析它们的触发规则,在规定时间点触发任务调度
      • 设计约束
        • 需支持大量任务
        • 需支持秒级调度
        • 周期任务需要多次执行
        • 需保证秒级扫描的高性能,并避免资源浪费
      • 设计方案
        • 定时扫描+延时消息
        • 时间轮
          • 一种高效利用线程资源进行批量化调度的一种调度模型。时间轮是一个存储环形队列,底层采用数组实现,数组中每个元素可以存放一个定时任务列表。
          • 多级时间轮
      • 高可用
        • 核心问题
          • 不同业务之间,任务的调度相互影响
          • 负责扫描和触发的机器宕机
        • 解决思路
          • 存储上,不同国别、业务做资源隔离
          • 运行时,不同国别、业务分开执行
          • 部署时,采用多机房集群化部署,避免单点故障,通过数据库锁或分布式锁保证任务只被触发一次
        • trigger模式
          • trigger模式
            • 会有单点故障
            • 机器故障时平台崩溃
          • trigger集群模式
            • 可避免单点故障
            • 需要避免同一任务被多次触发,导致业务紊乱
          • 数据库行锁模式
            • 在触发调度之前,更新数据库中JobInstance状态,成功抢锁的才会触发调度
          • 分布式锁模式
            • 在触发调度之前,尝试抢占分布式锁,可使用redis锁或zookeeper锁
    • 调度器Scheduler
      • 资源来源
        • 业务系统提供机器资源
          • 优点
            • 任务执行逻辑与业务系统共用同一份资源,利用率更高
          • 缺点
            • 更容易发生定时任务脚本影响在线服务的事故
            • 不能由定时任务平台控制扩缩容
        • 定时任务平台提供机器资源
          • 优点
            • 任务执行逻辑与业务系统提供的在线服务器隔离,避免相互影响
            • 可以支持优雅地扩缩容
          • 缺点
            • 消耗更多机器资源
            • 需要额外为定时任务平台申请接口调用权限,而不能直接继承业务系统权限
      • 资源调度
        • 节点选择
          • 随机节点执行
            • 选择集群中一个可用的执行节点执行调度任务。适用场景:定时对账
          • 广播执行
            • 在集群中所有的执行节点分发调度任务并执行。适用场景:批量运维
          • 分片执行
            • 按照用户自定义分片逻辑进行拆分,分发到集群中不同节点并行执行,提升资源利用效率。适用场景:海量日志统计
        • 高级特性
          • 任务编排
          • 故障转移
        • 高可用
          • 调度器可以集群部署,做到完全的无状态,靠消息队列的重试机制保障任务一定被调度
    • 执行器Executor
      • 基于注册中心,可以做到执行器的弹性扩缩容
      • 注册、调度、回调、心跳检测