1概述:

  • 现有相关的业务需求:某业务线要将该业务线NAS盘下1000万个文件备份到阿里云OSS上
  • 单纯用xxljob等工具不能完全满足业务要求,定时任务的执行策略不是统一的,不同的业务有不同的任务执行策略,比如有立即执行的,也有延时执行的,也有周期执行的
  • 所以计划新搭一个任务中心来统一处理这些业务差异
  • 任务中心存在的目的就是为了专门做文件的任务调度的(比如文件的备份,生命周期等),不跟任何业务有关联

1.1目的

  • 要高效,稳定的静默完成文件业务操作。比如:文件备份,文件生命周期处理.

2任务中心流程:

 

2.1流程解析

  • 生成任务:这个是最基本的,任务中心是围绕任务这个来展开的,只有先有了任务,才会有后面的任务调度等流程.一个要处理的文件可以看做是一个任务,如果有2000万个文件要处理,那就会有2000万个任务.
  • 任务调度:任务生成后,任务中心就要去执行这些任务,但是怎么执行,是即时立马执行,还是延时执行,需要根据任务的类型来选择哪种策略来调度执行
  • 队列+线程池:任务调度的时候,会把任务丢到队列里.用队列主要的考虑点是,流量销峰以及可以控制生产和消费任务的速度.也可以达到保护下游流服务稳定的目的。因为流服务一挂,用户侧文件上传,下载都会受到影响.线程池是用在消费队列上,通过线程池加快任务队列的消费速度
  • 状态机处理任务状态:线程池消费拿到队列任务后,就会执行状态流转。新建->执行中->执行超时->执行失败->执行成。任务执行过程中状态要有一个闭环。任务状态自动流转.比如任务执行超时,会把这个任务重新放到队列中,重新再走状态机流转。
  • 调用流服务:调用流服务做文件处理,也是在上面状态机流程中"执行中"这个状态去远程调用的流服务.

 

3部分代码展示:

整个工程目录如下:外部系统是依赖fs-task-sdk-spring-boot-start,fs-task-sdk-spring-boot-start里面引用了fs-task-sdk的包。

fs-task-sdk提供了对外的接口,fs-task-sdk引用了fs-task-common,fs-task-common目录结构如下,该目录主要包括一些model类和一些枚举类。

外部系统会调用fs-task-sdk包下的TaskCreateHandler#createTask(TaskCreateModel)方法进行备份操作

ConnHandler类如下,当调用它的send方法时,根据传入的类型获取对应的实现类,并调用其sendMsg()方法

有两种方式发往任务中心,一种是MQ的方式,一种是http的方式,我们看下mq方式的代码,如下图所示,mq方式主要干的事情就是接收入参,然后转换成入参对象,发送mq消息。

以上这些操作都是在sdk中进行的。


上面已经发送了mq消息,现在我们来看下mq消费消息的逻辑:

如上图所示,消费逻辑里面主要干的事情就是获取消息body,转换调度对象入参对象,然后选择调度策略,开始进行调度。

 

调度类的关系图如下,根据调度类型(即时调度,延时调度)选择对应的调度处理类处理。

如下是即时调度的场景。

生成任务后,将任务信息放入队列。

 队列配置:

队列消费:

线程池配置:

队列消费,执行状态机任务状态处理:

 任务状态状态机类关系图:

待处理状态处理逻辑:

执行中状态处理逻辑:

任务执行成功处理逻辑:

任务异常超时状态处理逻辑:

任务执行失败处理逻辑:

 

posted on 2023-05-17 20:27  路飞_lufei  阅读(67)  评论(0编辑  收藏  举报