分布式任务调度框架几乎是每个大型应用必备的工具。XXL-JOB是一个分布式任务调度平台,其核心设计目标是开发迅速、学习简单、轻量级、易扩展。现已开放源代码并接入多家公司线上产品线,开箱即用。
目前已有多家公司接入xxl-job,包括比较知名的大众点评,京东,优信二手车,北京尚德,360金融 (360),联想集团 (联想),易信 (网易)等等....
① 功能强大
② 高性能
③ 高可用
④ 监控治理
3.1 设计思想
因此,“调度”和“任务”两部分可以相互解耦,提高系统整体稳定性和扩展性。
如果胖友对分布式任务调度平台有一定了解的话,如果从调度系统的角度来看,可以分成两类:
如此可知 XXL-Job 属于中心化的任务调度平台。目前采用这种方案的还有:
去中心化的任务调度平台,目前有:
3.2 系统组成
整个 XXL-JOB 系统,由调度中心和执行器两个角色组成,分别处于不同的进程中。
调度中心
执行器
一般来说,XXL-JOB 执行器可以内嵌到应用服务里。例如说,一个提供 Restful API 的 Spring Boot 项目中,引入 xxl-job-core 依赖,同时也作为一个 XXL-JOB 执行器。本质上,每次 Restful API 是请求任务,而每次任务调度是定时任务。
3.3 架构图
3.4 同类框架比较
框架名称 |
quartz |
elastic-job-lite |
xxl-job |
LTS |
依赖 |
MySQL、jdk |
jdk、zookeeper |
mysql、jdk |
jdk、zookeeper、maven |
高可用 |
多节点部署,通过竞争数据库锁来保证只有一个节点执行任务 |
通过zookeeper的注册与发现,可以动态的添加服务器 |
基于竞争数据库锁保证只有一个节点执行任务,支持水平扩容。可以手动增加定时任务,启动和暂停任务,有监控 |
集群部署,可以动态的添加服务器。可以手动增加定时任务,启动和暂停任务。有监控 |
任务分片 |
不支持 |
支持 |
支持 |
支持 |
管理界面 |
不支持 |
支持 |
支持 |
支持 |
高级功能 |
弹性扩容,多种作业模式,失效转移,运行状态收集,多线程处理数据,幂等性,容错处理,spring命名空间支持 |
弹性扩容,分片广播,故障转移,Rolling实时日志,GLUE(支持在线编辑代码,免发布),任务进度监控,任务依赖,数据加密,邮件报警,运行报表,国际化 |
支持spring,spring boot,业务日志记录器,SPI扩展支持,故障转移,节点监控,多样化任务执行结果支持,FailStore容错,动态扩容。 |
|
版本更新 |
半年没更新 |
2年没更新 |
最近有更新 |
1年没更新 |
4.1 克隆原码
克隆完成后,耐心等待下载完依赖。
这里,我们需要编译的主要是 xxl-job-admin 模块,即调度中心。
4.2 初始化XXL-JOB表结构
在 doc/db/tables_xxl_job.sql 地址,是 XXL-JOB 表结构的初始化脚本。我们需要在数据库中执行该脚本,完成初始化 XXL-JOB 表结构。
自 XXL-JOB 2.1.0 Release 版本,去除对 Quartz 的依赖,所以我们就看不到 Quartz 相关的表哈。
4.3 修改配置文件
打开 xxl-job-admin 模块,修改
src/main/resources/application.properties 配置文件。如下:
### web # Web 服务器
server.port=8080
server.context-path=/xxl-job-admin
### actuator
management.context-path=/actuator
management.health.mail.enabled=false
### resources
spring.mvc.static-path-pattern=/static/**
spring.resources.static-locations=classpath:/static/
### freemarker
spring.freemarker.templateLoaderPath=classpath:/templates/
spring.freemarker.suffix=.ftl
spring.freemarker.charset=UTF-8
spring.freemarker.request-context-attribute=request
spring.freemarker.settings.number_format=0.##########
### mybatis
mybatis.mapper-locations=classpath:/mybatis-mapper/*Mapper.xml
### xxl-job, datasource 调度中心 JDBC 链接
spring.datasource.url=jdbc:mysql://127.0.0.1:3306/xxl_job?Unicode=true&characterEncoding=UTF-8
spring.datasource.username=root
spring.datasource.password=root_pwd
spring.datasource.driver-class-name=com.mysql.jdbc.Driver
spring.datasource.type=org.apache.tomcat.jdbc.pool.DataSource
spring.datasource.tomcat.max-wait=10000
spring.datasource.tomcat.max-active=30
spring.datasource.tomcat.test-on-borrow=true
spring.datasource.tomcat.validation-query=SELECT 1
spring.datasource.tomcat.validation-interval=30000
### xxl-job email 报警邮箱
spring.mail.host=smtp.qq.com
spring.mail.port=25
[email protected]
spring.mail.password=xxx
spring.mail.properties.mail.smtp.auth=true
spring.mail.properties.mail.smtp.starttls.enable=true
spring.mail.properties.mail.smtp.starttls.required=true
spring.mail.properties.mail.smtp.socketFactory.class=javax.net.ssl.SSLSocketFactory
### xxl-job, access token 调度中心通讯TOKEN [选填]:非空时启用;调度中心国际化配置 [选填]: 默认为空,表示中文; "en" 表示英文;
xxl.job.accessToken=
### xxl-job, i18n (default empty as chinese, "en" as english)
xxl.job.i18n=
## xxl-job, triggerpool max size 调度线程池最大线程配置
xxl.job.triggerpool.fast.max=200
xxl.job.triggerpool.slow.max=100
### xxl-job, log retention days 调度中心日志表数据保存天数 [必填]:过期日志自动清理;限制大于等于7时生效,否则, 如-1,关闭自动清理功能;
xxl.job.logretentiondays=30
可以看到 XXL-JOB 使用了 Spring Boot ,嘿嘿。配置项比较多,以下必须要改的项:
4.4 修改日志配置文件
打开 xxl-job-admin 模块,修改
src/main/resources/logback.xml 配置文件。如下:
4.5 IDEA启动调度中心
在开始编译源码之前,我们先直接使用 XxlJobAdminApplication 类,运行启动调度中心。这样,避免我们后面编译源码,进行打包查出来的 jar 包,结果配置文件不对的尴尬。
当看到如下日志,代表启动成功:
启动成功后,浏览器
http://127.0.0.1:8080/xxl-job-admin 地址,并使用默认 "admin/123456" 进行登录。如果登录成功,说明我们已经配置正确啦。
4.6 编译原码
# 进入 xxl-job-admin 模块根目录
$ cd
/Users/yunai/Java/xxl-job2/
# 使用 Maven 打包指定 xxl-job-admin 模块,并忽略测试
$ mvn clean package -pl xxl-job-admin -am -DskipTests
打包完成后,在
xxl-job-admin/target/xxl-job-admin-2.1.2-SNAPSHOT.jar 地址下,就是我们要启动的 XXL-JOB 调度中心的 jar 包。
4.7 命令行启动调度中心
# 进入 xxl-job-admin jar 包所在目录
$ cd xxl-job-admin/target/
# 启动调度中心
$ jar -jar
xxl-job-admin-2.1.2-SNAPSHOT.jar
当看到如下日志,代表启动成功:
23:19:11.950 logback [main] INFO o.a.coyote.http11.Http11NioProtocol - Starting ProtocolHandler ["http-nio-8080"]
23:19:12.026 logback [main] INFO o.a.tomcat.util.net.NioSelectorPool - Using a shared selector for servlet write/read
23:19:12.181 logback [main] INFO o.s.b.c.e.t.TomcatEmbeddedServletContainer - Tomcat started on port(s): 8080 (http)
启动成功后,浏览器
http://127.0.0.1:8080/xxl-job-admin 地址,并使用默认 "admin/123456" 进行登录。如果登录成功,说明我们已经配置正确啦。
另外,启动完成之后,记得去「用户管理」菜单,修改下管理员的密码
4.8 搭建集群
在生产环境下,一定要部署 XXL-JOB 调度中心的集群,提升调度系统容灾和可用性。
调度中心集群部署时,几点要求和建议:
基于xxl-job的众多优良特性,该技术在实际应用中也颇受欢迎,比如:由于购物车采用的是同步操作redis,异步操作mysql。即使mysql操作失败,只要redis操作成功,依然不影响功能的使用。但是,如果不进行定期的数据同步处理,则可能导致mysql数据存在严重偏差,失去了数据分析价值。所以可以使用xxl-job定时同步购物车数据。