微服务之任务调度工具
引言
在微服务架构中,任务调度是一个不可或缺的组成部分。随着系统规模的扩大和业务复杂度的增加,如何高效、可靠地管理和执行定时任务成为了一个关键问题。本文将探讨微服务架构中任务调度的需求,分析常用任务调度工具的优缺点及其适用场景,并详细介绍Java微服务中常用的任务调度工具的部署和使用步骤,以及在实际应用中可能遇到的问题。
1.微服务为什么需要任务调度?
在单体应用中,任务调度通常由单一的任务调度框架(如Quartz)来管理。然而,在微服务架构中,服务被拆分为多个独立的、可独立部署的小服务,每个服务可能都有自己的任务调度需求。这种分布式特性带来了以下几个挑战:
-
任务分散:任务可能分布在多个服务中,如何统一管理和调度这些任务成为一个难题。
-
高可用性:微服务架构要求系统具备高可用性,任务调度工具也需要支持分布式部署,避免单点故障。
-
弹性扩展:随着业务量的增加,任务调度工具需要能够动态扩展,以应对高并发的任务执行需求。
-
任务依赖:在微服务架构中,任务之间可能存在依赖关系,任务调度工具需要支持复杂的任务依赖管理。
因此,选择一个适合微服务架构的任务调度工具至关重要。
2.常用任务调度工具的比较
工具名称 | Quartz | Elastic Job | XXL-JOB | Apache Airflow |
---|---|---|---|---|
类型 | 单机/基于数据库的调度 | 分布式任务调度框架 | 轻量级分布式任务调度 | 工作流调度平台 |
分布式支持 | 依赖数据库,配置复杂 | 原生支持(依赖Zookeeper) | 依赖中心化调度器 | 原生支持(分布式部署) |
高可用性 | 需自行实现(数据库锁) | 支持 | 依赖数据库,存在单点风险 | 支持 |
动态任务 | 不支持(需重启应用) | 支持 | 支持 | 支持 |
任务分片 | 不支持 | 支持 | 支持 | 不支持 |
依赖管理 | 不支持 | 简单依赖 | 简单依赖 | 复杂工作流依赖 |
学习曲线 | 低(简单API) | 中(需理解分片机制) | 低(Web界面友好) | 高(需学习DAG定义) |
适用场景 | 小型项目、单机定时任务 | 中大型分布式任务 | 中小型分布式任务 | 复杂工作流、ETL调度 |
2.1. Quartz
优点:
-
成熟稳定,社区支持广泛。
-
支持复杂的任务调度策略,如Cron表达式。
-
可以与Spring框架无缝集成。
缺点:
-
单机部署时存在单点故障问题。
-
分布式部署需要依赖数据库,配置较为复杂。
-
不支持动态任务调度,任务修改后需要重启应用。
适用场景:适合小型项目或单机部署的场景,对于分布式任务调度的支持较弱。
2.2. Elastic Job
优点:
-
支持分布式任务调度,具备高可用性和弹性扩展能力。
-
提供任务分片功能,能够将大任务拆分为多个小任务并行执行。
-
支持动态任务调度,任务修改后无需重启应用。
缺点:
-
配置较为复杂,需要依赖Zookeeper进行分布式协调。
-
社区支持相对较少,文档和案例不如Quartz丰富。
适用场景:适合需要分布式任务调度和任务分片的中大型项目。
2.3. XXL-JOB
优点:
-
轻量级,易于部署和使用。
-
提供Web管理界面,方便任务的管理和监控。
-
支持动态任务调度和任务依赖管理。
缺点:
-
分布式任务调度的能力相对较弱,适合中小型项目。
-
高可用性依赖于数据库,可能存在单点故障问题。
适用场景:适合中小型项目,尤其是需要简单易用的任务调度工具的场景。
2.4. Apache Airflow
优点:
-
专注于工作流调度,支持复杂的任务依赖关系。
-
提供丰富的任务调度策略和监控功能。
-
支持分布式部署,具备高可用性。
缺点:
-
配置和使用较为复杂,学习曲线较高。
-
对于简单的定时任务调度,可能显得过于重量级。
2.5. 选型建议:
-
单机/轻量级场景:优先选择 Quartz 或 XXL-JOB(如需Web界面)。
-
分布式分片任务:选择 Elastic Job 或 XXL-JOB。
-
复杂工作流调度:Apache Airflow 是唯一选择。
-
云原生环境:可考虑 Kubernetes CronJob(简单定时任务)或 Airflow(复杂场景)。
3. 选择
公司内部项目选择使用xxl-job,学习使用成本低,有web可视化界面,社区活跃,资料多.(只是用来同步ps系统数据,和自身的数据定时刷新.)
4. xxl-job使用
4.1. 部署
4.1.1 环境依赖
- Maven3+
- Jdk17+ (说明:版本3.x开始要求Jdk17;版本2.x及以下支持Jdk1.8。如对Jdk版本有诉求,可选择接入不同版本。)
- Mysql8.0+
4.1.2 下载源码
源码下载地址:
GitHub - xuxueli/xxl-job: A distributed task scheduling framework.(分布式任务调度平台XXL-JOB)
xxl-job: 一个分布式任务调度平台,其核心设计目标是开发迅速、学习简单、轻量级、易扩展。现已开放源代码并接入多家公司线上产品线,开箱即用。
4.1.3 创建数据库
/xxl-job/doc/db/tables_xxl_job.sql
4.1.4 修改配置 application.properties
/xxl-job/xxl-job-admin/src/main/resources/application.properties
修改数据库配置,其他的自己选择
### web 界面,访问端口路径
server.port=8080
server.servlet.context-path=/xxl-job-admin
### actuator
management.server.servlet.context-path=/actuator
management.health.mail.enabled=false
### resources
spring.mvc.servlet.load-on-startup=0
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
#mybatis.type-aliases-package=com.xxl.job.admin.core.model
### xxl-job, datasource mysql数据库配置
spring.datasource.url=jdbc:mysql://101.42.40.215: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
### datasource-pool
spring.datasource.type=com.zaxxer.hikari.HikariDataSource
spring.datasource.hikari.minimum-idle=10
spring.datasource.hikari.maximum-pool-size=30
spring.datasource.hikari.auto-commit=true
spring.datasource.hikari.idle-timeout=30000
spring.datasource.hikari.pool-name=HikariCP
spring.datasource.hikari.max-lifetime=900000
spring.datasource.hikari.connection-timeout=10000
spring.datasource.hikari.connection-test-query=SELECT 1
spring.datasource.hikari.validation-timeout=1000
### 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=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
xxl.job.accessToken=default_token
### xxl-job, i18n (default is zh_CN, and you can choose "zh_CN", "zh_TC" and "en")
xxl.job.i18n=zh_CN
## xxl-job, triggerpool max size
xxl.job.triggerpool.fast.max=200
xxl.job.triggerpool.slow.max=100
### xxl-job, log retention days
xxl.job.logretentiondays=30
4.1.5 打成jar包
# 删除之前编译的 ,然后编译为可执行jar -U 更新maven依赖,根目录下
mvn clean package -U
4.1.6 上传linux ,部署jar
nohup java -jar xxl-job-admin-2.4.1-SNAPSHOT.jar &
4.1.7 调度中心集群(可选)
调度中心支持集群部署,提升调度系统容灾和可用性。
调度中心集群部署时,几点要求和建议:
- DB配置保持一致;
- 集群机器时钟保持一致(单机集群忽视);
- 建议:推荐通过nginx为调度中心集群做负载均衡,分配域名。调度中心访问、执行器回调配置、调用API服务等操作均通过该域名进行。
4.2 部署执行器(自己的服务)
4.2.1 添加依赖
<dependency>
<groupId>com.xuxueli</groupId>
<artifactId>xxl-job-core</artifactId>
<version>2.4.1-SNAPSHOT</version>
</dependency>
4.2.2 修改配置
/xxl-job/xxl-job-executor-samples/xxl-job-executor-sample-springboot/src/main/resources/application.properties
### 调度中心部署根地址 [选填]:如调度中心集群部署存在多个地址则用逗号分隔。执行器将会使用该地址进行"执行器心跳注册"和"任务结果回调";为空则关闭自动注册;
xxl.job.admin.addresses=http://127.0.0.1:8080/xxl-job-admin
### 调度中心通讯TOKEN [选填]:非空时启用;
xxl.job.admin.accessToken=default_token
### 调度中心通讯超时时间[选填],单位秒;默认3s;
xxl.job.admin.timeout=3
### 执行器AppName [选填]:执行器心跳注册分组依据;为空则关闭自动注册
xxl.job.executor.appname=xxl-job-executor-sample
### 执行器注册 [选填]:优先使用该配置作为注册地址,为空时使用内嵌服务 ”IP:PORT“ 作为注册地址。从而更灵活的支持容器类型执行器动态IP和动态映射端口问题。
xxl.job.executor.address=
### 执行器IP [选填]:默认为空表示自动获取IP,多网卡时可手动设置指定IP,该IP不会绑定Host仅作为通讯使用;地址信息用于 "执行器注册" 和 "调度中心请求并触发任务";
xxl.job.executor.ip=
### 执行器端口号 [选填]:小于等于0则自动获取;默认端口为9999,单机部署多个执行器时,注意要配置不同执行器端口;
xxl.job.executor.port=9999
### 执行器运行日志文件存储磁盘路径 [选填] :需要对该路径拥有读写权限;为空则使用默认路径;
xxl.job.executor.logpath=/data/applogs/xxl-job/jobhandler
### 执行器日志文件保存天数 [选填] : 过期日志自动清理, 限制值大于等于3时生效; 否则, 如-1, 关闭自动清理功能;
xxl.job.executor.logretentiondays=30
4.2.3 编码
仿照demo写就好
4.2.3 注册成功
4.3 官方文档
分布式任务调度平台XXL-JOB
5. 遇到问题
5.1 报错 (no protocol: 82.1
应该是配置问题 ,下面的配置 配置一个就行,要么address,address记得加上http://,或者配置下面的
xxl.job.executor.address= ### xxl-job executor server-info xxl.job.executor.ip=82.157.1.1 xxl.job.executor.port=9999
5.2 报错 (Connection refused
msg:xxl-rpc remoting error(Connection refused (Connection refused)), for url
telnet下不通
-
排查过程:
- 确保执行器服务正常运行。
- 检查执行器配置文件中的注册中心地址和端口是否正确。
- 确保调度中心和执行器之间的网络连接正常。
-
解决办法:
- 重启执行器服务。
- 检查执行器配置文件中的注册中心配置。
- 检查防火墙设置,确保调度中心可以正常连接执行器。
对于端口拒绝连接的问题,应该是网络的问题,记得开放端口,设置下防火墙