这是我参与「第五届青训营 」伴学笔记创作活动的第 16 天
了解分布式定时任务的实现原理有助于我们建立对分布式定时任务的宏观认知和知识体现。本文就将根据分布式定时任务的核心对其原理进行介绍。
核心架构
分布式定时任务核心要解决触发、调度、执行三个关键问题。为了解决这三个问题,我们需要三个核心的组件(触发器、调度器、执行器)和一个控制台。因此可将整个分布式定时任务分为四个部分,但这只是一个高度抽象的架构,并不是所有的分布式定时任务都是这样的架构。
控制台
提供任务管理和干预的功能。
任务元数据是用户对任务属性定义,包括任务类型调度时机、执行行为等。
任务实例是一个确定的Job的一次运行实例。
任务结果是任务实例运行的结果
任务历史是用于存储修改前的任务信息
触发器
给定一系列任务,解析它们的触发规则,在规定的时间点触发任务的调度。
**定期扫描+延时消息:**周期性的扫描搜索出近期要执行的任务,然后发送一些延时消息并更改任务的状态来实现触发。
**时间轮:**时间轮是一个存储环形队列,底层采用数组实现,数组中的每一个元素可以存放一个定时任务列表。
注意:为了保证触发器的高可用,在存储和运行上需要将不同国别、业务做资源隔离;部署时要采用多机房集群化部署,避免单点故障,通过数据库锁或分布式锁保证任务只被触发一次。
调度器
分配任务,管理任务生命周期。
**节点选择:**节点选择有三种方式,分别是随机节点执行,广播执行,分片执行。分片执行需要先将任务进行分片,再将分片分发到集群中不同节点并行执行,以此提升资源利用效率。
高级特性:
- 任务编排:使用有向无环图DAG进行可视化任务编排。
- 故障转移:确保部分执行单元任务失败时,任务最终成功。
注意:为了保证调度器的高可用,调度器可以集群部署,做到完全的无状态,靠消息队列的重试机制保障任务一定会被调度。
执行器
获取执行任务单元,执行任务逻辑。
执行器先在调度中心进行注册,在调度器发出调度请求后开始任务执行,执行过程中可能会有日志回传或回调请求,另外在执行过程中也会进行状态上报作为心跳检测。
基于注册中心,可以做到执行器的弹性扩缩容。