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

167 阅读2分钟

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

核心架构

分布式定时任务核心需要解决触发、调度、执行三个关键问题

  1. 触发器。用来解析任务,生成触发器。
  2. 调度器。用来分配任务,管理任务生命周期
  3. 执行器。用来获取执行任务的单元,执行任务逻辑。 我们可以把这三个组件看做一个控制台

数据流

QQ截图20220601224449.png

功能架构

  1. 触发器:
    • 解析引擎
    • scanner
    • 可靠投递
    • 状态流转
    • 补偿策略
  2. 调度器:
    • 调度
    • 限流
    • 负载均衡
    • 计费
    • 幂等控制
    • 优雅启停
    • 容错
    • 故障转移
    • 状态管控
    • ...
  3. 执行器:
    • 注册
    • 任务获取
    • 任务执行
    • 任务回调
    • 日志处理
    • 本地幂等
    • 状态上报
    • ...
  4. 控制台:
    • 元数据储存
    • 元数据状态流转
    • 任务暂停/恢复
    • 日志管理
    • 任务分片
    • 监控报警
    • 指标统计
    • 任务依赖
    • 规则引擎
    • ...

触发器

  • 核心职责:给定一系列任务,解析触发规则,在规定的时间触发任务调度。

  • 设计约束:

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

    • 定期扫描+延时消息(腾讯+字节): 扫描器定时从数据库扫描,将扫描出来的任务进行操作。但扫描出来的任务并不一定立刻进行操作。可以放入延时消息队列。
  • 设计方案2

    • 时间轮(Quartz): 使用时间轮储存任务。每一个节点储存相同时间执行的任务列表。
      • 可以使用多级时间轮储存任务。时轮-分轮-秒轮
  • 高可用

    • 核心问题:不同任务之间,任务的调度相互会影响。负责扫描和处罚的机器可能会发生故障。
    • 解决思路:
      • 储存部分对不同业务做资源隔离。
      • 执行部分对不同业务分离执行。
      • 部署部分采用集群化部署,避免单点故障。同时加锁保证任务只被触发一次。

调度器

  • 节点选择:
    • 随机节点执行: 选择一个节点执行调度任务。适用场景:定时对账
    • 广播执行:对集群中所有节点分阀调度任务并执行。适用场景:批量运维。
    • 分片执行:按照自定义分片进行拆分,并发布到不同节点执行。适用场景:海量日志统计。