1. 分布式任务调度概述

1.1 什么是任务调度

定时任务调度是指基于给定的时间点,给定的时间间隔又或者给定执行次数自动的执行任务。

1.2 为什么需要任务调度平台

随着系统规模的发展,定时任务数量日益增多,任务也变得越来越复杂,尤其是在分布式环境下,存在多个业务系统,每个业务系统都有定时任务的需求,如果都在自身系统中调度,一方面增加业务系统的复杂度,另一方面也不方便管理,因此需要有一个任务平台对分散的任务进行统一管理调度。

基于目前的情况,任务平台需要支持以下几个方面:

  • 任务统一管理,提供图形化界面对任务进行配置和调度。
  • 任务并发控制,同一个任务在同一时间只能允许一个执行。
  • 任务弹性扩容,可根据繁忙情况动态增减服务器分摊压力,对大任务进行分片处理。
  • 任务依赖问题,能够处理任务包含子任务的情况,前一个完成后触发子任务执行。
  • 支持多类型的任务,支持 Spring Bean、Shell 等。
  • 任务节点高可用,任务节点异常或者繁忙时能够转移到其他节点执行。
  • 调度中心高可用,支持集群部署,避免出现单点故障。
  • 执行状态监控,方便查看任务执行状态,异常情况告警,支持多渠道通知。

1.3 定时任务发展史

定时任务随着技术发展,从单线程调度到多线程调度,从单机部署到集群部署,从独立执行到多任务协同执行。
分布式任务调度常见的几种解决方案 - 图1

  • 第一阶段:
    • 单线程调度,在 Java1.5之前,基于线程的等待 ( sleep 或 wait ) 机制定时执行,需要开发者实现调度逻辑,单个线程 ( Thread ) 处理单个任务有些浪费,但是一个线程 ( Timer ) 处理多个任务容易因为某个任务繁忙导致其他任务阻塞。
  • 第二阶段:
    • 线程池调度,在 Java1.5 开始提供 ScheduledExecutorService 调度线程池,调度线程池支持固定的延时和固定间隔模式,对于需要在某天或者某月的时间点执行就不大方便,需要计算时间间隔,转换成启动延时和固定间隔,处理起来比较麻烦。
  • 第三阶段:
    • Spring 任务调度,Spring 简化了任务调度,通过 @Scheduled 注解支持将某个 Bean 的方法定时执行,除了支持固定延时和固定间隔模式外,还支持 cron 表达式,使得定时任务的开发变得极其简单。
  • 第四阶段:
    • Quartz 任务调度,在任务服务集群部署下,Quartz 通过数据库锁,实现任务的调度并发控制,避免同一个任务同时执行的情况。Quartz 通过 Scheduler 提供了任务调度 API,开发可以基于此开发自己的任务调度管理平台。
  • 第五阶段:
    • 分布式任务平台,提供一个统一的平台,无需再去做和调度相关的开发,业务系统只需要实现具体的任务逻辑,自动注册到任务调度平台,在上面进行相关的配置就完成了定时任务的开发。

2. 常见的解决方案

现在分布式下任务调度有很多解决方案,可以基于 Quartz 开发任务管理平台,也可以使用开源的任务调度平台,比如 xxl-job,elastic-job。

2.1 XXL-JOB

大众点评员工徐雪里于2015年发布的分布式任务调度平台,是一个轻量级分布式任务调度框架,其核心设计目标是开发迅速、学习简单、轻量级、易扩展。现已开放源代码并接入多家公司线上产品线,开箱即用。

官方地址:https://www.xuxueli.com/xxl-job/
GitHub:https://github.com/xuxueli/xxl-job
XXL-JOB 架构图:https://github.com/xuxueli/xxl-job/blob/master/doc/XXL-JOB架构图.pptx
分布式任务调度常见的几种解决方案 - 图2

2.2 ELASTIC-JOB

当当开发的弹性分布式任务调度系统,功能丰富强大,采用 zookeeper 实现分布式协调,实现任务高可用以及分片,并且可以支持云开发,由两个相互独立的子项目 Elastic-Job-Lite 和 Elastic-Job-Cloud 组成。

官方地址:https://shardingsphere.apache.org/elasticjob/
GitHub:https://github.com/apache/shardingsphere-elasticjob
分布式任务调度常见的几种解决方案 - 图3

2.3 方案对比

分布式任务调度常见的几种解决方案 - 图4

来源: https://mp.weixin.qq.com/s/c72kmleRNen54yLkSCDB7w