微服务之任务调度工具

引言

在微服务架构中,任务调度是一个不可或缺的组成部分。随着系统规模的扩大和业务复杂度的增加,如何高效、可靠地管理和执行定时任务成为了一个关键问题。本文将探讨微服务架构中任务调度的需求,分析常用任务调度工具的优缺点及其适用场景,并详细介绍Java微服务中常用的任务调度工具的部署和使用步骤,以及在实际应用中可能遇到的问题。

1.微服务为什么需要任务调度?

在单体应用中,任务调度通常由单一的任务调度框架(如Quartz)来管理。然而,在微服务架构中,服务被拆分为多个独立的、可独立部署的小服务,每个服务可能都有自己的任务调度需求。这种分布式特性带来了以下几个挑战:

  1. 任务分散:任务可能分布在多个服务中,如何统一管理和调度这些任务成为一个难题。

  2. 高可用性:微服务架构要求系统具备高可用性,任务调度工具也需要支持分布式部署,避免单点故障。

  3. 弹性扩展:随着业务量的增加,任务调度工具需要能够动态扩展,以应对高并发的任务执行需求。

  4. 任务依赖:在微服务架构中,任务之间可能存在依赖关系,任务调度工具需要支持复杂的任务依赖管理。

因此,选择一个适合微服务架构的任务调度工具至关重要。

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. 选型建议

  • 单机/轻量级场景 :优先选择 QuartzXXL-JOB(如需Web界面)。

  • 分布式分片任务 :选择 Elastic JobXXL-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

  1. /xxl-job/xxl-job-admin/src/main/resources/application.properties
  2. 修改数据库配置,其他的自己选择
复制代码
### 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
[email protected]
[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
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下不通

  • 排查过程:

    • 确保执行器服务正常运行。
    • 检查执行器配置文件中的注册中心地址和端口是否正确。
    • 确保调度中心和执行器之间的网络连接正常。
  • 解决办法:

    • 重启执行器服务。
    • 检查执行器配置文件中的注册中心配置。
    • 检查防火墙设置,确保调度中心可以正常连接执行器。

对于端口拒绝连接的问题,应该是网络的问题,记得开放端口,设置下防火墙

相关推荐
Freeking102410 分钟前
【Spring】依赖注入的方式:构造方法、setter注入、字段注入
java·后端·spring
东方芷兰2 小时前
Javase 基础入门 —— 02 基本数据类型
java·开发语言·笔记·spring·intellij-idea·idea
xxy!7 小时前
Spring 框架中用到的设计模式
java·spring·设计模式
l软件定制开发工作室10 小时前
Spring开发系列教程(26)——异步处理
java·后端·spring
攒了一袋星辰11 小时前
Spring如何通过XML注册Bean
xml·java·spring
yuren_xia11 小时前
示例:spring xml+注解混合配置
xml·java·spring
Freeking102413 小时前
【Spring】单例模式的创建方式(Bean解析)
java·spring·单例模式
写bug写bug13 小时前
掌握 Spring 框架这 10 个扩展点,让你的能力更上一层楼
java·后端·spring
十秒耿直拆包选手14 小时前
spring:加载配置类
java·前端·spring
蒂法就是我14 小时前
Spring 事务实现原理,Spring 的 ACID是如何实现的?如果让你用 JDBC 实现事务怎么实现?
数据库·sql·spring