当前位置: 首页 > article >正文

微服务之任务调度工具

引言

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

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

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

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

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

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

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

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

2.常用任务调度工具的比较

工具名称QuartzElastic JobXXL-JOBApache 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

  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
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下不通

  • 排查过程:

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

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

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


http://www.kler.cn/a/549895.html

相关文章:

  • 五十天精通硬件设计第32天-S参数
  • 北京青蓝智慧科技:软考高项vs考研,谁更胜一筹?
  • DeepSeek人机对话使用教程(PC版)
  • llama.cpp将sensor格式的大模型转化为gguf格式
  • 麻将对对碰游戏:规则与模拟实现
  • 【系列专栏】银行IT的云原生架构-云单元架构 12
  • Apache Struts2 - 任意文件上传漏洞 - CVE-2024-53677
  • 大数据预处理中的数据清洗策略
  • SpringBoot 的核心只有几张图
  • 区块链可投会议CCF B--ICNP 2025 截止5.16 附2023录用率
  • GO语言中的结构体struct
  • 核货宝外贸订货系统:批发贸易企业出海的强劲东风
  • 开源AI智能名片2+1链动模式S2B2C商城小程序在社交价值挖掘中的应用与策略研究
  • KT1025A蓝牙音频芯片FM收音机的AT指令串口部分举例说明
  • 【ISO 14229-1:2023 UDS诊断全量测试用例清单系列:第十五节】
  • 【云安全】云原生-K8S(三) 安装 Dashboard 面板
  • Endnote使用笔记——持续更新
  • 如何在 Docker 环境中将宿主机的文件复制到容器目录
  • (5/100)每日小游戏平台系列
  • Session的学习