xxlJob使用
1. 任务调度
1. 什么是任务调度
任务调度是为了自动完成特定任务,在约定的特定时刻去执行任务的过程。
2. 什么场景会需要任务调度
- 某电商平台需要每天上午10点,下午3点,晚上8点发放一批优惠券
- 某银行系统需要在信用卡到期还款日的前3天进行短信提醒
- 某财务系统需要每天凌晨结算前一天的财务数据
2. 分布式任务调度
1. 什么是分布式任务调度
采用分布式架构,一个服务往往会部署多个冗余实例来运行我们的业务,在这种分布式系统环境下运行任务调度,我们称之为分布式任务调度
2. 为什么需要分布式任务调度
使用spring提供的@scheduled,也能实现调度的功能,为什么还需要分布式任务调度的呢?
- 高可用:单机版的任务调度只能在一台机器上运行,程序出现异常后会导致服务不可用。
- 防止任务重复执行。当部署了多台服务,同一个定时任务需要控制在同一时间内,只有一个任务在执行。
- 单机处理存在极限。即使可以通过多线程提高单机的处理效率但能力依旧有限(CPU,内存,硬盘),依旧存在处理不过来的场景
2. xxl-Job
1. 定义
xxlJob是一个轻量级分布式任务调度平台
2. 设计思想
- 将调度行为抽象形成“调度中心”公共平台,而平台自身并不承担业务逻辑,“调度中心”负责发起调度请求。
- 将任务抽象成分散的JobHandler,交由“执行器”统一管理,“执行器”负责接收调度请求并执行对应的JobHandler中业务逻辑。
- 因此,“调度”和“任务”两部分可以相互解耦,提高系统整体稳定性和扩展性;
3. 系统组成
调度模块(调度中心):
负责管理调度信息,按照调度配置发出调度请求,自身不承担业务代码。
调度系统与任务解耦,提高了系统可用性和稳定性,同时调度系统性能不再受限于任务模块;
支持可视化、简单且动态的管理调度信息,包括任务新建,更新,删除,GLUE开发和任务报警等,所有上述操作都会实时生效,同时支持监控调度结果以及执行日志,支持执行器Failover。执行模块(执行器):
负责接收调度请求并执行任务逻辑。任务模块专注于任务的执行等操作,开发和维护更加简单和高效;
接收“调度中心”的执行请求、终止请求和日志请求等。
3. 如何自己去实现一个XXL JOb
1. 需求分析
- 任务调度:支持定时任务、延迟任务和周期性任务。
- 任务执行:任务分发给不同的执行节点。
- 任务管理:支持任务的增加、删除、修改、暂停和恢复。
- 监控和日志:记录任务执行情况和日志,便于监控和调试。
- 高可用性:保证调度系统的高可用性和可靠性。
2. 系统设计
- 调度中心:
- 负责任务的调度、分发和管理。
- 维护任务的元数据和调度策略。
- 提供管理界面(Web 界面)用于任务的增删改查。
- 执行器:
- 接收调度中心分发的任务并执行。
- 反馈任务的执行状态和日志到调度中心。
- 通信机制:
- 调度中心和执行器之间需要一个可靠的通信机制,常见的有 HTTP、RPC 等。
3. 技术选型
- 编程语言:Java 是一个不错的选择,因为 XXL-JOB 本身就是基于 Java 实现的,且 Java 有丰富的生态支持。
- 持久化存储:MySQL 用于存储任务元数据和执行日志。
- 通信协议:RESTful API 或者 gRPC。
- 调度框架:Quartz,可以用来实现复杂的调度策略。
- 监控与日志:Logback 或 Log4j2 记录日志,Prometheus 和 Grafana 用于监控。
4. 具体实现步骤
1. 创建调度中心
- 任务管理接口:提供增删改查任务的 API。
- 任务调度模块:使用 Quartz 来调度任务,并实现任务的分发。
- 任务监控与日志模块:记录任务执行的日志和状态,提供监控接口。
2. 执行器实现
- 任务执行接口:实现一个 HTTP 或 RPC 接口,用于接收调度中心分发的任务。
- 任务执行逻辑:根据任务的定义执行具体的任务逻辑,并反馈执行结果和日志。
3. 调度和执行流程
- 任务调度:Quartz 触发任务调度后,通过 HTTP 或 RPC 调用执行器的任务执行接口。
- 任务执行反馈:执行器在完成任务后,将结果和日志反馈给调度中心,调度中心更新任务状态和日志。
4. 高可用设计
- 调度中心高可用:通过多实例部署和负载均衡实现高可用。
- 执行器高可用:执行器也是多实例部署,调度中心根据负载均衡策略选择合适的执行器。
五、部署与运维
- 使用 Docker 容器化调度中心和执行器。
- 使用 Kubernetes 实现调度中心和执行器的高可用部署。
- 使用ELK监控日志
4 Spring Boot 集成 XXL-JOB
参考快速入门
1. 配置运行调度中心(xxl-job-admin)
- 首先从源码仓库中下载代码
- 执行doc/db
目录下有数据库脚本
tables_xxl_job.sql,初始化调度数据库xxl_job
- 修改 xxl-job-admin 的配置文件,主要是修改数据源信息,若需要用到邮件报警功能,需要配置邮箱
- 启动XxlJobAdminApplication,正常启动后,访问地址为:
http://localhost:8080/xxl-job-admin
,默认的账户为 admin,密码为 123456,
2. 配置运行执行器项目(xxl-job-executor)
添加依赖
1
implementation 'com.xuxueli:xxl-job-core:2.3.0'
加入配置
1 |
|
- 在 config 包下创建
XxlJobConfig
类
1 |
|
- 编写 JobHandler
1 |
|
3. BEAN模式测试
BEAN模式执行器:每个执行器都是Spring的一个Bean实例,XXL-JOB通过注解 @XxlJob
的方式进行任务开发;
- 编写 JobHandler
1 |
|
- 在执行器管理页面添加该执行器。
- 在任务管理界面添加我们刚才开发的任务,运行模式选择BEAN
- 在操作页面,点击执行一次
4. GLUE(Java)模式测试
- 在任务管理界面添加一个新任务,运行模式选择BEAN
- 编辑需要执行的代码
- 在操作页面,点击执行一次
- 执行日志打印
需要使用XxlJobHelper.log
打印执行日志;
xxlJob使用
http://example.com/xxlJob使用/