分布式任务调度框架XXL-JOB

1、概述
XXL-JOB是一个分布式任务调度平台,其核心设计目标是开发迅速、学习简单、轻量级、易扩展。现已开放源代码并接入多家公司线上产品线,开箱即用。

官方文档:https://www.xuxueli.com/xxl-job/#%E4%BA%8C%E3%80%81%E5%BF%AB%E9%80%9F%E5%85%A5%E9%97%A8

官网地址:https://www.xuxueli.com/xxl-job/
GitHub地址:https://github.com/xuxueli/xxl-job/
xxl-job的设计思想

将调度行为抽象形成“调度中心”公共平台,而平台自身并不承担业务逻辑,“调度中心”负责发起调度请求。
将任务抽象成分散的JobHandler,交由“执行器”统一管理
“执行器”负责接收调度请求并执行对应的JobHandler中业务逻辑。
因此,“调度”和“任务”两部分可以相互解耦,提高系统整体稳定性和扩展性

在这里插入图片描述

架构图(图片来源是xxl-job官网)

调度中心
负责管理调度的信息,按照调度的配置来发出调度请求
支持可视化、简单的动态管理调度信息,包括新建、删除、更新等,这些操作都会实时生效,同时也支持监控调度结果以及执行日志。
执行器
负责接收请求并且执行任务的逻辑。任务模块专注于任务的执行操作等等,使得开发和维护更加的简单与高效
XXL-Job具有哪些特性
调度中心HA(中心式):调度采用了中心式进行设计,“调度中心”支持集群部署,可保证调度中心HA
执行器HA(分布式):任务分布式的执行,任务执行器支持集群部署,可保证任务执行HA
触发策略:有Cron触发、固定间隔触发、固定延时触发、API事件触发、人工触发、父子任务触发
路由策略:执行器在集群部署的时候提供了丰富的路由策略,如:第一个、最后一个、轮询、随机、一致性HASH、最不经常使用LFU、最久未使用LRU、故障转移等等
故障转移:如果执行器集群的一台机器发生故障,会自动切换到一台正常的执行器发送任务调度
Rolling实时日志的监控:支持rolling方式查看输入的完整执行日志
脚本任务:支持GLUE模式开发和运行脚本任务,包括Shell、python、node.js、php等等类型脚本
2、搭建调度中心
1、下载源码
下载源码导入idea,源码地址:https://gitee.com/xuxueli0323/xxl-job.git

doc:xxl-job的文档资料,包括了数据库的脚本(后面要用到)
xxl-job-core:公共jar包依赖
xxl-job-admin:调度中心,项目源码,是Springboot项目,可以直接启动
xxl-job-executor-samples:执行器,是Sample实例项目,里面的Springboot工程可以直接启动,也可以在该项目的基础上进行开发,也可以将现有的项目改造成为执行器项目
2、数据库
数据库文件在源码doc/db目录下

xxl_job的数据库里有如下几个表
xxl_job_group:执行器信息表,用于维护任务执行器的信息
xxl_job_info:调度扩展信息表,主要是用于保存xxl-job的调度任务的扩展信息,比如说像任务分组、任务名、机器的地址等等
xxl_job_lock:任务调度锁表
xxl_job_log:日志表,主要是用在保存xxl-job任务调度历史信息,像调度结果、执行结果、调度入参等等
xxl_job_log_report:日志报表,会存储xxl-job任务调度的日志报表,会在调度中心里的报表功能里使用到
xxl_job_logglue:任务的GLUE日志,用于保存GLUE日志的更新历史变化,支持GLUE版本的回溯功能
xxl_job_registry:执行器的注册表,用在维护在线的执行器与调度中心的地址信息
xxl_job_user:系统的用户表
3、调度中心配置:
调度中心配置文件地址:

/xxl-job/xxl-job-admin/src/main/resources/application.properties

配置数据库连接

## xxl-job, datasource
spring.datasource.url=jdbc:mysql://127.0.0.1:3306/xxl_job?useUnicode=true&characterEncoding=UTF-8&autoReconnect=true&serverTimezone=Asia/Shanghai
spring.datasource.username=root
spring.datasource.password=xdclass.net
spring.datasource.driver-class-name=com.mysql.cj.jdbc.Driver

配置 xxl.job.accessToken(后续要配置客户端接入配置token)

xxl.job.accessToken=javaxiaobear.cn

4、启动项目
调度中心访问地址:http://localhost:8080/xxl-job-admin (该地址执行器将会使用到,作为回调地址)

默认登录账号 “admin/123456”, 登录后运行界面如下图所示。
在这里插入图片描述

5、UI界面介绍
1、运行报表:以图形化来展示了整体的任务执行情况
任务数量:能够看到调度中心运行的任务数量
调度次数:调度中心所触发的调度次数
执行器数量:在整个调度中心中,在线的执行器数量有多少
2、任务管理(配置执行任务)

在这里插入图片描述
示例执行器:所用到的执行器
任务描述:概述该任务是做什么的
路由策略:
第一个:选择第一个机器
最后一个:选择最后一个机器
轮询:依次选择执行
随机:随机选择在线的机器
一致性HASH:每个任务按照Hash算法固定选择某一台机器,并且所有的任务均匀散列在不同的机器上
最不经常使用:使用频率最低的机器优先被使用
最近最久未使用:最久未使用的机器优先被选举
故障转移:按照顺序依次进行心跳检测,第一个心跳检测成功的机器选定为目标的执行器并且会发起任务调度
忙碌转移:按照顺序来依次进行空闲检测,第一个空闲检测成功的机器会被选定为目标群机器,并且会发起任务调度
分片广播:广播触发对于集群中的所有机器执行任务,同时会系统会自动传递分片的参数
Cron:执行规则
调度过期策略:调度中心错过调度时间的补偿处理策略,包括:忽略、立即补偿触发一次等
JobHandler:定义执行器的名字
阻塞处理策略:
单机串行:新的调度任务在进入到执行器之后,该调度任务进入FIFO队列,并以串行的方式去进行
丢弃后续调度:新的调度任务在进入到执行器之后,如果存在相同的且正在运行的调度任务,本次的调度任务请求就会被丢弃掉,并且标记为失败
覆盖之前的调度:新的调度任务在进入到执行器之后,如果存在相同的且正在运行的调度任务,就会终止掉当前正在运行的调度任务,并且清空队列,运行新的调度任务。
子任务ID:输入子任务的任务id,可填写多个
任务超时时间:添加任务超时的时候,单位s,设置时间大于0的时候就会生效
失败重试次数:设置失败重试的次数,设置时间大于0的时候就会生效
负责人:填写该任务调度的负责人
报警邮件:出现报警,则发送邮件
3、调度日志
这里是查看调度的日志,根据日志来查看任务具体的执行情况是怎样的
4、执行器管理
这里是配置执行器,等待执行器启动的时候都会被调度中心监听加入到地址列表
5、用户管理
可以对用户的一些操作

3、整合xxl_job
1、项目搭建
1、引入xxl_job依赖

<!-- http://repo1.maven.org/maven2/com/xuxueli/xxl-job-core/ -->
<dependency><groupId>com.xuxueli</groupId><artifactId>xxl-job-core</artifactId><version>2.3.1</version>
</dependency>

2、配置yaml

xxl:job:admin:addresses: http://127.0.0.1:8080/xxl-job-admin# 执行器的名字executor:appname: javaxiaobear-xxl-job-testaccessToken: default_token
server:port: 8081

3、编写配置类

@Configuration
@Slf4j
public class XxlJobConfig {@Value("${xxl.job.admin.addresses}")private String adminAddresses;@Value("${xxl.job.executor.appname}")private String appName;@Value("${xxl.job.accessToken}")private String accessToken;//旧版的有bug//@Bean(initMethod = "start", destroyMethod = "destroy")@Beanpublic XxlJobSpringExecutor xxlJobExecutor() {log.info(">>>>>>>>>>> xxl-job config init.");XxlJobSpringExecutor xxlJobSpringExecutor = new XxlJobSpringExecutor();xxlJobSpringExecutor.setAdminAddresses(adminAddresses);xxlJobSpringExecutor.setAppname(appName);
//        xxlJobSpringExecutor.setIp(ip);
//        xxlJobSpringExecutor.setPort(port);xxlJobSpringExecutor.setAccessToken(accessToken);
//        xxlJobSpringExecutor.setLogPath(logPath);
//        xxlJobSpringExecutor.setLogRetentionDays(logRetentionDays);return xxlJobSpringExecutor;}
}

2、第一个XXL-Job分布式调度任务
1、界面新增一个任务
在这里插入图片描述
2、新增一个执行器
这里是因为在配置文件里面用的是自定义的执行器,所以我们需要新增,当然,你可以用默认的执行器
在这里插入图片描述
3、代码配置handler

@Slf4j
@Component
public class MyXxlJobHandler {@XxlJob("myXxlJobHandler")public ReturnT<String> execute(String param){log.info("小熊学Java 任务方法触发成功");return ReturnT.SUCCESS;}
}

4、重新启动项目
在这里插入图片描述
4、路由策略
第一个:选择第一个机器
最后一个:选择最后一个机器
轮询:依次选择执行,流量均摊(推荐)
随机:随机选择在线的机器
一致性HASH:每个任务按照Hash算法固定选择某一台机器,并且所有的任务均匀散列在不同的机器上
最不经常使用:使用频率最低的机器优先被使用
最近最久未使用:最久未使用的机器优先被选举
故障转移:按照顺序依次进行心跳检测,第一个心跳检测成功的机器选定为目标的执行器并且会发起任务调度
忙碌转移:按照顺序来依次进行空闲检测,第一个空闲检测成功的机器会被选定为目标群机器,并且会发起任务调度
分片广播:广播触发对于集群中的所有机器执行任务,同时会系统会自动传递分片的参数
5、分片广播
1、场景
需求

有一个任务需要处理100W条数据,每条数据的业务逻辑处理要0.1s
对于普通任务来说,只有一个线程来处理 可能需要10万秒才能处理完,业务则严重受影响
案例:双十一大促,给1000万用户发营销短信
什么是分片任务

执行器集群部署,如果任务的路由策略选择【分片广播】,一次任务调度将会【广播触发】对应集群中所有执行器执行一次任务,同时系统自动传递分片参数,执行器可根据分片参数开发分片任务
需要处理的海量数据,以执行器为划分,每个执行器分配一定的任务数,并行执行
XXL-Job支持动态扩容执行器集群,从而动态增加分片数量,到达更快处理任务
分片的值是调度中心分配的

// 当前分片数,从0开始,即执行器的序号
int shardIndex = XxlJobHelper.getShardIndex();
//总分片数,执行器集群总机器数量
int shardTotal = XxlJobHelper.getShardTotal();

在这里插入图片描述
解决思路

分片广播
也可以启动多个job,使用同个jobHandler,通过命令行参数控制
如果将100W数据均匀分给集群里的10台机器同时处理,

每台机器耗时,1万秒即可,耗时会大大缩短,也能充分利用集群资源

在xxl-job里,可以配置执行器集群有10个机器,那么分片总数是10,分片序号0~9 分别对应那10台机器。

分片方式

id % 分片总数 余数是0 的,在第1个执行器上执行
id % 分片总数 余数是1 的,在第2个执行器上执行
id % 分片总数 余数是2 的,在第3个执行器上执行

id % 分片总数 余数是9 的,在第10个执行器上执行
2、代码编写

/*** 100个用户,分片处理*/@XxlJob("myShardingJobHandler")public void shardingJobHandler(){// 当前分片数,从0开始,即执行器的序号int shardIndex = XxlJobHelper.getShardIndex();//总分片数,执行器集群总机器数量int shardTotal = XxlJobHelper.getShardTotal();XxlJobHelper.log("分片参数:当前分片序号 = {}, 总分片数 = {}", shardIndex, shardTotal);List<Integer> allUserIds = getAllUserIds();allUserIds.forEach(obj -> {if (obj % shardTotal == shardIndex) {log.info("第 {} 片, 命中分片开始处理用户id={}",shardIndex,obj);}});}private List<Integer> getAllUserIds() {List<Integer> ids = new ArrayList<>();for (int i = 0; i < 100; i++) {ids.add(i);}return ids;}

3、测试
新建一个分片任务
在这里插入图片描述
新建一个服务器实例,直接copy一份
在这里插入图片描述
启动系统,点击运行一次
在这里插入图片描述
6、阻塞策略
单机串行:新的调度任务在进入到执行器之后,该调度任务进入FIFO队列,并以串行的方式去进行
丢弃后续调度:新的调度任务在进入到执行器之后,如果存在相同的且正在运行的调度任务,本次的调度任务请求就会被丢弃掉,并且标记为失败
覆盖之前的调度:新的调度任务在进入到执行器之后,如果存在相同的且正在运行的调度任务,就会终止掉当前正在运行的调度任务,并且清空队列,运行新的调度任务。

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

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

ENSP DHCP 配置不同网段

配置不同网段。 配置&#xff1a;192.168.80.254 192.168.10.254 192.168.20.254 给绑定信息选择网卡&#xff0c;出端口编号改为2&#xff0c;勾选双向通道&#xff0c;点击增加。 接下来把vmnet 1和vmnet 2 都按上图所示。 打开路由器&#xff0c;就开始配置。

文本自动粘贴编辑器:支持自动粘贴并筛选手机号码,让信息处理更轻松

在信息时代的浪潮中&#xff0c;文本处理已成为我们日常工作与生活的重要组成部分。无论是商务沟通、社交互动还是个人事务处理&#xff0c;手机号码的筛选与粘贴都显得尤为关键。然而&#xff0c;传统的文本处理方式效率低下、易出错&#xff0c;已无法满足现代人的高效需求。…

MegaSeg Pro for Mac v6.3.1 注册激活版 音视频DJ混音工具

MegaSeg Pro for Mac是一款专业的DJ和广播自动化软件&#xff0c;旨在为音乐专业人士提供强大的音乐播放和演播功能。这款软件具有多种功能&#xff0c;包括强大的音乐库管理&#xff0c;支持导入和组织大量音乐文件&#xff0c;可以轻松管理你的音乐收藏。它支持广泛的音频格式…

将excel数据拆分成多个excel文件

一、背景&#xff1a; 平时在日常工作中&#xff0c;经常需要将excel的文件数据进行拆分&#xff0c;拆分成多个excel文件&#xff0c;然而用人工来处理这个既耗时&#xff0c;又费精力&#xff0c;眼睛会疲劳&#xff0c;时间长了操作上会出现失误&#xff0c;导致数据拆分错…

【嵌入式硬件】光耦

1.光耦作用 光耦一般用于信号的隔离。当两个电路的电源参考点不相关时,使用光耦可以保证在两边不共地的情况下,完成信号的传输。 2.光耦原理 光耦的原理图如下所示,其内部可以看做一个特殊的“三极管”; 一般的三极管是通过基极B和发射极E间的电流,去控制集电极C和发射极…

OpenHarmony实战:Combo解决方案之ASR芯片移植案例

本方案基于 OpenHarmony LiteOS-M 内核&#xff0c;使用 ASR582X 芯片的 DEV.WIFI.A 开发板进行开发移植。作为典型的 IOT Combo&#xff08;Wi-FiBLE&#xff09;解决方案&#xff0c;本文章介绍 ASR582X 的适配过程。 编译移植 目录规划 本方案的目录结构使用 Board 和 So…

Mac上怎么合并多张图片?

Mac上怎么合并多张图片&#xff1f;上班过的小伙伴都应该知道&#xff0c;合并拼接图片是一件非常重要且经常需要使用到的图片处理技术&#xff0c;将多张图片合并拼成一张之后能够展现出更多的图片内容。在Mac电脑上&#xff0c;合并多张图片是一项常见的任务&#xff0c;无论…

大话设计模式之抽象工厂模式

抽象工厂模式&#xff08;Abstract Factory Pattern&#xff09;是一种创建型设计模式&#xff0c;它提供了一种方式来创建一系列相关或依赖对象的家族&#xff0c;而无需指定其具体类。该模式通过提供一个抽象工厂接口&#xff0c;定义了一组可以创建不同类型对象的方法&#…

JavaScript_与html结合方式

JavaScript_语法 ECMAScript&#xff1a;客户端脚本语言的标准 1.基本语法 1.1 与html结合方式&#xff08;2种&#xff09; 1. 内部JS 定义<script>,标签体内容就是js代码 2. 外部JS 定义<script>,通过src属性引入外部的 js文件 注意&#xff1a; 1.<script>…

【opencv】教程代码 —videoio(2)将两个视频的每一帧逐一读取并计算其PSNR 和MSSIM...

本教程开始介绍的源代码将对每一帧执行PSNR测量&#xff0c;并且只对PSNR低于输入值的帧进行SSIM测量。为了可视化的目的&#xff0c;我们在OpenCV窗口中展示两幅图像&#xff0c;并将PSNR和MSSIM值打印到控制台。期望看到如下内容&#xff1a; video-input-psnr-ssim.cpp 将两…

【“状态机” 解析UART不定长度的协议帧】

【“状态机” 解析UART不定长度的协议帧】 1. 数据帧格式2. 状态机原理3. 代码实现 通信设计中考虑协议的灵活性&#xff0c;经常把协议设计成“不定长度”。如果一个系统接收上述“不定长度”的协议帧&#xff0c;将会有一个挑战–如何高效接收与解析。一个实例如下图&#xf…

Linux (Ubuntu)- mysql8 部署

1.基本部署 01》》先查看OS类型&#xff0c;如果是Ubuntu在往下边看 rootspray:/etc/mysql/mysql.conf.d# lsb_release -a LSB Version: core-11.1.0ubuntu2-noarch:security-11.1.0ubuntu2-noarch Distributor ID: Ubuntu Description: Ubuntu 20.04.6 LTS Release: …

Spring AOP + 自定义注解 实现公共字段的填充

Spring AOP 自定义注解 实现公共字段的填充 代码冗,不利于后期维护. 定义操作这些字段的方法类型 实现步骤&#xff1a; 自定义注解AutoFill,用于表示操作这些公共字段的方法自定义切面类AutoFillAspect,统一拦截&#xff0c;通过反射获取方法入参&#xff0c;并填充公共字段…

springboot之MybatisPlus

文章目录 一、ORM二、mybatis实际操作三、mybatis-plus 一、ORM 简单来说ORM就是一个能够帮我们把java中Bean类映射到数据库中。 使用mybatis-plus。 配置架包 <!-- MyBatisPlus依赖 --><dependency><groupId>com.baomidou</groupId><art…

多态--下

文章目录 概念多态如何实现的指向谁调谁&#xff1f;例子分析 含有虚函数类的大小是多少&#xff1f;虚函数地址虚表地址多继承的子类的大小怎么计算&#xff1f;练习题虚函数和虚继承 概念 优先使用组合、而不是继承; 继承会破坏父类的封装、因为子类也可以调用到父类的函数;…

MyBatis-Plus04(条件构造器)

条件构造器和常用接口 wrapper介绍 Wrapper &#xff1a; 条件构造抽象类&#xff0c;最顶端父类 AbstractWrapper &#xff1a; 用于查询条件封装&#xff0c;生成 sql 的 where 条件 QueryWrapper &#xff1a; 查询条件封装 UpdateWrapper &#xff1a; Update 条件封装 A…

源支付V7开源版2.99,修复各种提示错误

源支付V7开源版2.99&#xff0c;修复各种提示错误 加密说明&#xff1a;200拿来的&#xff0c;只有8.1这个文件加密&#xff0c;其他文件无任何加密&#xff0c;已修复各种提示错误 测试其他开源版安装提示错误&#xff0c;有几个文件是加密的 注&#xff1a;开发不易&#…

【更新】上市公司-ZF环保补贴、补助数据(2008-2022年)

01、数据简介 环保补贴&#xff0c;又称绿色补贴&#xff0c;是ZF在环保领域实施的一种特定补贴。它主要针对那些在经济主体意识上存在偏差或由于资金私有制而无法有效进行环保投资的企业。环保补贴的目的是解决环保问题&#xff0c;帮助企业改进环保设备和工艺&#xff0c;以…

职场新军—网络安全,这个行业的实际情况你知道吗?

作为IT行业的香饽饽&#xff0c;网络安全工程师可谓是金字塔尖上的摇钱树。这专业近几年的薪资一直狂飙&#xff0c;简直就是职业版的“月薪过万”&#xff01;但别急着入坑&#xff0c;毕竟不是每个学了网络安全的都能在金钱雨中舞蹈&#xff0c;有时候还得小心不被淘汰。 听…

基本电路理论入门讲解系列-电路和电路模型

&#x1f308;个人主页&#xff1a;会编程的果子君 &#x1f4ab;个人格言:“成为自己未来的主人~” 电路 电路概念&#xff1a;把若干个电气设备和电气元件按照一定的方式组合起来&#xff0c;构成电流的通路&#xff0c;此路径的总体称为电路。在电子通信&#xff0c;自…