定时任务框架-分布式(xxl-job)

1,138 阅读5分钟

简介

在平时的业务场景中,经常有一些场景需要使用定时任务,比如:

  • 时间驱动的场景:某个时间点发送优惠券,发送短信等等
  • 批量处理数据:批量统计上个月的账单,统计上个月销售数据等等
  • 固定频率的场景:每隔5分钟需要执行一次

所以定时任务在平时开发中并不少见,而且对于现在快速消费的时代,每天都需要发送各种推送消息都可以依赖定时任务去完成,应用非常广泛。

XXL-JOB是一个轻量级分布式任务调度平台,其核心设计目标是开发迅速、学习简单,轻量级、易扩展。现已开放源代码并接入多家公司线上产品线,开箱即用。

官网:https://www.xuxueli.com/xxl-job/

从架构图可以看出,分别有调度中心和执行器两大组成部分。

  1. 调度中心:负责管理调度信息,按照调度配置发出调度请求,自身不承担业务代码。支持可视化界面,可以在调度中心对任务进行新增,更新,删除,会实时生效。支持监控调度结果,查询执行日志,查看调度任务统计报表,任务失败告警等等。
  2. 执行器:负责接收调度请求,执行调度任务的业务逻辑。执行器启动后需要注册到调度中心。接收调度中心的发出的执行请求,终止请求,日志请求等等。

接下来我们看一下XXL-JOB的工作原理。

  • 任务执行器根据配置的调度中心的地址,自动注册到调度中心
  • 达到任务触发条件,调度中心下发任务
  • 执行器基于线程池执行任务,并把执行结果放入内存队列中,把执行日志写入日志文件中
  • 执行器的回调线程消费内存队列中的执行结果,主动上报给调度中心
  • 当用户在调度中心查看任务日志,调度中心请求任务执行器,任务执行器读取任务日志文件并返回日志详情

XXL-JOB设计思想

设计思想:

  • 将调度行为抽象形成“调度中心”公共平台,而平台自身并不承担业务逻辑,“调度中心”负责发起调度请求
  • 将任务抽象成分散的JobHandler,交由“执行器”统一管理,“执行器”负责接收调度请求并执行对应的JobHandler中业务逻辑

因此,“调度”和“任务”两部分可以互相解耦,提高系统整体稳定性和扩展性。

1.下载源码

GitHub下载地址:github.com/xuxueli/xxl…

Gitee下载地址:gitee.com/xuxueli0323…

2.初始化数据库

  • 执行tables_xxl_job.sql文件初始化

  • 调度中心支持集群部署,集群情况下各节点务必连接同一个mysql实例;

  • 如果mysql做主从,调度中心集群节点务必强制走主库;

  • xxl_job_lock:任务调度锁表;

  • xxl_job_group:执行器信息表,维护任务执行器信息;

  • xxl_job_info:调度扩展信息表: 用于保存XXL-JOB调度任务的扩展信息,如任务分组、任务名、机器地址、执行器、执行入参和报警邮件等等;

  • xxl_job_log:调度日志表: 用于保存XXL-JOB任务调度的历史信息,如调度结果、执行结果、调度入参、调度机器和执行器等等;

  • xxl_job_log_report:调度日志报表:用户存储XXL-JOB任务调度日志的报表,调度中心报表功能页面会用到;

  • xxl_job_logglue:任务GLUE日志:用于保存GLUE更新历史,用于支持GLUE的版本回溯功能;

  • xxl_job_registry:执行器注册表,维护在线的执行器和调度中心机器地址信息;

  • xxl_job_user:系统用户表;

3.配置部署 调度中心

调度中心项目:xxl-job-admin

作用:统一管理任务调度平台上调度任务,负责触发调度执行,并且提供任务管理平台。

3.1主要修改配置

  • 修改数据源

  • 修改报警邮箱

  • 调度中心通讯TOKEN

    #xxl-job, datasource spring.datasource.url=jdbc:mysql://localhost:3306/xxl_job?useUnicode=true&characterEncoding=UTF-8&autoReconnect=true&serverTimezone=Asia/Shanghai spring.datasource.username=root spring.datasource.password=root spring.datasource.driver-class-name=com.mysql.cj.jdbc.Driver

    #xxl-job, email spring.mail.host=smtp.qq.com spring.mail.port=25 spring.mail.username=xxx@qq.com spring.mail.from=xxx@qq.com spring.mail.password=你的mail token 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

    #调度中心通讯TOKEN [选填]:非空时启用; #xxl-job, access token xxl.job.accessToken=wpztoken

3.2.打包部署 调度中心

mvn clean package -Dmaven.test.skip=true

3.3.访问调度中心

调度中心访问地址:http://localhost:8080/xxl-job-admin (该地址执行器配置文件xxl.job.admin.addresses将会使用到,作为回调地址)

默认登录账号 “admin/123456”,登录后运行界面如下所示:

XXL-JOB 任务执行原理

任务调度中心发送任务执行请求

任务发送执行的操作有两种:

(1)根据配置的corn表达式周期性执行相关任务

(2)在任务调度中心主动执行任务

任务执行过程分析 :blog.csdn.net/qq924862077…

                                www.jianshu.com/p/f58b91fd3…

常用的分布式任务调度系统

  • xxl-job:是大众点评员工徐雪里于2015年发布的分布式任务调度平台,是一个轻量级分布式任务调度框架,其核心设计目标是开发迅速、学习简单、轻量级、易扩展
  • Quartz:Java事实上的定时任务标准。但Quartz关注点在于定时任务而非数据,并无一套根据数据处理而定制化的流程。虽然Quartz可以基于数据库实现作业的高可用,但缺少分布式并行调度的功能
  • TBSchedule:阿里早期开源的分布式任务调度系统。代码略陈旧,使用timer而非线程池执行任务调度。众所周知,timer在处理异常状况时是有缺陷的。而且TBSchedule作业类型较为单一,只能是获取/处理数据一种模式。还有就是文档缺失比较严重
  • elastic-job(E-Job):当当开发的弹性分布式任务调度系统,功能丰富强大,采用zookeeper实现分布式协调,实现任务高可用以及分片,目前是版本2.15,并且可以支持云开发
  • Saturn:是唯品会自主研发的分布式的定时任务的调度平台,基于当当的elastic-job 版本1开发,并且可以很好的部署到docker容器上