Disjob是一款分布式的任务调度框架,天然为支持分布式长任务执行而设计,它除了具备常规的任务调度功能外,还提供:任务拆分及分布式并行执行、暂停及取消运行中的任务、恢复执行被暂停的任务、任务执行失败重试、保存任务的执行快照(Checkpoint)、任务依赖、任务编排(DAG)、广播任务等能力。
以下是Disjob的整体流程图:
特性
- 分为管理器(Supervisor)和执行器(Worker)两种角色,Supervisor与Worker可分离部署
- Supervisor与Worker通过注册中心相互发现,支持的注册中心有:Database、Redis、Consul、Nacos、Zookeeper、Etcd
- Supervisor负责生成任务,把任务派发给Worker执行,支持的任务派发方式有:Redis、Http
- 需要指定Job的分组(job-group),Job的任务只会派发给指定组的Worker执行
- 提供拆分任务的能力,重写拆分方法JobHandler#split即可拆分为多个任务,实现分布式任务及并行执行
- 支持暂停和取消运行中的任务,已暂停的任务可恢复继续执行,执行失败的任务支持重试
- 支持任务保存(savepoint)其执行状态,让手动或异常暂停的任务能从上一次的执行状态中恢复继续执行
- 任务在执行时若抛出PauseTaskException,会暂停对应实例下的全部任务(包括分布在不同worker机器中的任务)
- 支持广播任务,广播任务会派发给job-group下的所有worker执行
- 支持Job间的依赖,多个Job配置好依赖关系后便会按既定的依赖顺序依次执行
- 支持DAG工作流,可把jobHandler配置为复杂的DAG表达式,如:A->B,C,(D->E)->D,F->G
- 提供Web管理后台,通过界面进行作业配置,任务监控等
项目结构
disjob # 主项目①
├── disjob-admin # 管理后台项目②(基于Ruoyi框架二次开发)
├── disjob-bom # Maven project bom module
├── disjob-common # 公共的工具类模块
├── disjob-core # 任务调度相关的核心类(如数据模型、枚举类、抽象层接口等)
├── disjob-dispatch # 任务派发模块
│ ├── disjob-dispatch-api # 任务派发的抽象接口层
│ ├── disjob-dispatch-http # 任务派发的Http实现
│ └── disjob-dispatch-redis # 任务派发的Redis实现
├── disjob-id # 分布式ID生成模块
├── disjob-registry # Server(Supervisor & Worker)注册模块
│ ├── disjob-registry-api # Server注册中心的抽象接口层
│ ├── disjob-registry-consul # Server注册中心:Consul实现
│ ├── disjob-registry-database # Server注册中心:Database实现
│ ├── disjob-registry-etcd # Server注册中心:Etcd实现
│ ├── disjob-registry-nacos # Server注册中心:Nacos实现
│ ├── disjob-registry-redis # Server注册中心:Redis实现
│ └── disjob-registry-zookeeper # Server注册中心:Zookeeper实现
├── disjob-reports # 聚合各个模块的测试覆盖率报告
├── disjob-samples # Samples项目③
│ ├── disjob-samples-frameless-worker # Worker单独部署的范例(普通Java-main应用)
│ ├── disjob-samples-springboot-common # Samples Spring-boot公共模块
│ ├── disjob-samples-springboot-merged # Supervisor与Worker合并部署的范例(Spring-boot应用)
│ ├── disjob-samples-springboot-supervisor # Supervisor单独部署的范例(Spring-boot应用)
│ └── disjob-samples-springboot-worker # Worker单独部署的范例(Spring-boot应用)
├── disjob-supervisor # Supervisor代码
├── disjob-test # 用于辅助测试
└── disjob-worker # Worker代码
评论