Dispather - 任务调度系统方案设计
2024-04-09 20:30:38  阅读数 453

1. 概述

计算平台的一个核心功能,是任务调度,包含任务之间的依赖处理、任务之间传参、任务的执行等。

本文重点分析和介绍任务调度的需求总结、数据库设计与架构设计。

2. 需求总结

2.1. 术语介绍

术语

  • Pipeline,即管线,这里指实际的药物研发管线,例如plk1、zinc
  • Job,或Workflow,即任务流,是一系列Task的有向无环图,包含所属Pipeline、创建人、描述、定时配置、hook、最大运行实例数等
  • Task,即任务,是执行某一个特定任务的参数集合,包含任务类型、任务配置、任务输入、任务输出等
  • Job Instance,指任务流实例。每运行一次Job,则产生一个Job Instance
  • Task Instance,指任务实例。每运行一次Task,则产生一个Task Instance

实体之间关系

  • Pipeline -> Job, 1 -> n
  • Job -> Task, 1 -> n
  • Job -> Job Instance, 1 -> n
  • Task -> Task Instance, 1 -> n
  • Job Instance -> Task Instance, 1 -> n

实体的操作

  • 对于Pipeline,支持修改、增加、删除(没有其相关联的Job时)、废弃、完结
  • 对于Job,支持修改、增加、删除(将删除其相关联的所有Job Instance)、锁定(锁定后不能修改其配置)、解锁、克隆
  • 对于Job Instance,支持暂停、启动、终止、重试
  • 对于Task Instance,支持强制终止

2.2. 需求与功能描述

2.2.1. Job的运行方法支持多种

  • a.【完整Job】自动运行,由定时器触发,例如每天晚上11点开始
  • b.【完整Job】手动运行,由用户手动触发,例如web ui或api触发
  • c.【部分Job】手动运行单个Task,不包含该Task的下游Task
  • d.【部分Job】手动运行单个Task,包含该Task的下游Task

方法c和d,需要考虑起始Task任务输入
可以默认其前置Task最近一次Task Instance任务输出
也可以将其前置Task所有Task Instance任务输出按照时间罗列出来,由用户选择其中一个或多个
如果前置Task不存在Task Instance,则提示warning,由用户确定是否坚持运行
另外,方法d的起始Task可能不止一个,要选择一个最小的Subgraph

2.2.2. 修改Task的配置

支持修改、删除或增加Task,修改Task包含Task依赖、Task配置参数等。

Job的Task配置

  • Job包含的Task配置,随时可以修改、增加或删除,没有限制

Job Instance的Task配置

  • 创建Job Instance时,会复制一份Job当前的Task配置,作为其执行计划
  • 所以,支持修改某个未运行的Task参数、输入、输出,暂不支持修改任务依赖,也不支持新增或删除

2.2.3. 日志查看

  • 调度日志,按照Job Instance分为单独文件,用于查看和分析执行情况
  • 任务执行日志,根据不同的任务类型,由任务自身存储

2.2.4. 任务类型

  • docker container
  • docker swarm service
  • slurm task

3. 数据库设计

4. 架构设计