三个问题:触发、调度、执行
- 触发器:Tigger,解析任务,生成触发事件
- 调度器:Scheduler,分配任务,管理任务的生命周期
- 执行器:Executor,获取执行任务单元,执行任务逻辑
- Admin,控制台,提供任务管理和干预的功能
- 功能架构
任务元数据
状态机:
任务实例
触发器
核心职责: 给定一系列任务,解析它们的触发规则,在规定的时间点触发任务的调度
- 定期扫描+延时消息
- 时间轮
- 链表储存任务
- 最小堆储存,按执行时间排序,每个节点存储执行时间任务表
- 数组存储最小堆,O(n)无限扩充
- 环形数组(时间轮)
- 给时间轮加圈数,计数
- 多级时间轮 :时轮、分轮、秒轮
高可用
问题:
不同业务之间,任务调度互相影响?
负责扫描和触发的机器都挂了怎么办?
单机
雪崩
集群
防止单点故障
执行紊乱
数据库行锁模式
任务抢锁,成功抢锁才会执行
任务之间频繁抢锁,抢锁开销大
分布式锁
触发调度之前,尝试抢占分布式锁,可使用Redis锁或Zookeeper锁
抢锁失败,放弃调度
节点选择
- 随机节点执行
- 广播执行:所有执行节点分发调度任务并执行
- 分片执行: 按照用户自定义的逻辑进行拆分任务,分发到集群中不同节点并行执行,提升资源利用率
- N个执行器,M个业务区段 ,M>=N 最好是整数倍
任务编排
有向无环图 : 定义依赖关系,再执行
故障转移
单元任务失败,保证最终任务成功
- 任务分发基于一致性哈希策略
- 消息队列的重试机制保证任务一定会被调用
执行器
- 弹性扩缩容