任务调度设计
需求
满足日常任务调度需求,分布式任务调度。支持rpc调用写入任务,基于时间和自定义权重调度任务,并保障任务执行成功。可以支持:
- 一次性执行
- 定时执行
- 依赖执行:即假设(a,b)<-c,当执行c的时候,检查是否有有效期内并且执行成功的a和b,有的话直接执行c,否则先调用a和b,再调用c。
架构设计
参考
实现
设置3个队列存放任务(可基于redis的zset),进程分别对3个队列进行轮训监控,通过状态转移(redis需要lua脚本实现)实现任务调度,同时任务的状态不会丢失。
- 任务首先创建任务,并计算执行时间(根据任务类型、任务权重等计算)
- 基于执行时间讲任务写入就绪或等待队列
- 就绪队列立即执行,等待队列等到任务执行时间到时执行(就绪)
- 执行后任务放入待确认队列,等待成功回调(执行)
- 如果超时或失败,根据策略重新写入等待队列(挂起)
任务依赖处理
- 任务执行前后进行依赖检查
- 假设任务c调度依赖a和b。调度c时如果a、b任务不满足,挂起c的同时会调度a和b一次
- a和b执行完成后会执行依赖检查,拉起c任务