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

124 阅读2分钟

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

分布式定时任务

核心架构

首先,得明确分布式定时任务核心要解决触发、调度、执行三个关键问题

  • 触发器:Trigger,解析任务,生成触发事件

    功能拆分:解析引擎,Scanner,可靠投递,状态流转,补偿策略

  • 调度器:Scheduler,分配任务,管理任务生命周期

    调度,负载均衡,幂等控制,容错,限流,状态管控,优雅启停

  • 执行器:Executor,获取执行任务单元,执行任务逻辑

    注册,获取任务,执行任务,上报状态,处理日志,本地幂等,任务回调

  • 控制台:Admin,提供任务管理和干预的功能

    元数据存储和状态流转,任务分片、依赖、恢复、暂停,日志管理,指标统计,监控报警,规则引擎

Job

状态机

image-20220602193732571.png 1 n 1 n

Job ———— JobInstance —— ——JobResult

| 1

|

| n

JobHistory 任务历史,用户可以修改任务信息,任务示例对应的任务元数据可以不同,因而使用任务历史存储

job 任务元数据是用户对任务属性定义,包括

  1. 基础信息,比如任务名称,属于什么类型,归属的业务
  2. 调度时机,就是规定任务执行的时间
  3. 执行行为,任务触发后需要执行的业务逻辑
  4. 执行方式,单机执行,还是广播执行还是分片触发

jobinstance 任务实例,是一个确定的Job的一次运行实例,包括:

  1. Job_id
  2. 触发时间,他真正实际触发的时间
  3. 状态和结果
  4. 过程信息 ,用来后续可能撤回一些任务

image-20220602194310199.png

触发器

实现方案

  1. 定期扫描+延时消息

image-20220602194801098.png 1Scan定期扫描,扫描出来的不一定会立即执行,提交给processor后会2Send给延时MQ,发送成功后就会3change state防止消息之后被重复读取

  1. 时间轮

    批量化调度,是一个存储环形队列,底层用数组存放定时任务列表

    查询O(1),修改O(1)

    详情参考:xie.infoq.cn/article/5df…

高可用

使用分布式锁(redis或者zk),使用数据库行锁的话,节点越多性能越差