【powerjob】定时任务调度器 xxl-job和powerjob对比

文章目录

  • 同类产品对比
  • 资源及部署相关
    • 资源占用对比:
    • 部署方式:
      • xxl job :
        • 调度器:
        • 执行器:
      • powerjob:
        • 调度器:
        • 执行器:
  • 总结

背景:
目前系统的定时任务主要通过Spring框架自带的@Scheduled注解实现 ,这种方式代码简单, 能快速实现基本的定时任务需求。但随着系统规模的扩大和定时任务数量的增加, 原有实现方式暴露出以下问题:

  1. 在多实例情况下,同一定时任务会在多台服务器上都执行,导致资源浪费,且多任务间没有协调和管理。
  2. 缺乏任务调度中心,监控和管控功能较弱, 定时任务的触发时点改变,需要重新发布才能修改这些条件。

博主最近上手的项目 后续需要用到定时任务调度器 迁移定时任务, 刚好想到之前用过、听过的两款主流调度器 特此做一个调研记录。

同类产品对比

在这里插入图片描述

[1] 注: 通过for update锁表
在这里插入图片描述

[2] 注:其实可以自己实现 com.xxl.job.admin.core.alarm.JobAlarm 接口推至钉钉等。

QuartZ由于不支持分布式任务,不参与讨论。
重点针对xxl job 与 powerjob 进行对比。

下面给出更多直观的对比:

  1. PowerJob支持更多的定时信息配置 ,xxl job仅支持cron
    在这里插入图片描述
    在这里插入图片描述

  2. PowerJob支持设置任务的生命周期,xxl job不支持
    在这里插入图片描述

  3. PowerJob可以更好的查看执行器的机器信息 (注:内存为jvm内存),xxl job不支持

在这里插入图片描述

  1. github项目最后维护时间对比:(截至目前,2023.12.01)
    在这里插入图片描述
    在这里插入图片描述

  2. 工作流支持: xxl job支持父子任务执行; powerjob可以支持多级,甚至可以针对条件判断选择执行
    在这里插入图片描述

资源及部署相关

资源占用对比:

  1. cpu使用对比: xxl job(左) powerjob(右),powerjob整体占用较多,但CPU占用率并不高 可以忽略不计。
    在这里插入图片描述

  2. JVM 堆内存对比: xxl job(左) powerjob(右) , 因为powerjob有更多的功能 相应的资源消耗也会更多,xxl job峰值约为250M ,powerjob峰值约为700M, 且powerjob内存占用长期大于xxl job
    在这里插入图片描述

部署方式:

xxl job :

调度器:
  1. 手动执行xxl job的SQL脚本创建库表, SQL语句默认数据库名是xxl_job,用户可自己选择xxl job库表是否要和业务表放在同一个库,脚本会在xxl_job_user表中默认插入admin账号 密码为123456 ,如果后续需要修改密码,可以手动在数据库里面修改password ,数据库表的密码是MD5加密后的结果(32位小写)
    在这里插入图片描述

  2. 在xxl-job-admin application.properties修改数据源相关配置,定义accessToken (执行器的accessToken与之对应)

    xxl.job.accessToken=default_token
    
  3. 启动xxl-job-admin项目, java -jar xxl-admin-job.jar

执行器:

(执行器通俗点说 即我们的Java项目)

  1. 引入xxl-job-core依赖
<!-- xxl-job-core -->
<dependency>
    <groupId>com.xuxueli</groupId>
    <artifactId>xxl-job-core</artifactId>
    <version>2.4.0</version>
</dependency>
  1. yml配置:addresses为调度器地址,accessToken与上文调度器中的accessToken保持一致,更多解释见注释。
# 执行器将会使用该地址进行"执行器心跳注册"和"任务结果回调";为空则关闭自动注册;
xxl:
  job:
    admin:
      addresses: http://192.168.31.165:8080/xxl-job-admin
    executor:
      # 执行器AppName [选填]:执行器心跳注册分组依据;为空则关闭自动注册
      appname: xxl-job-demo
      # 执行器IP [选填]:默认为空表示自动获取IP,多网卡时可手动设置指定IP,该IP不会绑定Host仅作为通讯实用;地址信息用于 "执行器注册" 和 "调度中心请求并触发任务";
      ip:
      #执行器端口号 [选填]:小于等于0则自动获取;默认端口为9999,单机部署多个执行器时,注意要配置不同执行器端口;
      port: 9999
      # 执行器运行日志文件存储磁盘路径 [选填] :需要对该路径拥有读写权限;为空则使用默认路径;
      logpath: E:/log/xxl-jobs/xxl-job/jobhandler
      # 执行器日志保存天数 [选填] :值大于3时生效,启用执行器Log文件定期清理功能,否则不生效;
      logretentiondays: -1
    # 执行器通讯TOKEN [选填]:非空时启用;
    accessToken: default_token
  1. 执行器代码示例
@Component
public class WorkingStartHandler   {

    /**
     * 需要先执行db里面的sql脚本 创建库表
     */

    /**
     * 新版本注解由原来旧版本的@JobHandler类注解 变成了  @XxlJob 注解
     *  且类不需要继承IJobHandler类
     */
    @XxlJob("WorkingStartHandler")
    public ReturnT<String> execute(String s) throws Exception {
        // do something
        return ReturnT.SUCCESS;
    }
}
  1. 启动执行器
  2. 在调度器admin页面添加定时任务并执行
  3. 执行器可多实例部署,在调度器admin页面的路由策略 推荐使用轮询方式,一致性hash算法在笔者物理机Win11+虚拟机centos stream 8环境中测试发现及其不均衡 ,几乎始终只落在某一台执行器上。
    在这里插入图片描述

powerjob:

调度器:
  1. 修改powerjob-server-starter中的application配置文件的数据源配置等, jdbc URL中指定数据库
    (如果是新的数据库 即与业务库分离,需要手动创建数据库), 相关表自动创建,无需手动。
    需要手动在app_info表中,新增一条记录 填写app_name和passwordappname与执行器配置的相对应

调度服务器(powerjob-server)为了支持环境隔离,分别采用了日常(application-daily.properties)、预发(application-pre.properties)和线上(application-product.properties)三套配置文件,请根据实际需求进行修改,以下为配置文件详解。

在这里插入图片描述
2. 启动powerjob-server: java -jar xxx.jar --spring.profiles.active=product

执行器:
  1. 引入powerjob starter依赖
<!-- powerjob-worker -->
<dependency>
    <groupId>tech.powerjob</groupId>
    <artifactId>powerjob-worker-spring-boot-starter</artifactId>
    <version>4.3.4</version>
</dependency>
  1. application配置文件,注意powerjob.worker.server-address,是我们调度器地址,powerjob.worker.app-name与我们调度器中提到的app_info表app_name内容相对应
# Whether to enable PowerJob Worker, default is true
powerjob.worker.enabled=true
# Turn on test mode and do not force the server connection to be verified
powerjob.worker.enable-test-mode=false
# Transport port, default is 27777
powerjob.worker.port=27778
# Application name, used for grouping applications. Recommend to set the same value as project name.
powerjob.worker.app-name=test
# Address of PowerJob-server node(s). Ip:port or domain. Multiple addresses should be separated with comma.
#powerjob.worker.server-address=127.0.0.1:7700,127.0.0.1:7701
powerjob.worker.server-address=127.0.0.1:7700
# transport protocol between server and worker
powerjob.worker.protocol=http
# Store strategy of H2 database. disk or memory. Default value is disk.
powerjob.worker.store-strategy=disk
# Max length of result. Results that are longer than the value will be truncated.
powerjob.worker.max-result-length=4096
# Max length of appended workflow context . Appended workflow context value that is longer than the value will be ignore.
powerjob.worker.max-appended-wf-context-length=4096
  1. 执行器代码示例:其中注释的代码是模拟工作流场景下的代码,如果不需要使用工作流则忽略。
@Component("WorkingStartProcessors")
public class WorkingStartProcessors implements BasicProcessor {

    @Autowired
    private WorkingStartJob workingStartJob;

    /**
     * 第一步:需要先create database powerjob
     * 第二步:在app_info表中配置 app name ,与worker (即java服务) 的appname对应, 并设置账号密码(server控制台登录密码)
     * 第三步:与xxl job类似,在控制台页面新建任务, 其中全限定类名,也可以填写bean value
     * (如本类 被@Component("WorkingStartProcessors")修饰, bean value即为WorkingStartProcessors)
     */

    /**
     * tips: cron 模式下 最小间隔为15s
     * 否则需要修改 powerjob server源码SCHEDULE_RATE数值(不建议)
     */
    @Override
    public ProcessResult process(TaskContext taskContext) throws Exception {

         // do something

//
//        WorkflowContext workflowContext = taskContext.getWorkflowContext();
//        // 模拟工作流的判断
//        if (System.currentTimeMillis() % 2 == 0) {
//
//            // 工作流注意事项:
//            // 如果有判断节点 需要在代码中声明返回结果 在控制台的流程图中 用var res = context['result']   res == "true"进行判断
//            // 流程图的每一个节点都记得要开启
//            workflowContext.appendData2WfContext("result",false);
//            System.out.println("-------------false-------------");
//        } else {
//            workflowContext.appendData2WfContext("result",true);
//            System.out.println("-------------true-------------");
//
//        }
        return new ProcessResult(true);


    }
}
  1. 启动执行器
  2. 控制台界面:
    tips: 小于15s时,会按照15s间隔执行,这是powerjob-server源码中限制的
    在这里插入图片描述
    在这里插入图片描述
    工作流示例 (用不上请忽略):
    下图三个节点 都记得点击启用
    在这里插入图片描述
    判断节点语法:
    (key value是和上文java示例代码中定义的 : workflowContext.appendData2WfContext(“result”,true)😉
    在这里插入图片描述

总结

powerJob有后发优势 调度任务配置更加灵活, 截至目前仍在维护,功能更全面,但相应的内存占用约为xxl-job的2-3倍,

xxl job用户量会比powerJob庞大,内存占用较小

可以结合实际业务以及服务器资源空闲情况 考虑是否需要使用到灵活配置特性,如服务器资源紧张 在可预见范围内 仅需要基本的定时任务执行功能 推荐 xxl-job, 如服务器资源不紧张 为后续项目灵活性考虑 可选择powerjob。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/216619.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

buuctf [极客大挑战 2019]Havefun1

解题思路&#xff1a; 小习惯 本题先看看源码或者检查一下&#xff0c;可能这是俺的一个小习惯。 源码里面都看到了php的代码 php代码解析&#xff1a; $cat$_GET[cat]; echo $cat; if($catdog){ echo Syc{cat_cat_cat_cat}; } 1.$ca…

新手村之SQL——分组与子查询

1.GROUP BY GROUP BY 函数就是 SQL 中用来实现分组的函数&#xff0c;其用于结合聚合函数&#xff0c;能根据给定数据列的每个成员对查询结果进行分组统计&#xff0c;最终得到一个分组汇总表。 mysql> SELECT country, COUNT(country) AS teacher_count-> FROM teacher…

T-SQL的多表查询

前面讲述过的所有查询都是基于单个数据库表的查询。如果一个查询需要对多个表进行操作&#xff0c;就称为联接查询&#xff0c;联接查询的结果集或结果称为表之间的联接。 联接查询实际上是通过各个表之间共同列的关联性来查询数据的&#xff0c;它是关系数据库查询最主要的特征…

听GPT 讲Rust源代码--src/tools(7)

File: rust/src/tools/rust-analyzer/crates/ide/src/inlay_hints/chaining.rs 在Rust源代码中&#xff0c;rust-analyzer/crates/ide/src/inlay_hints/chaining.rs这个文件的作用是生成Rust代码中的链式调用提示。 具体来说&#xff0c;当我们使用链式调用时&#xff0c;例如A…

C语言——深入理解指针(5)

目录 1. sizeof和strlen的对比 1.1 sizeof 1.2 strlen 1.3 sizeof和strlen 的对比 2. 数据和指针题解析 2.1 一维数组 2.2 字符数组 2.2.1 2.2.2 2.2.3 2.2.4 2.2.5 2.2,6 2.3 二维数组 3. 指针运算题解析 3.1 例1 3.2 例2 3.3 例3 3.4 例4 3.5 例5 3.6 例…

python中的进制转换和原码,反码,补码

python中的进制转换和原码,反码,补码 计算机文件大小单位 b bit 位(比特) B Byte 字节 1Byte 8 bit #一个字节等于8位 可以简写成 1B 8b 1KB 1024B 1MB 1024KB 1GB 1024MB 1TB 1024GB 1PB 1024TB 1EB 1024PB 进制分类 二进制:由2个数字组成,有0 和 1 pyth…

如何无线桥接路由器,让你的网络覆盖范围变大,做到网络信号无缝连接

你是否希望通过在两个路由器之间创建无线网桥(网络桥接)来扩大网络覆盖范围?好吧,你来对地方了!在当今日益互联的世界,拥有一个强大可靠的网络比以往任何时候都更重要。 无线网桥允许你无线连接两个或多个路由器,有效地扩展网络覆盖范围,并在更大的区域提供无缝的互联…

巧借C++算法实现冒泡排序算法

目录 引言冒泡排序原理具体实现步骤示例代码时间复杂度和稳定性优化可能性结束语 引言 作为计算机专业出身的开发者&#xff0c;以及从事软件开发相关的小伙伴&#xff0c;想必对C语言并不陌生&#xff0c;它是一门非常厉害的编程语言&#xff0c;不仅是基于程序底层的语言&a…

Proteus8.16仿真软件安装图文教程(Proteus 8 Professional)

Proteus8.16 &#x1f527;软件安装包下载链接&#xff1a;&#x1f527;视频教程&#x1f527;1 安装软件解压&#x1f527;2 安装&#x1f527;3 破解&#x1f527;4 汉化 &#x1f527;软件安装包下载链接&#xff1a; Proteus8.16软件下载链接 1、本文关于Proteus8.16 SP…

关于“你对SpringCloud的理解”

看看普通人和高手是如何回答这个问题的&#xff1f; 普通人 Spring Cloud 是一套微服务解决方案 它包括配置中心、RPC 通信、服务注册、服务熔断等组件 高手 Spring Cloud 是一套 分布式微服务的技术解决方案 它提供了快速构建分布式系统的 常用的一些组件 比如说配置…

人工智能与供应链行业融合:开启智能化供应链的新时代

随着人工智能技术的快速发展&#xff0c;供应链行业正迎来革命性变革。本文将探索人工智能在供应链管理中的应用领域&#xff0c;并分析其带来的益处和挑战&#xff0c;展望人工智能与供应链融合的未来发展趋势。 引言 供应链管理是企业运营中不可或缺的重要组成部分。它涵盖了…

Typora免费版安装教程(仅供学习)

目录 一、Typora简介二、Typora安装三、Typora补丁四、Typora使用体验五、总结 一、Typora简介 Typora是一款非常流行的Markdown编辑器&#xff0c;它能够将Markdown文本转化为漂亮的排版&#xff0c;并且支持实时预览。Typora具有简单易用的界面&#xff0c;使得用户可以轻松地…

微机原理9

一、单项选择题(本大题共15小题,每小题3分、共45分。在每小题给出的四个备选项中,选出一个正确的答案,请将选定的答案填涂在答题纸的相应位置上。) 8088 系统的内存最大容量为 16MB. 其地址总线为&#xff08;&#xff09; A. 16 位 B. 20 位 C. 24 位 D. 32 位 2,以CPU为核心…

鸿宇多用户商城user.php RCE漏洞复现

0x01 产品简介 鸿宇多用户商城是一款支持各行业的多商家入驻型电商平台系统,商家版APP,微信商城,小程序及各种主流营销模块应有尽有,是一个功能强大的电子商务平台,旨在为企业和个人提供全面的在线购物解决方案。 0x02 漏洞概述 鸿宇多用户商城 user.php 存在任意命令执行漏洞…

无人机停机坪的主要功能有哪些

随着无人机行业领域的不断完善&#xff0c;无人机停机坪作为一项关键基础设施&#xff0c;正发挥着越来越重要的作用。无人机停机坪也叫无人机机巢、无人机机库、无人机机场。无人机停机坪不仅是无人机的“家”&#xff0c;更是其高效运行的关键环节。让我们一同探索无人机停机…

SQL Sever 基础知识 - 数据筛选(3)

SQL Sever 基础知识 - 四、数据筛选 第7节 BETWEEN7.1 BETWEEN 运算符概述7.2 BETWEEN 示例7.2.1 BETWEEN 与数字示例7.2.2 BETWEEN 和日期示例 第8节 LIKE8.1 LIKE运算符概述8.2 转义字符8.3 LIKE 示例8.3.1 % (百分号) 通配符示例8.3.2 _(下划线)通配符示例8.3.3 [字符列表] …

【Qt开发流程】之定时器事件与随机数示例

描述 QObject是所有Qt对象的基类&#xff0c;提供了Qt中基础的定时器支持。通过QObject::startTimer()函数&#xff0c;可以使用毫秒为单位的时间间隔来启动一个定时器。该函数返回一个唯一的整数定时器ID。该计时器现在将以规律的间隔触发&#xff0c;直到显式调用QObject::k…

安卓apk抓包(apk抓不到包怎么办)

起因 手机&#xff08;模拟器&#xff09;有时候抓不到apk的包&#xff0c;需要借助Postern设置一个代理&#xff0c;把模拟器的流量代理到物理机的burp上。 解决方案 使用Postern代理&#xff0c;把apk的流量代理到burp。 Postern是一个用于代理和网络流量路由的工具&#xf…

智能优化算法应用:基于黑猩猩算法无线传感器网络(WSN)覆盖优化 - 附代码

智能优化算法应用&#xff1a;基于黑猩猩算法无线传感器网络(WSN)覆盖优化 - 附代码 文章目录 智能优化算法应用&#xff1a;基于黑猩猩算法无线传感器网络(WSN)覆盖优化 - 附代码1.无线传感网络节点模型2.覆盖数学模型及分析3.黑猩猩算法4.实验参数设定5.算法结果6.参考文献7.…

根文件系统lib库添加与初步测试

一. 简介 我们在编译 busybox源码时&#xff0c;选择的是动态编译&#xff0c;所以&#xff0c;制作生成的 根文件系统中/bin或 /sbin目录下软件运行时会调用到一些库文件的。库文件就是交叉编译器的库文件。 前面我们编译 busybox源码时&#xff0c;选择动态编译&#xff0…