太强了!全新一代分布式任务调度与计算框架!

大家好,我是 Java陈序员

我们在工作开发中,离不开任务调度。通过指定的间隔时间执行各类操作,来完成无需用户操作的任务。

目前市场上,有一些编程语言本身自带的定时任务工具,如 Java 中 Timer。也有一些比较成熟的定时任务框架,如 Quartz。现在大部分系统都是使用分布式,分布式的任务调度工具也是十分流行,如 xxl-job。

今天,给大家介绍一个全新一代分布式调度与计算框架!

关注微信公众号:【Java陈序员】,回复 AI ,获取AI副业赚钱资讯。

项目介绍

PowerJob(原 OhMyScheduler) ------ 全新一代分布式调度与计算框架,能让您轻松完成作业的调度与繁杂任务的分布式计算。

主要特性

  • 使用简单:提供前端Web界面,允许开发者可视化地完成调度任务的管理(增、删、改、查)、任务运行状态监控和运行日志查看等功能。
  • 定时策略完善:支持CRON表达式、固定频率、固定延迟和API四种定时调度策略。
  • 执行模式丰富:支持单机、广播、Map、MapReduce四种执行模式,其中Map/MapReduce处理器能使开发者寥寥数行代码便获得集群分布式计算的能力。
  • DAG工作流支持:支持在线配置任务依赖关系,可视化地对任务进行编排,同时还支持上下游任务间的数据传递
  • 执行器支持广泛:支持Spring Bean、内置/外置Java类、Shell、Python等处理器,应用范围广。
  • 运维便捷:支持在线日志功能,执行器产生的日志可以在前端控制台页面实时显示,降低debug成本,极大地提高开发效率。
  • 依赖精简:最小仅依赖关系型数据库(MySQL/Oracle/MS SQLServer...)。
  • 高可用&高性能:调度服务器经过精心设计,一改其他调度框架基于数据库锁的策略,实现了无锁化调度。部署多个调度服务器可以同时实现高可用和性能的提升(支持无限的水平扩展)。
  • 故障转移与恢复:任务执行失败后,可根据配置的重试策略完成重试,只要执行器集群有足够的计算节点,任务就能顺利完成。

产品对比

快速开始

0、基本概念

在开始使用前,需要先了解任务调度中相关的组件。

分组概念

appName:应用名称,建议与用户实际接入 PowerJob 的应用名称保持一致,用于业务分组与隔离。一个 appName 等于一个业务集群,也就是实际的一个 Java 项目。

核心概念

  • 任务(Job):描述了需要被 PowerJob 调度的任务信息,包括任务名称、调度时间、处理器信息等。
  • 任务实例( JobInstance,简称 Instance):任务(Job)被调度执行后会生成任务实例(Instance),任务实例记录了任务运行时的信息(任务与任务实例的关系类似于类与对象的关系)。
  • 作业(Task):任务实例的执行单元,一个 JobInstance 存在至少一个 Task,具体规则如下:
    • 单机任务(STANDALONE):一个 JobInstance 对应一个 Task
    • 广播任务(BROADCAST):一个 JobInstance 对应 N 个 Task,N为集群机器数量,即每一台机器都会生成一个 Task
    • Map/MapReduce任务:一个 JobInstance 对应若干个 Task,由开发者手动 map 产生
  • 工作流(Workflow):由 DAG(有向无环图)描述的一组任务(Job),用于任务编排。
  • 工作流实例(WorkflowInstance):工作流被调度执行后会生成工作流实例,记录了工作流运行时的信息。

扩展概念

  • JVM 容器:以 Maven 工程项目的维度组织一堆 Java 文件(开发者开发的众多 Java 处理器),可以通过前端网页动态发布并被执行器加载,具有极强的扩展能力和灵活性。
  • OpenAPI:允许开发者通过接口来完成手工的操作,让系统整体变得更加灵活。开发者可以基于 API 便捷地扩展 PowerJob 原有的功能。
  • 轻量级任务:单机执行且不需要以固定频率或者固定延迟执行的任务 ● 重量级任务:非单机执行或者以固定频率/延迟执行的任务

定时任务类型

  • API:该任务只会由 powerjob-client 中提供的 OpenAPI 接口触发,server 不会主动调度。
  • CRON:该任务的调度时间由 CRON 表达式指定。
  • 固定频率:秒级任务,每隔多少毫秒运行一次,功能与 java.util.concurrent.ScheduledExecutorService#scheduleAtFixedRate 相同。
  • 固定延迟:秒级任务,延迟多少毫秒运行一次,功能与 java.util.concurrent.ScheduledExecutorService#scheduleWithFixedDelay 相同。
  • 工作流:该任务只会由其所属的工作流调度执行,server 不会主动调度该任务。如果该任务不属于任何一个工作流,该任务就不会被调度。

备注:固定延迟和固定频率任务统称秒级任务,这两种任务无法被停止,只有任务被关闭或删除时才能真正停止任务。

1、初始化项目

1、克隆代码

bash 复制代码
git clone https://github.com/PowerJob/PowerJob.git

2、将项目导入到IDEA中,代码目录结构如下:

arduino 复制代码
├── LICENSE
├── powerjob-client // powerjob-client,普通Jar包,提供 OpenAPI
├── powerjob-common // 各组件的公共依赖,开发者无需感知
├── powerjob-remote // 内部通讯层框架,开发者无需感知
├── powerjob-server // powerjob-server,基于SpringBoot实现的调度服务器
├── powerjob-worker // powerjob-worker, 普通Jar包,接入powerjob-server的应用需要依赖该Jar包
├── powerjob-worker-agent // powerjob-agent,可执行Jar文件,可直接接入powerjob-server的代理应用
├── powerjob-worker-samples // 教程项目,包含了各种Java处理器的编写样例
├── powerjob-worker-spring-boot-starter // powerjob-worker 的 spring-boot-starter ,spring boot 应用可以通用引入该依赖一键接入 powerjob-server
├── powerjob-official-processors // 官方处理器,包含一系列常用的 Processor,依赖该 jar 包即可使用
├── others
└── pom.xml

2、启动调度服务器

1、创建数据库

sql 复制代码
CREATE DATABASE IF NOT EXISTS `powerjob-daily` DEFAULT CHARSET utf8mb4

2、修改配置文件中的数据库配置信息

需要修改的地方(路径: PowerJob/powerjob-server/powerjob-server-starter/src/main/resources/application-daily.properties)

properties 复制代码
spring.datasource.core.driver-class-name=com.mysql.cj.jdbc.Driver
spring.datasource.core.jdbc-url=jdbc:mysql://localhost:3306/powerjob-daily?useUnicode=true&characterEncoding=UTF-8&serverTimezone=Asia/Shanghai
spring.datasource.core.username=root
spring.datasource.core.password=root
spring.datasource.core.maximum-pool-size=20
spring.datasource.core.minimum-idle=5

tips:如果没有数据库环境,可以使用H2数据库,配置参考如下:

properties 复制代码
spring.datasource.core.driver-class-name=org.h2.Driver
spring.datasource.core.jdbc-url=jdbc:h2:file:~/h2/powerjob-daily-test
spring.datasource.core.username=sa
spring.datasource.core.password=

3、启动调度服务器

启动类:tech.powerjob.server.PowerJobServerApplication

4、启动成功后,访问:http://localhost:7700

5、注册执行应用

6、注册成功后即可开始登录使用

3、编写示例代码

1、修改 powerjob-worker-samplesapplication.properties,将 powerjob.worker.app-name 改为刚刚在控制台注册的名称

properties 复制代码
server.port=8081

spring.jpa.open-in-view=false

########### powerjob-worker 配置 ###########
# akka 工作端口,可选,默认 27777
powerjob.worker.akka-port=27777
# 接入应用名称,用于分组隔离,推荐填写 本 Java 项目名称
powerjob.worker.app-name=test
# 调度服务器地址,IP:Port 或 域名,多值逗号分隔
powerjob.worker.server-address=127.0.0.1:7700
# 持久化方式,可选,默认 disk
powerjob.worker.store-strategy=disk
# 任务返回结果信息的最大长度,超过这个长度的信息会被截断,默认 8192
powerjob.worker.max-result-length=4096
# 单个任务追加的工作流上下文最大长度,超过这个长度的会被直接丢弃,默认 8192
powerjob.worker.max-appended-wf-context-length=4096

2、编写自己的处理器类,继承你想要使用的处理器

目前有如下处理器类型:

  • 单机处理器:BasicProcessor
  • 广播处理器:BroadcastProcessor
  • 并行处理器:MapReduceProcessor
java 复制代码
@Component
@Slf4j
public class Test implements BasicProcessor {
    @Override
    public ProcessResult process(TaskContext context) throws Exception {

        // PowerJob 在线日志功能,使用该 Logger 打印的日志可以直接在 PowerJob 控制台查看
        OmsLogger omsLogger = context.getOmsLogger();
        omsLogger.info("StandaloneProcessorDemo start process,context is {}.", context);

        return new ProcessResult(true, "process successfully~");
    }
}

3、启动示例程序

启动类:ech.powerjob.samples.SampleApplication

4、配置运行任务

调度服务器与示例工程都启动完毕后,再次前往Web页面(http://localhost:7700/),进行任务的配置与运行。

1、在系统首页,可以看到连接到调度服务器的执行器信息

2、点击任务管理 -> 新建任务(右上角),开始创建任务。

3、完成任务创建后,即可在控制台看到刚才创建的任务

启用任务后即可开始调度任务,如果觉得等待调度太过于漫长,可以直接点击运行按钮,立即运行本任务。

4、任务示例菜单,可以查看任务的运行状态和在线日志

在任务实例中,可以查看任务的详情、日志,或者进行重试、停止活动。

最后

推荐的开源项目已经收录到 GitHub 项目,欢迎 Star

bash 复制代码
https://github.com/chenyl8848/great-open-source-project

或者访问网站,进行在线浏览:

bash 复制代码
https://chencoding.top:8090/#/

大家的点赞、收藏和评论都是对作者的支持,如文章对你有帮助还请点赞转发支持下,谢谢!

相关推荐
wanhengidc32 分钟前
云手机与模拟器的关系
大数据·运维·服务器·分布式·智能手机
烛之武1 小时前
SpringBoot 实战篇
java·spring boot·后端
李白的粉1 小时前
基于springboot的相亲网站
java·spring boot·毕业设计·课程设计·相亲网站
人工智能研究所2 小时前
字节开源 DeerFlow 2.0——登顶 GitHub Trending 1,让 AI 可做任何事情
人工智能·深度学习·开源·github·ai agent·字节跳动·deerflow2.0
iPadiPhone2 小时前
万亿级流量的基石:Kafka 核心原理、大厂面试题解析与实战
分布式·后端·面试·kafka
叶子野格2 小时前
Notepad++编写html文件使用D3绘图:数据可视化
笔记·学习·信息可视化·开源·notepad++
darkb1rd2 小时前
opencli-rs:单命令获取全网信息的 Rust 命令行神器
开源·github·好物分享
Fang fan2 小时前
Netty入门
java·开发语言·redis·分布式·python·哈希算法
向量引擎3 小时前
肝了三天三夜!四大AI模型(DeepSeek/Gemini/ChatGPT/豆包)深度横评,开发者该如何选?
人工智能·chatgpt·架构·开源·aigc·文心一言·api调用
老星*3 小时前
Supabase:开源Firebase替代完全指南:后端即服务的完整教程
开源·github·好用工具