定时任务概述

一、定时任务类型选型以及技术特点

(一)、单机定时任务技术选型

1、Timer

       Timer是 JDK 1.3 开始就已经支持的一种定时任务的实现方式。Timer 内部使用一个叫做 TaskQueue 的类存放定时任务,它是一个基于最小堆实现的优先级队列。TaskQueue 会按照任务距离下一次执行时间的大小将任务排序,保证在堆顶的任务最先执行

       执行只能串行执行,一个任务执行时间过长的话会影响其他任务(性能非常差),再比如发生异常时任务直接停止(Timer 只捕获了 InterruptedException )。ScheduledThreadPoolExecutor 支持多线程执行定时任务并且功能更强大,是 Timer 的替代品。

2、ScheduledExecutorService

       ScheduledExecutorService 是一个接口,有多个实现类,比较常用的是 ScheduledThreadPoolExecutor 。ScheduledThreadPoolExecutor本身就是一个线程池,支持任务并发执行,并且其内部使用 DelayQueue 作为任务队列。 Timer、 ScheduledExecutorService 都无法使用 Cron 表达式指定任务执行的具体时间。

说明:

       Cron 表达式主要用于定时作业(定时任务)系统定义执行时间或执行频率的表达式

3、Spring Task

       通过 Spring 提供的 @Scheduled 注解即可定义定时任务。支持 Cron 表达式 ,底层是基于 JDK 的 ScheduledThreadPoolExecutor 线程池来实现的。

4、时间轮

       Kafka、Dubbo、ZooKeeper、Netty 、Caffeine 、Akka 中都有对时间轮的实现。

       时间轮简单来说就是一个环形的队列(底层一般基于数组实现),队列中的每一个元素(时间格)都可以存放一个定时任务列表时间轮中的每个时间格代表了时间轮的基本时间跨度或者说时间精度,加入时间一秒走一个时间格的话,那么这个时间轮的最高精度就是 1 秒(也就是说 3 s 和 3.9s 会在同一个时间格中)。

       时间轮比较适合任务数量比较多的定时任务场景,它的任务写入和执行的时间复杂度都是 0(1)。

(二)、分布式定时任务技术选型

通常情况下,一个定时任务的执行往往涉及到下面这些角色:

任务 : 首先肯定是要执行的任务,这个任务就是具体的业务逻辑比如定时发送文章。

调度器 :其次是调度中心,调度中心主要负责任务管理,会分配任务给执行器。

执行器 : 最后就是执行器,执行器接收调度器分派的任务并执行。

1、Quartz

       Quartz是一个很火的开源任务调度框架,完全由Java写成。Quartz 可以说是 Java 定时任务领域的老大哥或者说参考标准,其他的任务调度框架基本都是基于 Quartz 开发的比如当当网的elastic-job就是基于quartz二次开发之后的分布式调度解决方案。

        使用 Quartz 可以很方便地与 Spring 集成,并且支持动态添加任务和集群。但是,Quartz 使用起来也比较麻烦,API 繁琐。并且,Quzrtz 并没有内置 UI 管理控制台。另外Quartz在数据库层面,通过数据库的锁机制做的,有非常多的弊端比如系统侵入性严重、节点负载不均衡。有点伪分布式的味道

2、Elastic-Job

       Elastic-Job 是当当网开源的一个基于Quartz和ZooKeeper的分布式调度解决方案,由两个相互独立的子项目 Elastic-Job-Lite 和 Elastic-Job-Cloud 组成,一般我们只要使用 Elastic-Job-Lite 就好ElasticJob 支持任务在分布式场景下的分片和高可用、任务可视化管理等功能。

       Elastic-Job 没有调度中心这一概念,而是使用 ZooKeeper 作为注册中心,注册中心负责协调分配任务到不同的节点上。Elastic-Job 中的定时调度都是由执行器自行触发,这种设计也被称为去中心化设计(调度和处理都是执行器单独完成)。

官网地址:https://shardingsphere.apache.org/elasticjob/index_zh.html

3、XXL-JOB

       XXL-JOB 于 2015 年开源,是一款优秀的轻量级分布式任务调度框架,支持任务可视化管理、弹性扩容缩容、任务失败重试和告警、任务分片等功能

       XXL-JOB 由 调度中心 和 执行器 两大部分组成。调度中心主要负责任务管理、执行器管理以及日志管理。执行器主要是接收调度信号并处理。另外调度中心进行任务调度时,是通过自研 RPC 来实现的

       不同于 Elastic-Job 的去中心化设计, XXL-JOB 的这种设计也被称为中心化设计(调度中心调度多个执行器执行任务)。和 Quzrtz 类似 XXL-JOB 也是基于数据库锁调度任务,存在性能瓶颈。不过一般在任务量不是特别大的情况下,没有什么影响的,可以满足绝大部分公司的要求。

        重写 IJobHandler或者直接基于注解定义任务 可以创建自定义任务。

        XXL-JOB不支持动态添加任务(如果一定想要动态创建任务也是支持的,具体核查227)。

XXL-JOB 特性
调度模块剖析

4、PowerJob

       分布式任务调度领域的新星。目前,已经有很多公司接入比如 OPPO、京东、中通、思科。SchedulerX 属于人民币产品,PowerJob 官方也对比过其和 QuartZ、XXL-JOB 以及 SchedulerX。

总结:

       在单机下执行的,适用于比较简单的定时任务场景比如每天凌晨备份一次数据。当需要一些高级特性比如支持任务在分布式场景下的分片和高可用的话,采用分布式任务调度框架

       定时任务的技术选型 :

        XXL-JOB 2015 年推出,已经经过了很多年的考验。XXL-JOB 轻量级,并且使用起来非常简单,虽然存在性能瓶颈,但是在绝大多数情况下,对于企业的基本需求来说是没有影响的。

        PowerJob 属于分布式任务调度领域里的新星,其稳定性还有待继续考察。                ElasticJob 由于在架构设计上是基于 Zookeeper ,而 XXL-JOB 是基于数据库,性能方面的话,ElasticJob 略胜一筹。

你可能感兴趣的:(定时任务概述)