前言
我之前的工作中一直在用 Elastic-Job 来做任务调度。这也是大家为什么能在我的书籍《Spring Cloud 微服务 入门 实战与进阶》中看到 Elastic-Job 的章节。
从 2017 的 2.1.5 版本之后 Elastic-Job 没再更新过。我们在做技术选型的时候,对框架的使用范围和社区的活跃度都会比较看重,当然首先是功能点能够满足业务需求。
今天给大家新推荐一个任务调度框架,也许很多人听过甚至目前已经使用了很久。不过没关系,这也不影响你今天阅读本文章。
这个框架就是 XXL-JOB,一个轻量级分布式任务调度平台。最近在我的开源项目 Kitty-Cloud 中就采用了 XXL-JOB,还有一个原因是我目前任职的公司也一直在使用 XXL-JOB。
XXL-JOB 的前世今生
XXL-JOB 是一个分布式任务调度平台,其核心设计目标是开发迅速、学习简单、轻量级、易扩展。现已开放源代码并接入多家公司线上产品线,开箱即用。
2015-11 月,XXL-JOB RELEASE 了第一个大版本 V1.0,在后面的几年里一直在更新。目前最新的版本是今年更新的 2.2.0。
功能特性
调度中心 HA(中心式)
执行器 HA(分布式)
执行器弹性扩容缩容
丰富的路由策略支持
支持高度容错故障转移
任务超时控制
任务失败重试
任务失败告警
任务动态分片
脚本任务
等等。。
```。
丰富的 WEB 后台
运行报表
![](https://s4.51cto.com/images/blog/202007/30/0c1811e503c779b3011c3331577ae95b.png?x-oss-process=image/watermark,size_16,text_QDUxQ1RP5Y2a5a6i,color_FFFFFF,t_100,g_se,x_10,y_10,shadow_90,type_ZmFuZ3poZW5naGVpdGk=)
任务管理
![](https://s4.51cto.com/images/blog/202007/30/903935997eadd8baf972bcf35d27ffeb.png?x-oss-process=image/watermark,size_16,text_QDUxQ1RP5Y2a5a6i,color_FFFFFF,t_100,g_se,x_10,y_10,shadow_90,type_ZmFuZ3poZW5naGVpdGk=)
WEB IDE
![](https://s4.51cto.com/images/blog/202007/30/dd360bec3c80b5f4d81d3d4ab4874ed7.png?x-oss-process=image/watermark,size_16,text_QDUxQ1RP5Y2a5a6i,color_FFFFFF,t_100,g_se,x_10,y_10,shadow_90,type_ZmFuZ3poZW5naGVpdGk=)
XXL-JOB 使用场景
订单超时取消
用户生日关怀短信发送
定时进行数据异构
每日商家结算
定时刷新缓存
....................
XXL-JOB 架构设计
XXL-JOB 将调度行为抽象形成“调度中心”公共平台,而平台自身并不承担业务逻辑,“调度中心”负责发起调度请求。
将任务抽象成分散的 JobHandler,交由“执行器”统一管理,“执行器”负责接收调度请求并执行对应的 JobHandler 中业务逻辑。
调度 和 任务 两部分可以相互解耦,提高系统整体稳定性和扩展性;
如下图,任务和调度是分开的,相互解耦。
执行器嵌入在应用中,负责接收调度请求并执行任务逻辑。应用启动的时候会注册到调度中心,在后台有执行器管理功能,也可以手动添加执行器。
![](https://s4.51cto.com/images/blog/202007/30/6a7d08b969b4e34335d15b47d0be13f5.png?x-oss-process=image/watermark,size_16,text_QDUxQ1RP5Y2a5a6i,color_FFFFFF,t_100,g_se,x_10,y_10,shadow_90,type_ZmFuZ3poZW5naGVpdGk=)
XXL-JOB 整体架构如下图所示,调度中心分为任务管理,执行器管理,日志管理等模块。
任务管理主要对任务的一些操作,包括添加任务,编辑任务,暂停任务,启动任务等功能。
执行器管理主要对执行器的一些操作,查看机器列表,管理在线执行器等。
日志管理负责所有日志相关的存储和展示。
其他模块包括了一些任务执行的报表,任务失败告警等功能。
执行器内部会暴露 Http 协议,调度中心在任务调度的时候,会向对应的执行器发起 Http 请求,执行器接收到请求后开始执行任务逻辑,执行器会回调调度中心,反馈任务执行的结果。
![](https://s4.51cto.com/images/blog/202007/30/2637e5fe35bbedd897eb8a69386e8d72.png?x-oss-process=image/watermark,size_16,text_QDUxQ1RP5Y2a5a6i,color_FFFFFF,t_100,g_se,x_10,y_10,shadow_90,type_ZmFuZ3poZW5naGVpdGk=)
XXL-JOB 使用小技巧
日志自动清理
XXL-JOB 中有调度日志和任务执行日志。如果任务多,调度频繁的话日志的数据量也挺大的,目前日志是存储在 Mysql 中,对应的表是 xxl_job_log。
在一开始用的时候发现 XXL-JOB 的后台直接有清理日志的按钮,直接在界面上操作非常即可,可以选择时间段清理,也还算方便。
![](https://s4.51cto.com/images/blog/202007/30/7da0bb58e8437a62f28b219264bd0705.png?x-oss-process=image/watermark,size_16,text_QDUxQ1RP5Y2a5a6i,color_FFFFFF,t_100,g_se,x_10,y_10,shadow_90,type_ZmFuZ3poZW5naGVpdGk=)
通过手动的方式去操作必然会带来一个问题,就是忘记了,等到哪天卡的不行才会去清理一次,不智能。
当时就直接写了一个清理日志的任务,直接对 xxl_job_log 这张表进行删除操作,定时清理,这样就不用人工干预了。
后面发现 XXL-JOB 居然有自动清理的配置,这就是没仔细看文档的后果呀,通过下面的配置来决定执行器日志文件保存天数。
xxl.job.executor.logretentiondays=30
任务自动注册
默认情况下,我们开发了一个任务需要到 XXL-JOB 的后台手动去添加一个任务。如果你想偷点懒的话我教你一个方式。
可以自己定义一个注解,然后项目启动的时候扫描注解,获取注解里的配置,调用 XXL-JOB 后的 API 接口直接插入,这样新加的任务在你启动后就自动创建了。
扩展监控支持短信和钉钉
XXL-JOB 对任务的失败告警默认只支持邮件的方式,但是提供了扩展的方式,需要对后台的代码进行扩展才行。
可以自己动手扩展监控告警,比如支持钉钉消息,短信等告警方式。
扩展代码位置:JobFailMonitorHelper.failAlarm
数据格式:
{
"emails": ["xxx.mail.com", "xxx.mail.com"],
"dingdings": [
{
"access_token": " ",
"secret": ""
}
] ,
"mobiles": ["18211110000"]
}
上面定义的 Json 数据格式我们可以直接用后台目前已有的监控邮箱的文本框进行输入,然后在
JobFailMonitorHelper 进行解析,选择对应的发送方式即可。
做的更友好的方式就直接把后台的那个编辑页面改掉,增加几个单独的短信,钉钉文本输入框。
XXL-JOB 视频教程
本文大概的给大家介绍了下 XXL-JOB, 如果大家感兴趣的话可以去看官方文档。或者去我 B 站看技术视频,XXL-JOB 我录制了一整套的视频在 B 站,免费的哦!
我的 B 站主页地址:https://space.bilibili.com/512764250[1]
或者直接在 B 站搜索 猿天地 也可以哦!记得关注下哈。
![](https://s4.51cto.com/images/blog/202007/30/c1ced60aded566bafa21d14726da3e38.png?x-oss-process=image/watermark,size_16,text_QDUxQ1RP5Y2a5a6i,color_FFFFFF,t_100,g_se,x_10,y_10,shadow_90,type_ZmFuZ3poZW5naGVpdGk=)
关于作者:尹吉欢,简单的技术爱好者,《Spring Cloud 微服务-全栈技术与案例解析》, 《Spring Cloud 微服务 入门 实战与进阶》作者, 公众号 猿天地 发起人。
参考资料
[1]
B站主页: https://space.bilibili.com/512764250
扫下面的码加技术群,广告勿扰
![](https://s4.51cto.com/images/blog/202007/30/761f9743d8d796efc051298fc9607360.png?x-oss-process=image/watermark,size_16,text_QDUxQ1RP5Y2a5a6i,color_FFFFFF,t_100,g_se,x_10,y_10,shadow_90,type_ZmFuZ3poZW5naGVpdGk=)
如有收获,点个在看,诚挚感谢