关于分布式:分布式调度平台-XXLJOB-极简入门

76次阅读

共计 7556 个字符,预计需要花费 19 分钟才能阅读完成。

1. 概述
分布式任务调度框架简直是每个大型利用必备的工具。XXL-JOB 是一个分布式任务调度平台,其外围设计指标是开发迅速、学习简略、轻量级、易扩大。现已凋谢源代码并接入多家公司线上产品线,开箱即用。

目前已有多家公司接入 xxl-job,包含比拟出名的公众点评,京东,优信二手车,北京尚德,360 金融 (360),联想集团 (联想),易信 (网易)等等 ….

2. 个性
① 功能强大

1、简略:反对通过 Web 页面对工作进行 CRUD 操作,操作简略,一分钟上手;
2、动静:反对动静批改工作状态、启动 / 进行工作,以及终止运行中工作,即时失效;
3、事件触发:除了”Cron 形式”和”工作依赖形式”触发工作执行之外,反对基于事件的触发工作形式。调度核心提供触发工作单次执行的 API 服务,可依据业务事件灵便触发。
4、GLUE:提供 Web IDE,反对在线开发工作逻辑代码,动静公布,实时编译失效,省略部署上线的过程。反对 30 个版本的历史版本回溯。19、脚本工作:反对以 GLUE 模式开发和运行脚本工作,包含 Shell、Python、NodeJS、PHP、PowerShell 等类型脚本;
5、命令行工作:原生提供通用命令行工作 Handler(Bean 工作,”CommandJobHandler”);业务方只须要提供命令行即可;
6、工作依赖:反对配置子工作依赖,当父工作执行完结且执行胜利后将会被动触发一次子工作的执行, 多个子工作用逗号分隔;
7、自定义工作参数:反对在线配置调度工作入参,即时失效;
8、数据加密:调度核心和执行器之间的通信进行数据加密,晋升调度信息安全性;
9、跨平台:原生提供通用 HTTP 工作 Handler(Bean 工作,”HttpJobHandler”);业务方只须要提供 HTTP 链接即可,不限度语言、平台;
10、国际化:调度核心反对国际化设置,提供中文、英文两种可选语言,默认为中文;
② 高性能

1、分片播送工作:执行器集群部署时,工作路由策略抉择”分片播送”状况下,一次任务调度将会播送触发集群中所有执行器执行一次工作,可依据分片参数开发分片工作;
2、动静分片:分片播送工作以执行器为维度进行分片,反对动静扩容执行器集群从而动静减少分片数量,协同进行业务解决;在进行大数据量业务操作时可显著晋升工作解决能力和速度。
3、调度线程池:调度零碎多线程触发调度运行,确保调度准确执行,不被梗塞;
4、全异步:任务调度流程全异步化设计实现,如异步调度、异步运行、异步回调等,无效对密集调度进行流量削峰,实践上反对任意时长工作的运行;
5、线程池隔离:调度线程池进行隔离拆分,慢工作主动降级进入”Slow”线程池,防止耗尽调度线程,进步零碎稳定性;
③ 高可用

1、调度核心 HA(核心式):调度采纳核心式设计,“调度核心”自研调度组件并反对集群部署,可保障调度核心 HA;
2、执行器 HA(分布式):工作分布式执行,工作”执行器”反对集群部署,可保障工作执行 HA;
3、路由策略:执行器集群部署时提供丰盛的路由策略,包含:第一个、最初一个、轮询、随机、一致性 HASH、最不常常应用、最近最久未应用、故障转移、繁忙转移等;
4、故障转移:工作路由策略抉择”故障转移”状况下,如果执行器集群中某一台机器故障,将会主动 Failover 切换到一台失常的执行器发送调度申请。
5、阻塞解决策略:调度过于密集执行器来不及解决时的解决策略,策略包含:单机串行(默认)、抛弃后续调度、笼罩之前调度;
6、工作超时管制:反对自定义工作超时工夫,工作运行超时将会被动中断工作;
7、工作失败重试:反对自定义工作失败重试次数,当工作失败时将会依照预设的失败重试次数被动进行重试;其中分片工作反对分片粒度的失败重试;
8、一致性:“调度核心”通过 DB 锁保障集群散布式调度的一致性, 一次任务调度只会触发一次执行;
④ 监控治理

1、注册核心: 执行器会周期性主动注册工作, 调度核心将会主动发现注册的工作并触发执行。同时,也反对手动录入执行器地址;
2、弹性扩容缩容:一旦有新执行器机器上线或者下线,下次调度时将会重新分配工作;
3、工作失败告警;默认提供邮件形式失败告警,同时预留扩大接口,可不便的扩大短信、钉钉等告警形式;
4、工作进度监控:反对实时监控工作进度;
5、Rolling 实时日志:反对在线查看调度后果,并且反对以 Rolling 形式实时查看执行器输入的残缺的执行日志;
6、邮件报警:工作失败时反对邮件报警,反对配置多邮件地址群发报警邮件;
7、推送 Maven 地方仓库: 将会把最新稳定版推送到 Maven 地方仓库, 不便用户接入和应用;
8、运行报表:反对实时查看运行数据,如工作数量、调度次数、执行器数量等;以及调度报表,如调度日期分布图,调度胜利分布图等;
9、容器化:提供官网 Docker 镜像,并实时更新推送 Docker Hub,进一步实现产品开箱即用;
10、用户治理:反对在线管理系统用户,存在管理员、普通用户两种角色;
11、权限管制:执行器维度进行权限管制,管理员领有全量权限,普通用户须要调配执行器权限后才容许相干操作;
3. 架构设计
3.1 设计思维

将调度行为形象造成“调度核心”公共平台,而平台本身并不承当业务逻辑,“调度核心”负责发动调度申请。
将工作形象成扩散的 JobHandler,交由“执行器”对立治理,“执行器”负责接管调度申请并执行对应的 JobHandler 中 业务逻辑。
因而,“调度”和“工作”两局部能够互相解耦,进步零碎整体稳定性和扩展性。

如果胖友对分布式任务调度平台有肯定理解的话,如果从调度零碎的角度来看,能够分成两类:

中心化:调度核心和执行器拆散,调度核心对立调度,告诉某个执行器解决工作。
去中心化:调度核心和执行器一体化,本人调度本人执行解决工作。
如此可知 XXL-Job 属于中心化的任务调度平台。目前采纳这种计划的还有:

链家的 kob
美团的 Crane(暂未开源)
去中心化的任务调度平台,目前有:

Elastic Job
唯品会的 Saturn
Quartz 基于数据库的集群计划
淘宝的 TBSchedule(暂停更新,只能应用阿里云 SchedulerX 服务)
3.2 零碎组成

整个 XXL-JOB 零碎,由调度核心和执行器两个角色组成,别离处于不同的过程中。

调度核心

负责管理调度信息,依照调度配置收回调度申请,本身不承当业务代码。
调度零碎与工作解耦,进步了零碎可用性和稳定性,同时调度零碎性能不再受限于工作模块。
反对可视化、简略且动静的治理调度信息,包含工作新建,更新,删除,GLUE 开发和工作报警等,所有上述操作都会实时失效。
反对监控调度后果以及执行日志,反对执行器 Failover。
执行器

负责接管调度申请并执行工作逻辑。工作模块专一于工作的执行等操作,开发和保护更加简略和高效。
接管“调度核心”的执行申请、终止申请和日志申请等。
一般来说,XXL-JOB 执行器能够内嵌到应用服务里。例如说,一个提供 Restful API 的 Spring Boot 我的项目中,引入 xxl-job-core 依赖,同时也作为一个 XXL-JOB 执行器。实质上,每次 Restful API 是申请工作,而每次任务调度是定时工作。

3.3 架构图

散布式调度平台 XXL-JOB 极简入门
留神,右边是调度核心,左边是执行器。
【执行器】:[注册线程] 依据配置的【调度核心】的地址,主动注册到【调度核心】。
【调度核心】:达到工作触发条件,【调度核心】下发工作给【执行器】。
【执行器】:基于 [工作线程池] 执行工作,并把执行后果放入 [内存队列] 中、把 [执行日志] 写入 Log 日志文件中。
【执行器】:[回调线程] 生产 [内存队列] 中的调度后果,被动上报给【调度核心】。
当用户在【调度核心】查看 [Rolling 工作日志],【调度核心】申请【执行器】,【执行器】读取 Log 日志文件并返回日志详情。
3.4 同类框架比拟

4. 搭建调度核心
4.1 克隆原码

克隆实现后,急躁期待下载完依赖。

xxl-job-core 模块:XXL-JOB 外围。后续咱们在编写执行器时,会引入该模块。
xxl-job-admin 模块:调度核心。
xxl-job-executor-samples 模块:提供了在 Spring、Spring Boot、JFinal、Nutz 等框架下的应用示例。
这里,咱们须要编译的次要是 xxl-job-admin 模块,即调度核心。

4.2 初始化 XXL-JOB 表构造

在 doc/db/tables_xxl_job.sql 地址,是 XXL-JOB 表构造的初始化脚本。咱们须要在数据库中执行该脚本,实现初始化 XXL-JOB 表构造。

xxljoblock:任务调度锁表;
xxljobgroup:执行器信息表,保护工作执行器信息;
xxljobinfo:调度扩大信息表:用于保留 XXL-JOB 调度工作的扩大信息,如工作分组、工作名、机器地址、执行器、执行入参和报警邮件等等;
xxljoblog:调度日志表:用于保留 XXL-JOB 任务调度的历史信息,如调度后果、执行后果、调度入参、调度机器和执行器等等;
xxljoblog_report:调度日志报表:用户存储 XXL-JOB 任务调度日志的报表,调度核心报表性能页面会用到;
xxljoblogglue:工作 GLUE 日志:用于保留 GLUE 更新历史,用于反对 GLUE 的版本回溯性能;
xxljobregistry:执行器注册表,保护在线的执行器和调度核心机器地址信息;
xxljobuser:零碎用户表;
自 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
spring.mail.username=xxx@qq.com
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,嘿嘿。配置项比拟多,以下必须要改的项:

server.port:XXL-JOB 调度核心的服务器地址。能够依据本人的须要,批改该端口。
spring.datasource:XXL-JOB 调度核心的数据源地址,必须批改成本人筹备提供给 XXL-JOB 的数据库地址。
spring.mail:报警邮箱,生产环境下必须配置,不然定时工作执行报错都不晓得,几乎要命。一般来说下,倡议有工夫的胖友,批改下 XXL-JOB 的源码,把钉钉告警接入。
xxl.job.accessToken:调度核心通信令牌,倡议填写。尽管说,内网个别很平安,然而以防万一,并且又没啥老本,间接给整上。
4.4 批改日志配置文件

关上 xxl-job-admin 模块,批改
src/main/resources/logback.xml 配置文件。如下:

散布式调度平台 XXL-JOB 极简入门
默认状况下,日志输入的地址是 /data/applogs/xxl-job/xxl-job-admin.log。能够依据本人的须要,进行调整。
4.5 IDEA 启动调度核心

在开始编译源码之前,咱们先间接应用 XxlJobAdminApplication 类,运行启动调度核心。这样,防止咱们前面编译源码,进行打包查出来的 jar 包,后果配置文件不对的难堪。

当看到如下日志,代表启动胜利:

散布式调度平台 XXL-JOB 极简入门
启动胜利后,浏览器
http://127.0.0.1:8080/xxl-job… 地址,并应用默认 “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/123456” 进行登录。如果登录胜利,阐明咱们曾经配置正确啦。

另外,启动实现之后,记得去「用户治理」菜单,批改下管理员的明码

4.8 搭建集群

在生产环境下,肯定要部署 XXL-JOB 调度核心的集群,晋升调度零碎容灾和可用性。

调度核心集群部署时,几点要求和倡议:

DB 配置保持一致;
集群机器时钟保持一致(单机集群漠视);
举荐通过 Nginx 为调度核心集群做负载平衡,调配域名。调度核心拜访、执行器回调配置、调用 API 服务等操作均通过该域名进行。
总结
基于 xxl-job 的泛滥低劣个性,该技术在理论利用中也颇受欢迎,比方:因为购物车采纳的是同步操作 redis,异步操作 mysql。即便 mysql 操作失败,只有 redis 操作胜利,仍然不影响性能的应用。然而,如果不进行定期的数据同步解决,则可能导致 mysql 数据存在重大偏差,失去了数据分析价值。所以能够应用 xxl-job 定时同步购物车数据。

理解更多编程技术相干内容欢送关注尚硅谷官网账号!

关键词:java 培训

正文完
 0