业务场景:
- 系统凌晨1点数据备份。
- 用户下单半小时未支付订单,需要自动取消订单。
- 每10min动态抓取某网站的数据。
- 博客定时发送文章。
- 每晚定时计算用户当日收益情况并推送给用户最新的数据。
分布式定时任务
Redis
- Redis过期事件监听。
- Redisson内置延时队
MQ
RocketMQ、RabbitMQ都支持定时消息
分布式任务调度框架
分布式定时任务涉及:
- 任务:具体的业务逻辑,比如定时发送文章。
- 调度器:负责任务管理,会分配任务给执行器。
- 执行器:接收调度器分派的任务并执行。
Quartz
开源任务框架,Java定时任务领域的参考标准,其他的任务调度框架基本都是基于Quartz开发的。使用Quaetz可以很方便的与Spring集成,并支持动态添加任务和集群,但是使用起来比较麻烦,API繁琐,Quartz并没有内置UI管理控制台。
优点:与Spring集成,支持动态添加任务和集群。
缺点:分布式支持不友好、不支持任务可视化管理。
Elastic-Job
- 官方网站
- GitHub地址
去中心化设计:Elastic-Job中的定时调度都是有执行器自行触发(调度和处理都是执行器单独完成)
@Component
@ElasticJobConf(name = "dayJob", cron = "0/10 * * * * ?", shardingTotalCount = 2,shardingItemParameters = "0=AAAA,1=BBBB", description = "简单任务", failover = true)
public class TestJob implements SimpleJob {@Overridepublic void execute(ShardingContext shardingContext) {log.info("TestJob任务名:【{}】, 片数:【{}】, param=【{}】", shardingContext.getJobName(), shardingContext.getShardingTotalCount(),shardingContext.getShardingParameter());}
}
优点:与Spring集成、支持分布式、支持集群、支持任务可视化管理。
缺点:依赖中间件Zookeeper(复杂度增加、维护成本变高)
XXXL-Job
支持任务可视化管理、弹性扩容缩容、任务失败重试和警告、任务分片等。
官网
从上图可以看出,XXL-JOB
由 调度中心 和 执行器 两大部分组成。调度中心主要负责任务管理、执行器管理以及日志管理。执行器主要是接收调度信号并处理。另外,调度中心进行任务调度时,是通过自研 RPC 来实现的。
不同于 Elastic-Job 的去中心化设计, XXL-JOB
的这种设计也被称为中心化设计(调度中心调度多个执行器执行任务)。
和 Quzrtz
类似 XXL-JOB
也是基于数据库锁调度任务,存在性能瓶颈。不过,一般在任务量不是特别大的情况下,没有什么影响的,可以满足绝大部分公司的要求。
只需要重写 IJobHandler
自定义任务执行逻辑,即可实现。
@JobHandler(value="myApiJobHandler")
@Component
public class MyApiJobHandler extends IJobHandler {@Overridepublic ReturnT<String> execute(String param) throws Exception {// 具体逻辑return ReturnT.SUCCESS;}
}
@XxlJob("myAnnotationJobHandler")
public ReturnT<String> myAnnotationJobHandler(String param) throws Exception {// 具体逻辑return ReturnT.SUCCESS;
}
优点:开箱即用(学习成本比较低)、与 Spring 集成、支持分布式、支持集群、支持任务可视化管理。
缺点:不支持动态添加任务(如果一定想要动态创建任务也是支持的,参见:xxl-job issue277)
SchedulerX
阿里云-- SchedulerX2.0分布式计算原理 & 最佳时间
PowerJob
目前许多大厂都已接入此框架,需要重点关注的分布式任务调度框架。
官网
项目地址
QuartZ | xxl-job | SchedulerX 2.0 | PowerJob | |
---|---|---|---|---|
定时类型 | CRON | CRON | CRON、固定频率、固定延迟、OpenAPI | CRON、固定频率、固定延迟、OpenAPI |
任务类型 | 内置 Java | 内置 Java、GLUE Java、Shell、Python 等脚本 | 内置 Java、外置 Java(FatJar)、Shell、Python 等脚本 | 内置 Java、外置 Java(容器)、Shell、Python 等脚本 |
分布式计算 | 无 | 静态分片 | MapReduce 动态分片 | MapReduce 动态分片 |
在线任务治理 | 不支持 | 支持 | 支持 | 支持 |
日志白屏化 | 不支持 | 支持 | 不支持 | 支持 |
调度方式及性能 | 基于数据库锁,有性能瓶颈 | 基于数据库锁,有性能瓶颈 | 不详 | 无锁化设计,性能强劲无上限 |
报警监控 | 无 | 邮件 | 短信 | WebHook、邮件、钉钉与自定义扩展 |
系统依赖 | JDBC 支持的关系型数据库(MySQL、Oracle…) | MySQL | 人民币 | 任意 Spring Data Jpa 支持的关系型数据库(MySQL、Oracle…) |
DAG 工作流 | 不支持 | 不支持 | 支持 | 支持 |