定义定时任务框架优劣势对比

2022-12-30 宋洋葱 宋洋葱

单机定时任务

1. Spring Task

通过 Spring 提供的 @Scheduled 注解即可定义定时任务.

/**
 * cron:使用Cron表达式。 每分钟的1,2秒运行
 */
@Scheduled(cron = "1-2 * * * * ? ")
public void reportCurrentTimeWithCronExpression() {
  log.info("Cron Expression: The time is now {}", dateFormat.format(new Date()));
}

2. node-schedule

const schedule = require('node-schedule');
const  scheduleCronstyle = ()=>{ 
    schedule.scheduleJob('30 * * * * *',()=>{console.log('scheduleCronstyle:' + new Date());}); 
}
scheduleCronstyle();

分布式

1. Quartz

不考虑:使用繁琐,只能依靠 API,不够优雅。分布式支持不友好,没有内置 UI 管理控制台、使用麻烦。

2. TBSchedule

不考虑:基于 Java 中的 Timer 实现,一个 Timer 一个线程,这就导致 Timer 的任务的执行只能串行执行,一个任务执行时间过长的话会影响其他任务(性能非常差)。

3. Elastic-Job

最初由当当网开源,之后成为 Apache ShardingSphere 的子项目。

4. Saturn

Saturn 是唯品会在当当开源的 Elastic Job 基础上开发而来。

5. XXL-JOB

学习简单、轻量级,但问题比较多。

6. PowerJob

无锁化设计、基于时间轮实现,性能高。提供分布式计算、工作流等额外功能。

优劣势对比

xxl-jobSaturnElastic-JobPowerJob
定时类型CRONCRONCRONCRON、固定频率、固定延迟、OpenAPI
任务类型内置Java、GLUE Java、Shell、Python等脚本内置Java、Java/Go/C++/PHP/Python/Ruby/shell等脚本内置Java、Shell、Python等脚本内置Java、外置Java(容器)、Shell、Python等脚本
分布式任务静态分片静态分片静态分片MapReduce 动态分片
在线任务治理支持cloud 版本支持支持
日志白屏化支持不支持支持
调度方式及性能基于数据库锁,有性能瓶颈基于数据库锁,有性能瓶颈基于数据库锁,有性能瓶颈无锁化设计,性能强劲无上限
报警监控邮件邮件、企业微信、钉钉邮件,提供接口允许开发者扩展
系统依赖MySQLJDK 7 or 8Maven node.js npmdockerZooKeeperMySQLzk\java\maven任意 Spring Data Jpa支持的关系型数据库(MySQL、Oracle…)
DAG 工作流不支持不支持不支持支持
最新开源版本近 7 月内2020 年近 2 个月内近 2 个月内
star 数23.3k7.8k4.4k
优点1. 运维成本高2. 最新版到 2020 年1. 接入简单,仅依赖 zk。2. 比较稳定,bug 少。3. 背靠 Apache 和 当当接入业务非常方便,几乎不需要额外开发。
缺点需要部署独立的运维平台1. 仅提供 sdk 接入业务需要一定的开发量个人开源项目(前阿里 SchedulerX 主力开发)

参考文档

  1. Java 定时任务框架大揭秘
  2. 使用 Scheduler
  3. java 中的定时任务框架
  4. tbschedule 由 Alibaba 开源的分布式调度框架
  5. 分布式定时任务框架选型