XXL-JOB最佳实践与升级指南
前言:
xxl-job是国内一款使用者比较多的分布式任务调度平台,我们内部从19年开始使用该款开源软件,使用的是2.0.1版本,并在此基础上做了二次开发,添加了一些定制化的功能。随着使用该定时器的业务组越来越多,有些业务组提出想要使用xxl-job新版本中引入的一些功能。因此,我们着手考虑了xxl-job的升级方案。
通过该文章,你可以学习到如下内容:
1. xxl-job的版本从2.0.1升级到2.3.1存在不兼容的问题,而且生产环境已经在使用,如何做到无缝迁移
2. xxl-job中主要功能的具体处理流程和底层原理,遇到问题可以快速排查
3. xxl-job在使用的过程中有哪些注意事项,避免踩坑
升级方案选型:
xxl-job升级面临的问题
- xxl-job的版本从2.0.1升级到2.3.1存在不兼容的问题,而且生产环境已经在使用,如何做到无缝迁移
- 内部使用的过程中进行过二次开发,对代码进行过修改,如何顺利迁移已经修改过的逻辑
xxl-job升级步骤
- 检查xxl-job-core是否向后兼容
经过测试发现,xxl-job-core的2.0.1版本无法成功注册到xxl-job-admin上面去。
为了能够实现升级的平滑过渡,我们考虑了如下三个方案:
(1)修改xxl-job-admin的源代码为了能够保证已有job的正常工作,使得2.3.1版本的xxl-job-admin同时支持2.0.1版本和2.3.1两个版本的xxl-job-core
(2)修改xxl-job-core的代码使得2.3.1版本的xxl-job-core同时识别2.0.1版本和2.3.1版本的注解和配置
(3)admin端和core端都不做修改,升级后各个业务自己修改JobHandler的相关代码
经过调研分析,我们决定采用第二种修改方案,这样我们的改动比较小,而且对各个业务方也基本上是透明的,基本不用对代码进行修改。
- 检查数据存储对应关系,编写数据迁移脚本
2.0.1版本的数据库表如下:
| XXL_JOB_QRTZ_BLOB_TRIGGERS | Quartz框架中使用的数据表,该项目中目前未使用到 | 
| XXL_JOB_QRTZ_CALENDARS | 同上 | 
| XXL_JOB_QRTZ_CRON_TRIGGERS | 存储定时任务的cron信息和时区信息 | 
| XXL_JOB_QRTZ_FIRED_TRIGGERS | Quartz框架中存储当前已经运行的触发器状态信息 | 
| XXL_JOB_QRTZ_JOB_DETAILS | Quartz框架中存储触发器的详细信息 | 
| XXL_JOB_QRTZ_LOCKS | Quartz框架中的悲观锁 | 
| XXL_JOB_QRTZ_PAUSED_TRIGGER_GRPS | Quartz框架中暂停的触发器组信息 | 
| ................................................... | 忽略Quartz框架下的其他数据库表,Quartz框架下的数据表和数据迁移工作内容无关 | 
| XXL_JOB_QRTZ_TRIGGER_GROUP | 定时任务所属分组,也就是各个工程的相关信息 | 
| XXL_JOB_QRTZ_TRIGGER_INFO | 定时任务的基本信息 | 
| XXL_JOB_QRTZ_LDAP_GROUP | LDAP分组与定时任务分组的关联关系表(二次开发添加) | 
| XXL_JOB_QRTZ_TRIGGER_LOGGLUE | 以GLUE模式运行的定时任务对应的源码信息 | 
| XXL_JOB_QRTZ_TRIGGER_REGISTRY | 注册的执行器信息 | 
| XXL_JOB_QRTZ_TRIGGER_LOG | 记录定时任务的调度结果,这里需要注意的时候,调度成功并不代表着该定时任务执行成功。 | 
2.3.1版本xxl-job数据库表信息如下:
| xxl_job_group | 对应2.0.1版本中XXL_JOB_QRTZ_TRIGGER_GROUP数据表 | 
| xxl_job_info | 对应2.0.1版本中的XXL_JOB_QRTZ_TRIGGER_INFO | 
| xxl_job_lock | JobScheduleHelper通过该数据库表实现对定时任务的互斥调度;如果要实现一个简单的分布式调度器,实现JobScheduleHelper这个类基本就够了 | 
| xxl_job_log | 对应2.0.1版本中的XXL_JOB_QRTZ_TRIGGER_LOG表 | 
| xxl_job_log_report | 定时任务调度结果的汇总报表 | 
| xxl_job_logglue | 对应2.0.1版本中的XXL_JOB_QRTZ_TRIGGER_LOGGLUE表 | 
| xxl_job_registry | 对应2.0.1版本中的XXL_JOB_QRTZ_TRIGGER_REGISTRY表 | 
| xxl_job_user | 新增的用户信息表,在我们内部不会使用到 | 
| 手动新增:xxl_job_ldap_group | 存储各个技术组的信息 | 
注:有关Quartz框架中数据库表字段解释可以参考这篇技术博客:
https://www.cnblogs.com/zyulike/p/13671130.html
3. 修改2.3.1版本的xxl-job-admin
这个步骤里面的主要工作是迁移和添加二次开发的代码到新版本的xxl-job-admin,主要功能包括:登录逻辑修改,权限管理逻辑修改,邮件报警通知修改成企业微信通知,执行器和定时任务进行分组管理,针对不合理的逻辑进行性能优化。
4. 修改2.3.1版本的xxl-job-core
修改xxl-job-core的代码使得2.3.1版本的xxl-job-core同时识别2.0.1版本和2.3.1版本的注解和配置
注意事项:
- 如果在JobHandler实现类中有需要进行一次性初始化的操作,务必避免使用init()这个方法,因为JobHandler每次运行的时候都会重复执行init()方法
- 定时任务执行失败可以通过企业微信通知相关的负责人,注意需要抛异常出来才可以
- 注册的执行器节点最好使用自动注册的方式
xxl-job定时任务处理流程:
v.2.0.1版本控制台侧xxl-job手动触发定时任务的处理流程:

自动触发定时任务是通过XxlJobDynamicSchedulerConfig中创建的SchedulerFactoryBean来调度完成
v2.3.1版本控制台侧手动触发定时任务的处理流程:

自动触发定时任务是通过XxlJobAdminConfig中创建的XxlJobScheduler来调度完成的
v2.0.1版本业务侧定时任务的处理流程如下:

v2.3.1版本业务侧定时任务的处理流程和v2.0.1版本的处理流程并没有太多的区别,主要的差异在于EmbedServer从JettyServer切换成了NettyServer,底层信息的协议格式依然是HTTP协议。
新版本主要功能底层实现原理解析:
功能解析一:
调度线程池隔离,拆分为”Fast”和”Slow”两个线程池,1分钟窗口期内任务耗时达500ms超过10次,该窗口期内判定为慢任务,慢任务自动降级进入”Slow”线程池,避免耗尽调度线程,提高系统稳定性
上述功能是通过在JobScheduleHelper中设置两个线程池来实现的,不过实在不太理解这个功能的作用是什么,因为只要调度成功给业务侧的EmbedServer后EmbedServer就会返回成功的消息给控制台一端,而不需要等待定时任务具体逻辑真正执行结束。
功能解析二:自研调度组件,移除quartz依赖:一方面是为了精简系统降低冗余依赖,另一方面是为了提供系统的可控度与稳定性;
该自研的调度组件是依赖JobScheduleHelper来完成的,具体处理流程如下所示:

功能解析三:GLUE-JAVA模式的定时任务是如何工作的
通过Groovy ClassLoader将Java源码动态编译成为class,具体处理可以查看GlueFactory类
总结:
今天就写到这里吧,如果有想继续深入沟通的小伙伴儿,请加微信群聊或者本人微信进一步沟通和交流。
 
               
XXL-JOB最佳实践与升级指南的更多相关文章
- (转载)PyTorch代码规范最佳实践和样式指南
		A PyTorch Tools, best practices & Styleguide 中文版:PyTorch代码规范最佳实践和样式指南 This is not an official st ... 
- 【转】Talend作业设计模式和最佳实践-Part II
		转载地址:https://mp.weixin.qq.com/s?__biz=MzA3OTg1Mzk4Nw==&mid=2453261363&idx=1&sn=5674f1df8 ... 
- 阿里巴巴发布最佳实践 | 阿里巴巴DevOps实践指南
		编者按:本文源自阿里云云效团队出品的<阿里巴巴DevOps实践指南>,扫描上方二维码或前往:https://developer.aliyun.com/topic/devops,下载完整版电 ... 
- 如何让HTTPS站点评级达到A+? 还得看这篇HTTPS安全优化配置最佳实践指南
		0x00 前言简述 SSL/TLS 简单说明 描述: 当下越来越多的网站管理员为企业站点或自己的站点进行了SSL/TLS配置, SSL/TLS 是一种简单易懂的技术,它很容易部署及运行,但要对其进行安 ... 
- 【读书笔记】读《高性能网站建设指南》及《高性能网站建设进阶指南:Web开发者性能优化最佳实践》
		这两本书就一块儿搞了,大多数已经理解,简单做个标记.主要对自己不太了解的地方,做一些记录. 一.读<高性能网站建设指南> 0> 黄金性能法则:只有10%~20%的最终用户响应时间 ... 
- Python 最佳实践指南 2018 学习笔记
		基础信息 版本 Python 2.7 Python 3.x Python2.7 版本在 2020 年后不再提供支持,建议新手使用 3.x 版本进行学习 实现 CPython:Python的标准实现: ... 
- RESTful API 设计指南,RESTful API 设计最佳实践
		RESTful API 设计指南,RESTful API 设计最佳实践 网络应用程序,分为前端和后端两个部分.当前的发展趋势,就是前端设备层出不穷(手机.平板.桌面电脑.其他专用设备......). ... 
- 经典的性能优化最佳实践 web性能权威指南 读书笔记
		web性能权威指南 page 203 经典的性能优化最佳实践 无论什么网络,也不管所用网络协议是什么版本,所有应用都应该致力于消除或减 少不必要的网络延迟,将需要传输的数据压缩至最少.这两条标准是经典 ... 
- 转载:Google 官方应用架构的最佳实践指南   赞👍
		官方给的实践指南,很有实际的指导意义, 特别是对一些小公司,小团队,给了很好的参考意义. 原文地址: https://developer.android.com/topic/libraries/ar ... 
随机推荐
- 拥抱 OpenAPI 3:springdoc-openapi 食用指南
			概述 使用 springdoc-openapi 可以快速为 springboot 项目生成规范的 API 文档,具体使用步骤如下: 依赖配置 在 pom.xml 加入内容,即可开始使用: <de ... 
- 一、shell编程与变量
			目录 命令是什么 命令是如何运行的: 基本语法 解释器 注释 如何执行 输入.输出流 重定向 管道符 | 变量 常见Shell变量的类型包括: 变量命名原则 单引号和双引号 反引号 变量作用范围 查看 ... 
- rosbag遍历数据出错:(unicode error) 'utf-8' codec can't decode byte 0xcd in position 31: invalid continuation byte
			主题: 前言 针对ros系统记录的bag文件,可以使用python的rosbag包,按照不同起止时间和topic进行提取. 然而,有的topic可以使用rosbag读取,但是不能遍历,存在解码错误.原 ... 
- 利用XtraDiagram.DiagramControl进行流程图形的绘制和控制
			DevExpress提供了一个比较强大的图形绘制工具,可以用于绘制各种图形,如流程图.组织机构图等等,本篇随笔介绍XtraDiagram.DiagramControl的使用,以及利用代码对其属性进行控 ... 
- zabbix-5.0自动发现
			1. 安装zabbix5.0 rpm -Uvh https://repo.zabbix.com/zabbix/5.0/rhel/7/x86_64/zabbix-release-5.0-1.el7.no ... 
- input标签的事件之oninput事件
			最近在写前端的时候,用到了oninput事件.(其中也涉及了onclick) 问题:鼠标点击数字和运算符的时候,文本框里的内容到达一定长度时,会出现无法继续往后面跟随光标的问题. 解决:见下面代码 这 ... 
- 扩展新的WCV到标准的WC后,不能在业务角色里面看见视图解决方法
			by zyi 感谢群主红枣的分享 1.把你的WCVIEW扩展进WC中 2.使用UI Designer打开你的WCVIEW 3.更改你的WCVIEW名字 
- Electron学习(三)之简单交互操作
			写在前面 最近一直在做批量测试工具的开发,打包的exe,执行也是一个黑乎乎的dos窗口,真的丑死了,总感觉没个界面,体验不好,所以就想尝试写桌面应用程序. 在技术选型时,Java窗体实现使用JavaF ... 
- TypeScript let与var的区别
			1.作用域不同 用var声明的变量,只有函数作用域和全局作用域,没有块级作用域.而let可以实现块级作用域,只能在代码块{}内有效,在{}之外不能访问,如下代码所示: { let a = 0; var ... 
- 内存分析器 (MAT)
			内存分析器 (MAT) 1. 内存分析器 (MAT) 1.1 MAT介绍 MAT是Memory Analyzer tool的缩写.指分析工具. 1.2 MAT作用 Eclipse Memory ... 
