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

125 阅读3分钟

这是我参与「第五届青训营 」伴学笔记创作活动的第 10 天

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

简介

定时任务案例

  • Windows批处理
  • Windows任务计划程序
  • Linux命令 CronJob
  • 单机定时任务 Timer/Ticker
  • 任务调度框架 Quartz 以上适合单机环境,不适合分布式定时任务

分布式定时任务优点

  • 平台化管理
  • 分布式部署
  • 支持海量数据

定义

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

特点

  • 自动化
  • 平台化
  • 分布式
  • 伸缩性
  • 高可用

执行方式

  • 单机任务:随机出发一台机器执行任务,适用于计算量小、并发度低的任务,和单机模式差别不大
  • 广播任务: 广播所有机器上执行同一个任务,比如所有机器一起清日志
  • Map任务(核心): 一个任务分出多个子任务,每个子任务负责一部分计算。适用于计算量大,单机无法满足要求的任务。
  • MapReduce任务: 在Map任务基础上对所有子任务的结果做汇总计算

业内定时任务框架

image.png

原理

核心架构

核心是解决触发、调度、执行三个关键问题

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

初次之外,需要一个控制台(Admin)提供任务管理和干预

数据流

image.png

功能框架

image.png

基础概念

  • Job:基础信息,调度时机,执行行为,执行方式
  • JobInstance:Job_id,触发时间。状态&结果,过程信息
  • JobResult
  • JobHistory

触发器

解析触发规则,在规定的时间点触发任务的调度

设计约束

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

方案一:定期任务+延时消息

  1. scanner扫db,扫出来x时间后要执行的任务
  2. 告诉延时消息队列要执行的任务
  3. 修改Db中任务状态(避免任务被频繁扫描多次执行)
  4. 延时MQ执行

方案二:时间轮(Quartz所用)

模拟时钟

image.png

image.png

高可用问题

image.png

为避免单点故障使用多个触发器,为避免同一个任务被多次触发,在触发调度前:

  • 数据库行锁:成功抢锁的才会触发调度。缺点:多台机器频繁竞争数据库锁,节点越多,性能越差。
  • 分布式锁:Redis锁或Zookeeper锁

调度器

资源来源:

  • 业务系统
  • 定时任务平台

节点选择

  • 随机节点执行:如定时对账
  • 广播执行:如批量运维
  • 分片执行:自定义分片,如海量日志统计

image.png

任务编排

任务之间存在逻辑先后关系,可用有向无环图可视化

高可用

调度器集群部署,靠消息队列的重试机制保证任务一定被调度

执行器

image.png