xxl-job原理(版本2.3.1)

news2024/12/23 15:27:04

一、xxl-job架构图

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-M46gacso-1673794844088)(sources\xxl-job2.1.0架构图.png)]

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-joy0armp-1673794844090)(sources\xxl-job2.3.0架构图1.png)]

1、调度中心

​ 负责管理调度信息,按照调度配置发出调度请求,自身不承担业务代码。调度系统与任务解耦,提高了系统可用性和稳定性,同时调度系统性能不再受限于任务模块。

2、执行器

负责接收调度请求并执行任务逻辑。任务模块专注于任务的执行等操作,开发和维护更加简单和高效;
接收“调度中心”的执行请求、终止请求和日志请求等。

二、执行器注册流程

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-ztIQWzhY-1673794844092)(sources\注册流程.png)]

1、调度中心注册(注册/删除)异步处理

线程池配置:2核心线程数,最大线程数10,任务队列2000,活跃时间30s,执行+日志的拒绝策略。

2、注册数据处理流程

三、调度中心触发任务

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-VEi5BikU-1673794844094)(sources\job触发接收流程图.png)]

1、任务触发快慢线程池设计

​ 快线程池配置:10核心线程数,最大线程数至少200,任务队列1000

​ 慢线程池配置:10核心线程数,最大线程数至少100,任务队列2000

2、job降级逻辑

​ job超时次数超过500ms为超时,一分钟内任务超时次数超过10次(不包含10),运行触发任务有快线程池fastTriggerPool降级为慢线程池slowTriggerPool

3、触发启动加排他锁

​ 为什么要控制? 因为触发中心是集群部署,每个实例都会执行触发任务。需要控制在某一时刻只有一个实例在触发任务。

4、时间轮

在这里插入图片描述

ringData, Map<秒数, List>

//存数
int ringSecond = (int)((jobInfo.getTriggerNextTime()/1000)%60);
 ringItemData.add(jobId);
//取数
int nowSecond = Calendar.getInstance().get(Calendar.SECOND);  
for (int i = 0; i < 2; i++) {
   List<Integer> tmpData = ringData.remove( (nowSecond+60-i)%60 );
         if (tmpData != null) {
                ringItemData.addAll(tmpData);
         }
}

job超时统计

long minTim_now = System.currentTimeMillis()/60000;
if (minTim != minTim_now) {
    minTim = minTim_now;
    jobTimeoutCountMap.clear();
}

5、触发job预读5s数据

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-duCJW759-1673794844095)(sources\预读5s数据.jpg)]

预读数量计算:(快线程大小 + 慢线程池大小) * 20 默认:(200 + 100)* 20 = 6000

预读时间:5秒。 运行中的Job

6、ringData读取逻辑

下一秒开始 TimeUnit.MILLISECONDS.sleep(1000 - System.currentTimeMillis() % 1000);

获取当前秒和过去1秒的任务。ringData删除掉已经触发的任务。

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-M67KyUBK-1673794844096)(sources\ringData.png)]

7、添加触发任务流程

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-HyTUYHKA-1673794844098)(sources\添加任务触发流程图.png)]

1、快慢线程池设计,降级处理,防止正常触发的任务被慢job阻塞。

2、ConcurrentMap存储超时次数,在多线程场景下的使用。

3、job超时统计数据保存时效逻辑

  long minTim_now = System.currentTimeMillis()/60000;
                    if (minTim != minTim_now) {
                        minTim = minTim_now;
                        jobTimeoutCountMap.clear();
                    }

8、调度中心触发job-路由策略

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-HnVk0X3N-1673794844103)(sources\调度中心触发job逻辑.png)]

四、任务执行

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-iJLnJp1g-1673794844106)(sources\job执行逻辑.png)]

五、任务回调

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-KrJGxKAu-1673794844107)(sources\job执行回调流程图.png)]

注册中心回调线程池callbackThreadPool:2核心线程数,最大线程数20,任务队列3000,活跃时间30s,执行+日志的拒绝策

job处理成功处理,主要是触发子任务,多个子任务配置用逗号分割,逐个触发子任务。

更新job日志信息,增加触发子任务的信息,日志截取避免超过text类型大小(64kb)。

失败job处理流程(monitorThread)

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-eh324wzU-1673794844108)(sources\失败job处理流程.png)]

六、设计的细节点。

1、国际化设计

​ 支持 zh_CN:中文简体, zh_TC:中文繁体, en:英文

​ 默认是zh_CN. 通过配置xxl.job.i18n可以设置。

​ 根据不同的语言选择,加载不同的国际化文件

​ message_zh_CN.properties,

​ message_zh_TC.properties,

​ message_en.properties

将系统内的语言修改成对应的语言。

2、job调用统计

按天统计,统计近3天的数据。1分钟更新log-report表

log日志清理逻辑。 job-log最少保存7天。一天清理一次log。

3、InheritableThreadLocal的使用

​ InheritableThreadLocal主要用于子线程创建时,需要自动继承父线程的ThreadLocal变量,方便必要信息的进一步传递。

​ 在维持Jobcontext的时候就使用了InheritableThreadLocal,方便子线程使用。

4、LinkedBlockingQueue take和poll的巧妙应用

take方法会一直阻塞,poll允许继续执行。在执行job时候就使用的poll,以便于统计空转的次数,超过30次,kill掉线程,以释放无用的线程占用内存空间。

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

CSS注入 2.0

看过CSS注入1.0的朋友&#xff0c;不相信对CSS注入有了一个概念性的理解&#xff0c;在上一篇文章中我只是简单复现了一下波兰老哥的CSS注入过程&#xff0c;阐述了其大致原理。对于其中很大一部分技术细节&#xff0c;代码细节并未做深入的理解(当时我也看不懂&#xff0c;哈哈…

什么是分布式事务

上一篇文章已经讲完分布式了&#xff0c;那暖男说要讲分布式事务那就一定会讲&#xff0c;只是我估计大家没料到暖男这么快就肝好了吧&#xff1f; 事务想必大家并不陌生&#xff0c;至于什么是 ACID&#xff0c;也是老生常谈了。不过暖男为了保证文章的完整性确保所有人都听得…

uniapp-微信小程序分包操作步骤详解

1、在原来的pages的同级下新建一个目录&#xff1a;package1 &#xff08;名字自己随便起。想分几个包就建几个新目录。比如package2、package3……&#xff09; 结构是并列的&#xff1a; 2、把想要放进分包里去的模块都剪切在新目录里面去。 &#xff08;就是以前全都放在…

移动端 - 搜索组件(suggest篇)

这一篇博客是和 search-input篇 衔接的, 需要的可以看上文 移动端 - 搜索组件(search-list篇) 这里我们需要去封装这么一个组件 先说一下大致的方向: 1. 根据父组件传入的关键字数据发送请求获取后端数据, 进行模板渲染 2. 处理一些边界情况(后端返回数据为空, 初次加载数据…

《小猫猫大课堂》三轮3——字符函数和字符串函数及其模拟实现

宝子&#xff0c;你不点个赞吗&#xff1f;不评个论吗&#xff1f;不收个藏吗&#xff1f; 最后的最后&#xff0c;关注我&#xff0c;关注我&#xff0c;关注我&#xff0c;你会看到更多有趣的博客哦&#xff01;&#xff01;&#xff01; 喵喵喵&#xff0c;你对我真的很重…

C语言——自定义类型详解(结构体,联合体,枚举,位段)

专栏&#xff1a;C语言 个人主页&#xff1a;HaiFan. 专栏简介&#xff1a;本专栏主要更新一些C语言的基础知识&#xff0c;也会实现一些小游戏和通讯录&#xff0c;学时管理系统之类的&#xff0c;有兴趣的朋友可以关注一下。 结构体前言一、结构体1.结构体类型的声明2.结构体…

黑马学ElasticSearch(十)

目录&#xff1a; &#xff08;1&#xff09;自动补全-安装品分词器 &#xff08;2&#xff09;自动补全-自定义分词器 &#xff08;3&#xff09;自动补全-DSL实现自动补全查询 &#xff08;4&#xff09; 自动补全-修改酒店索引库结构 &#xff08;5&#xff09;自动补全…

测试开发——用例篇(如何设计一个测试用例,设计测试用例的一些具体方法)

目录 一、测试用例的基本要素 二、设计测试用例的万能公式 (在没有需求文档的情况下&#xff09; 1、水杯的测试用例 2、一个网站的登录测试用例 三、基于需求进行测试用例的设计 四、测试用例的具体设计方法 1、等价类 2、边界问题 3、判定表&#xff08;因果图&#…

协程和线程的区别、协程原理与优缺点分析、在Java中使用协程

文章目录什么是协程协程的优点与缺点协程实现原理.协程与线程在不同编程语言的实现在Java中使用协程Kilim介绍Kilim整合Java,使用举例小总结什么是协程 相对于协程&#xff0c;你可能对进程和线程更为熟悉。进程一般代表一个应用服务&#xff0c;在一个应用服务中可以创建多个…

源码看CAF的线程调度框架

序 本篇文章带着大家来看下CAF&#xff08;C Actor Framwwork&#xff09;的调度框架&#xff0c;也是算现阶段C比较成熟的调度框架&#xff0c;大家如果自己完成一个比较大型的项目&#xff0c;任务调度也可以参照CAF。 鉴于篇幅较长&#xff0c;大家如果学习使用如何使用CAF…

修改jupyter notebook默认路径

修改jupyter notebook默认路径jupyter notebook默认打开C:\Users\你的用户名&#xff0c;用户名是你的电脑用户名&#xff0c;upload文件又会在C盘生成一堆文件&#xff0c;很乱&#xff0c;用notebook打开文件还要跳转到目录&#xff0c;很麻烦&#xff0c;那有没有办法呢&…

【PYTHON】如何配置集成开发环境Geany

&#x1f482;作者简介&#xff1a; THUNDER王&#xff0c;一名热爱财税和SAP ABAP编程以及热爱分享的博主。目前于江西师范大学会计学专业大二本科在读&#xff0c;同时任汉硕云&#xff08;广东&#xff09;科技有限公司ABAP开发顾问。在学习工作中&#xff0c;我通常使用偏后…

【笔记】大话设计模式17-20

【笔记】大话设计模式17-20 文章目录【笔记】大话设计模式17-2017 适配器模式17.1 Example17.2 定义17.3 Show me the code17.4 总结18 备忘录模式18.1 Example18.2 定义18.3 Show me the code18.4 总结19 组合模式19.1 Example19.2 定义19.3 Show me the code19.4 总结20 迭代…

基于python的人工智能数据处理常用算法

文章目录二分法求解最小二乘法曲线拟合最小二乘法的来历最小二乘法与曲线拟合多项式曲线拟合SciPy内置最小二乘法应用泰勒级数背景引入泰勒公式泰勒级数展开与多项式近似二分法求解 机器学习过程中往往会用到很多变量&#xff0c;而这些变量之间的复杂关系一般用非线性方程来&…

VS系列知识-VS Code的安装+Vue环境的搭建+Vue指令

一、VS Code下载地址 Visual Studio Code - Code Editing. Redefined 二、VS Code初始化设置 1.安装插件 在安装好的VSCode软件的扩展菜单中查找安装如下4个插件 2、创建项目 vscode本身没有新建项目的选项&#xff0c;所以要先创建一个空的文件夹&#xff0c;如project_xx…

【用三大件写出的开门烟花特效】

又到了一年一度的春节时期啦&#xff01;昨天呢是北方的小年&#xff0c;今天是南方的小年&#xff0c;看到大家可以愉快的放烟花&#xff0c;过大年很是羡慕呀&#xff01;辞旧岁&#xff0c;贺新春&#xff0c;今年我呀要放烟花&#xff0c;过春节&#xff01;&#x1f9e8;。…

云原生|kubernetes|2022年底cks真题解析(1-10)

前言&#xff1a; cka和cks认证真的比较恶心&#xff0c;他们的那个PSI Bridge Secure Browser真的非常卡。 吐槽完毕&#xff0c;不废话&#xff0c;直接上真题解析。 CKS总共是16道题&#xff0c;题目顺序是打乱的&#xff0c;由于认证系统非常卡&#xff0c;因此&#xf…

通讯录最终版——动态存储+文件处理

最终版通讯录即从上一个版本修改过来先看总体代码&#xff0c;我们再看看差异ps&#xff1a;里面涉及到很多函数的使用&#xff0c;后续我会出专栏来书写这些函数的使用和实例&#xff0c;与常见错误大家可以通过https://cplusplus.com查找test.c#define _CRT_SECURE_NO_WARNIN…

Spring入门-IOC/DI入门与使用文件配置管理(1)

文章目录Spring入门1&#xff0c;Spring介绍1.1 为什么要学?1.2 学什么?1.3 怎么学?2&#xff0c;Spring相关概念2.1 初识Spring2.1.1 Spring家族2.1.2 了解Spring发展史2.2 Spring系统架构2.2.1 系统架构图2.2.2 课程学习路线2.3 Spring核心概念2.3.1 目前项目中的问题2.3.…

已解决:无法解析 jdk.tools:jdk.tools:1.6

文章目录问题描述解决方案问题描述 HBase API客户端操作时&#xff0c;报错&#xff1a;无法解析 jdk.tools:jdk.tools:1.6 这种问题司空见惯了&#xff0c;无非是依赖没下载&#xff0c;版本问题&#xff0c;依赖没加载成功&#xff0c;文件索引没更新成功&#xff0c;IDEA文…