我之前的工作中一直在用 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 后台运行报表
任务管理
WEB IDE
XXL-JOB 使用场景订单超时取消
用户生日关怀短信发送
定时进行数据异构
每日商家结算
定时刷新缓存
....................
XXL-JOB 架构设计XXL-JOB 将调度行为抽象形成“调度中心”公共平台,而平台自身并不承担业务逻辑,“调度中心”负责发起调度请求。
将任务抽象成分散的 JobHandler,交由“执行器”统一管理,“执行器”负责接收调度请求并执行对应的 JobHandler 中业务逻辑。
调度 和 任务 两部分可以相互解耦,提高系统整体稳定性和扩展性;
如下图,任务和调度是分开的,相互解耦。
执行器嵌入在应用中,负责接收调度请求并执行任务逻辑。应用启动的时候会注册到调度中心,在后台有执行器管理功能,也可以手动添加执行器。
XXL-JOB 整体架构如下图所示,调度中心分为任务管理,执行器管理,日志管理等模块。
任务管理主要对任务的一些操作,包括添加任务,编辑任务,暂停任务,启动任务等功能。
执行器管理主要对执行器的一些操作,查看机器列表,管理在线执行器等。
日志管理负责所有日志相关的存储和展示。
其他模块包括了一些任务执行的报表,任务失败告警等功能。
执行器内部会暴露 Http 协议,调度中心在任务调度的时候,会向对应的执行器发起 Http 请求,执行器接收到请求后开始执行任务逻辑,执行器会回调调度中心,反馈任务执行的结果。
XXL-JOB 使用小技巧 日志自动清理XXL-JOB 中有调度日志和任务执行日志。如果任务多,调度频繁的话日志的数据量也挺大的,目前日志是存储在 Mysql 中,对应的表是 xxl_job_log。
在一开始用的时候发现 XXL-JOB 的后台直接有清理日志的按钮,直接在界面上操作非常即可,可以选择时间段清理,也还算方便。
通过手动的方式去操作必然会带来一个问题,就是忘记了,等到哪天卡的不行才会去清理一次,不智能。
当时就直接写了一个清理日志的任务,直接对 xxl_job_log 这张表进行删除操作,定时清理,这样就不用人工干预了。
后面发现 XXL-JOB 居然有自动清理的配置,这就是没仔细看文档的后果呀,通过下面的配置来决定执行器日志文件保存天数。
xxl.job.executor.logretentiondays=30
任务自动注册默认情况下,我们开发了一个任务需要到 XXL-JOB 的后台手动去添加一个任务。如果你想偷点懒的话我教你一个方式。