这是我参与「第三届青训营-后端场」笔记创作活动的第三篇笔记
核心架构
分布式定时任务核心需要解决触发、调度、执行三个关键问题
- 触发器。用来解析任务,生成触发器。
- 调度器。用来分配任务,管理任务生命周期
- 执行器。用来获取执行任务的单元,执行任务逻辑。 我们可以把这三个组件看做一个控制台
数据流
功能架构
- 触发器:
- 解析引擎
- scanner
- 可靠投递
- 状态流转
- 补偿策略
- 调度器:
- 调度
- 限流
- 负载均衡
- 计费
- 幂等控制
- 优雅启停
- 容错
- 故障转移
- 状态管控
- ...
- 执行器:
- 注册
- 任务获取
- 任务执行
- 任务回调
- 日志处理
- 本地幂等
- 状态上报
- ...
- 控制台:
- 元数据储存
- 元数据状态流转
- 任务暂停/恢复
- 日志管理
- 任务分片
- 监控报警
- 指标统计
- 任务依赖
- 规则引擎
- ...
触发器
-
核心职责:给定一系列任务,解析触发规则,在规定的时间触发任务调度。
-
设计约束:
- 需要支持大量任务
- 需要支持秒级调度
- 周期任务多次执行
- 需要保证扫描的高性能,避免资源浪费
-
设计方案1
- 定期扫描+延时消息(腾讯+字节): 扫描器定时从数据库扫描,将扫描出来的任务进行操作。但扫描出来的任务并不一定立刻进行操作。可以放入延时消息队列。
-
设计方案2
- 时间轮(Quartz): 使用时间轮储存任务。每一个节点储存相同时间执行的任务列表。
- 可以使用多级时间轮储存任务。时轮-分轮-秒轮
- 时间轮(Quartz): 使用时间轮储存任务。每一个节点储存相同时间执行的任务列表。
-
高可用
- 核心问题:不同任务之间,任务的调度相互会影响。负责扫描和处罚的机器可能会发生故障。
- 解决思路:
- 储存部分对不同业务做资源隔离。
- 执行部分对不同业务分离执行。
- 部署部分采用集群化部署,避免单点故障。同时加锁保证任务只被触发一次。
调度器
- 节点选择:
- 随机节点执行: 选择一个节点执行调度任务。适用场景:定时对账
- 广播执行:对集群中所有节点分阀调度任务并执行。适用场景:批量运维。
- 分片执行:按照自定义分片进行拆分,并发布到不同节点执行。适用场景:海量日志统计。