一飞开源
阅读459

[开源]分布式的任务调度框架,轻量级、简单易用、历经生产检验

一飞开源,介绍创意、新奇、有趣、实用的开源应用、系统、软件、硬件及技术,一个探索、发现、分享、使用与互动交流的开源技术社区平台。致力于打造活力开源社区,共建开源新生态!

一、开源项目简介

图片

一款分布式的任务调度框架,除了具备常规的任务调度功能外,还提供:暂停/取消运行中的任务、恢复执行被暂停的任务、任务拆分、失败重试、广播任务、任务依赖、工作流任务(DAG)、管理器与执行器分离部署、Web管理后台等能力。

轻量级,简单易用,特别适合长任务的执行。有较好的伸缩性、扩展性、稳定性,历经生产检验。

二、开源协议

使用Apache-2.0开源协议

三、界面展示

图片

图片

图片

图片

四、功能概述

特性

  • 分为管理器(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项目bom模块
├── 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代码

对比

特性

Quartz

Elastic-Job

Xxl-Job

Disjob

时间类型

Cron

Cron

Cron

Cron、指定时间、固定频率、固定延时

任务编排

不支持

不支持

任务依赖

DAG表达式、任务依赖

任务分片

不支持

静态分片

广播任务

广播任务、动态分片

停止与恢复

不支持

不支持

终止运行中的任务

暂停执行中的任务、恢复已暂停的任务

保存执行快照

不支持

不支持

不支持

支持

失败重试

不支持

失效转移

支持

支持

后台管理

不支持

支持

支持

支持

监控告警

不支持

邮件

邮件

暂不支持

查看执行日志

不支持

支持

支持

暂不支持

Maven 依赖

<dependency>
  <groupId>cn.ponfee</groupId>
  <artifactId>disjob-{xxx}</artifactId>
  <version>2.0.4</version>
</dependency>

从源代码构建

./mvnw clean install -DskipTests -Dcheckstyle.skip=true -Dmaven.javadoc.skip=true -U
快速入门

1、在开发工具中分别导入项目(分为三个独立的项目,共用一个git仓库)

  • 主项目—disjob

  • 管理后台—disjob-admin

  • 范例项目—disjob-samples

2、启动以下各应用组成分布式调度集群

已配置不同的端口可同时启动。可以在开发工具中运行Java类,也可通过java -jar命令运行构建好的jar包。

  • 启动内嵌的本地Mysql & RedisMacOS系统若报MariaDB的“Library not loaded”错误时参考使用客户端工具连接mysql时,用户名为root,无需密码启动时已经自动执行了初始化的SQL脚本

  • 启动Worker单独部署的Spring-boot应用

  • 启动Worker单独部署的普通Java-main应用

  • 启动Supervisor+Worker合并部署的Spring-boot应用

  • 启动Supervisor单独部署的Spring-boot应用

  • 启动Admin管理后台的Spring-boot应用

3、登录管理后台
  • 浏览器访问【 http://127.0.0.1:80/ 】登录管理后台,用户名/密码:admin/admin123

  • 登录后在左侧菜单栏找到调度管理菜单,即可使用调度管理功能

  • 调度配置:作业(job)配置,包括查看、新增、修改、删除、触发、禁用等

  • 调度实例:job具体时间点要触发执行的实例(instance),一个实例被拆分成若干个任务(task)第一个分页表格为查询root实例并支持下钻,root是指首次触发的实例,包括:普通的非重试实例、工作流(DAG)的lead实例、依赖关系的第一个实例鼠标向下滚动页面后看到的第二个分页表格为查询所有实例

用户指南

1、项目包含两个SQL脚本

  • 核心框架的SQL脚本

  • 管理后台的SQL脚本

2、在Maven pom文件中更改注册中心disjob-registry-{xxx}和任务派发disjob-dispatch-{xxx}的具体实现
  • Samples项目

  • Admin项目

  • 默认使用disjob-registry-redis做注册中心,disjob-dispatch-http做任务派发

3、Samples项目配置文件
  • Supervisor角色Mysql配置

  • Supervisor角色核心配置

  • Worker角色核心配置(Spring-boot应用)

  • Redis配置(Worker与Supervisor共用,使用Redis做注册中心或任务派发时需要配置)

  • Spring-boot Web相关配置(Worker与Supervisor共用)

  • Worker角色普通Java-main应用配置

4、Admin项目配置文件
  • Supervisor角色相关的Mysql配置

  • Redis配置(Worker与Supervisor共用,使用Redis做注册中心或任务派发时需要配置)

  • 可加@EnableWorker注解启用Worker角色(管理后台必须启用Supervisor角色)

  • 管理后台功能相关的Mysql配置

  • RuoYi框架相关配置参考(disjob-admin中只新增了ruoyi-disjob模块,其它RuoYi原有的模块基本没有改动)

5、各种注册中心配置类参考(Redis使用Spring-boot自带的配置方式)
  • Consul

  • Database

  • Zookeeper

  • Nacos

  • Etcd

例如:若使用Consul做配置中心时,可加如下配置
disjob.registry.consul:
 namespace: consul_namespace
 host: localhost
 port: 8500
 token:

6、一些内嵌的本地Server

  • Mysql Server

  • Redis Server

  • Zookeeper Server

  • Consul Server

  • Nacos Server(依赖本地docker环境)

  • Etcd Server(依赖本地docker环境)

更多内容请查看 README.md 文档

六、源码地址

源码下载

关注下面的标签,发现更多相似文章

一飞开源
发布了 篇专栏 · 获取点赞 · 获取阅读

评论

查看更多
相关推荐
关于作者
一飞开源
获得点赞 100
文章被阅读 1000
相关文章