这是我参与「第三届青训营 -后端场」笔记创作活动的第3篇笔记
分布式定时任务
核心架构
首先,得明确分布式定时任务核心要解决触发、调度、执行三个关键问题
-
触发器:Trigger,解析任务,生成触发事件
功能拆分:解析引擎,Scanner,可靠投递,状态流转,补偿策略
-
调度器:Scheduler,分配任务,管理任务生命周期
调度,负载均衡,幂等控制,容错,限流,状态管控,优雅启停
-
执行器:Executor,获取执行任务单元,执行任务逻辑
注册,获取任务,执行任务,上报状态,处理日志,本地幂等,任务回调
-
控制台:Admin,提供任务管理和干预的功能
元数据存储和状态流转,任务分片、依赖、恢复、暂停,日志管理,指标统计,监控报警,规则引擎
Job
状态机
1 n 1 n
Job ———— JobInstance —— ——JobResult
| 1
|
| n
JobHistory 任务历史,用户可以修改任务信息,任务示例对应的任务元数据可以不同,因而使用任务历史存储
job 任务元数据是用户对任务属性定义,包括
- 基础信息,比如任务名称,属于什么类型,归属的业务
- 调度时机,就是规定任务执行的时间
- 执行行为,任务触发后需要执行的业务逻辑
- 执行方式,单机执行,还是广播执行还是分片触发
jobinstance 任务实例,是一个确定的Job的一次运行实例,包括:
- Job_id
- 触发时间,他真正实际触发的时间
- 状态和结果
- 过程信息 ,用来后续可能撤回一些任务
触发器
实现方案
- 定期扫描+延时消息
1Scan定期扫描,扫描出来的不一定会立即执行,提交给processor后会2Send给延时MQ,发送成功后就会3change state防止消息之后被重复读取
-
时间轮
批量化调度,是一个存储环形队列,底层用数组存放定时任务列表
查询O(1),修改O(1)
高可用
使用分布式锁(redis或者zk),使用数据库行锁的话,节点越多性能越差