powerJob调研报告

powerJob调研报告

Posted by John Doe on 2024-05-16
Words 2.6k and Reading Time 9 Minutes
Viewed Times

背景

PowerJob 可以被认为是第三代任务调度框架,在任务调度的基础上,还额外提供了分布式计算和工作流功能,其主要特性如下:

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

PowerJob 适用场景

综上所述,PowerJob 是全新一代分布式调度与计算框架,能让您轻松完成任务的调度与繁杂任务的分布式计算。适用于各个有任务调度需求的企业,统一部署 Server 做为整个公司的公共调度平台,成为分布式调度的中间件。

  • 有定时执行需求的业务场景:如每天凌晨全量同步数据、生成业务报表等。
  • 有需要全部机器一同执行的业务场景:如使用广播执行模式清理集群日志。
  • 有需要分布式处理的业务场景:比如需要更新一大批数据,单机执行耗时非常长,可以使用 Map/MapReduce 处理器完成任务的分发,调动整个集群加速计算。

PowerJob与同类型产品对比

QuartZ xxl-job ElasticJob SchedulerX 2.0 PowerJob
定时类型 CRON CRON CRON、OpenAPI CRON、固定频率、固定延迟、OpenAPI CRON**(15秒以上)、固定频率、固定延迟(控制台设置的2倍时间)、OpenAPI**
任务类型 内置Java 内置Java、GLUE Java、Shell、Python等脚本 内置Java、Shell、Python等脚本 内置Java、外置Java(FatJar)、Shell、Python等脚本 内置Java、外置Java(容器)、Shell、Python等脚本
分布式任务 静态分片 静态分片 MapReduce 动态分片 MapReduce 动态分片
在线任务治理 不支持 支持 支持 支持 支持
日志白屏化 不支持 支持 添加 ElasticJob-UI**组件后支持** 不支持 支持
调度方式及性能 基于数据库锁,有性能瓶颈 基于数据库锁,有性能瓶颈 基于Zookeeper分布式锁,调度端可以动态水平扩容,高可用高性能。 不详(云服务的功能决定,那边控制限流后性能自然会降低) 无锁化设计(调度端调度任务这一操作无锁),性能强劲无上限
报警监控 邮件 邮件、企业微信、钉钉 短信 邮件,提供接口允许开发者扩展
系统依赖 关系型数据库(MySQL、Oracle…) MySQL Zookeeper 人民币 任意 Spring Data Jpa支持的关系型数据库(MySQL、Oracle…)
DAG 工作流 不支持 不支持 有简单流处理,DAG官网显示todo(在做了但不知道啥时候做完) 支持 支持

技术选型总结

PowerJob:

  • 优点:

    ​ 相较于xxl-job和ElasticJob,power job调度操作无锁,更具备高并发高性能优势。

    ​ 相较于ElasticJob更轻量级,没有其他必须的中间件支持,方便管理。

    ​ 相较于xxl-job必须使用mysql,powerJob支持的数据库连接总类丰富,对数据库的操作大多使用spring data jpa实现,理论上只要jpa支持的数据库都可以使用。

    ​ 系统设计理论基于阿里的自研中间件Schedulerx2.0,具备Map/Reduce大数据分布式计算、DAG工作流调度、脚本调度、API、容器(JVM 级容器jar包,非操作系统级容器Docker)执行等高级功能。

    ​ PowerJob的调度中心具备高性能特性,调度中心只关注调度任务及其结果,定时任务的执行压力都被分摊到各个worker执行端(使用调度服务的应用端),且如果定时执行时间达到毫秒级别(非cron表达式的前提)任务的下次执行时间等计算也都交给执行端,调度中心CPU计算压力较小性能高。

  • 缺点:

    ​ 社区相对没有xxl-job和ElasticJob活跃,github上关注人数没有另外2个多,开发测试人员较少,测试覆盖范围可能没有其他2个广(MySqlSeriesDfsService这个容器高级特性的实现类注解写明官方只基于mysql进行了测试)。

    ​ 对于没有分布式计算、集群控制等高级特性使用需求的话会导致部分线程空转影响性能。

     调度中心不支持动态扩容,需停机重新发版。
    

    ​ 使用jpa考虑了使用各种数据库的兼容性,但很多地方如果改成对应库的sql查询能提高很大的性能(将foreach循环中的调度jpa查询库改成单个sql查询结果)。

xxl-job:

  • 优点:

    非常轻量级,相较于powerJob和ElasticJob轻量、简单、易上手。

    社区活跃,github上关注最多,测试覆盖面全,问题方便排查。

  • 缺点:

    基于数据库锁实现分布式锁避免重复调度(select for update), 避免了重复调度问题但加锁减少了并发能力。

    不支持powerJob提供的高级特性,数据库支持种类单一强依赖mysql。

    调度中心不支持动态扩容。

ElasticJob:

  • 优点:

    服务发现与注册端zookeeper支持动态扩容。

    Apache ShardingSphere 的子项目,开发维护人员较多,使用广泛。

  • 缺点:

    相较于xxl-job和powerJob添加了zookeeper的依赖。

    不支持powerJob提供的map/Reduce分布式计算、DAG工作流等高级特性。

    Elastic-Job的弹性分布式功能强依赖zookeeper,zookeeper容易成为性能瓶颈。

    任务划分的分片数可能小于执行任务的实例数,导致一些机器空转。

使用须知

部署顺序

Power-job作者基于快速失败考虑,各个worker调度端(应用端)系统必须成功连接到server端(power-job调度中心应用)才能启动,所以在补丁维护,系统重启等情况下需要先启动应用powerjob-server

端口开放控制

最省事的方法:所有端口(7700 + 10086 + 10010)全打开。如果你想精细化控制端口,那么请遵循以下原则自行设置:

  1. 对于任何用户,7700 为调度服务器(powerjob-server)的 Web 服务端口,必须打开
  2. oms.协议.port 的端口按需打开,考虑 server-server 和 server-worker 通讯的场景:

l 比如 server-server 默认通过 HTTP 协议交互(参数 oms.transporter.main.protocol控制),那必须打开 HTTP 10010 端口

l 同时 server-worker 部分通过 HTTP,部分通过 AKKA,则仍需要打开 AKKA 的 10086 端口

官方产品手册未提及的可能导致bug的特性

1.低于15秒的cron表达式执行间隔为15秒

powerJob

powerJob

powerJob

2.固定延迟执行时间与预期不符,不建议使用

示例:

控制台配置固定延迟为8秒,延迟时间并发期望的8秒,且会立即执行一次

powerJob

powerJob

powerJob

powerJob

powerJob

3. 固定频率源码限制死了不能低于50毫秒间隔频率但是返回异常要求频率应高于1000毫秒

powerJob

代码配置(开发)

yaml & properties 配置注意(开发)

使用部署调度端之前请删除&添加以下配置:

l 添加配置(非必须):

下面配置用以提升批量插入情况下性能

1
2
3
spring.jpa.properties.hibernate.jdbc.batch_size=1000
spring.jpa.properties.hibernate.validator.apply_to_ddl=false
spring.jpa.properties.hibernate.validate=false

l 删除配置(必须)

下面配置涉及钉钉登陆和报警请删除

1
2
3
4
5
####### DingTalk properties(Non-core configuration properties) #######
####### Delete the following code to disable the DingTalk #######
oms.alarm.ding.app-key=dingauqwkvxxnqskknfv
oms.alarm.ding.app-secret=XWrEPdAZMPgJeFtHuL0LH73LRj-74umF2_0BFcoXMfvnX0pCQvt0rpb1JOJU_HLl
oms.alarm.ding.agent-id=847044348

低版本spring boot 配置类

springboot低于2.7.4的版本,的项目无法注册到server调度端,启动报错,需手写配置类。

相关issue地址: https://github.com/PowerJob/PowerJob/issues/622

powerJob

参考配置类

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import shade.powerjob.com.google.common.collect.Lists;
import tech.powerjob.worker.PowerJobSpringWorker;
import tech.powerjob.worker.common.PowerJobWorkerConfig;
import tech.powerjob.worker.common.constants.StoreStrategy;

/**
* @description powerJob work调度端配置类
*/
@Configuration
public class PowerJobWorkerConfiguration {

@Bean
public PowerJobSpringWorker initPowerJobWorker() throws Exception {

// 1. 创建配置文件
PowerJobWorkerConfig config = new PowerJobWorkerConfig();
config.setPort(28888);
config.setAppName("fpa-job");
config.setServerAddress(Lists.newArrayList("127.0.0.1:7700", "127.0.0.1:7701"));
// 如果没有大型 Map/MapReduce 的需求,建议使用内存来加速计算
config.setStoreStrategy(StoreStrategy.DISK);

// 2. 创建 Worker 对象,设置配置文件(注意 Spring 用户需要使用 PowerJobSpringWorker,而不是 PowerJobWorker)
PowerJobSpringWorker worker = new PowerJobSpringWorker(config);
return worker;
}
}

版本选择

本调研报告主要基于5.1.0版本编写,该版本于2024/08/11合并发布到master分支,不建议使用5.x之前版本,4.x版本密码明文存储没有全局管理账号概念,每一个应用集群对应一个账号不便管理。更早版本缺少维护。

Maven版本仓库地址:

https://mvnrepository.com/artifact/tech.powerjob/powerjob-worker-spring-boot-starter?__cf_chl_tk=0uYoMzESN4GWZVrN6Ap50wmYNutjXulbLydFpUjqzIo-1723526522-0.0.1.1-13033


This is copyright.

...

...

00:00
00:00