分布式任务调度系统

本文所说分布式调度中心,等同于分布式定时任务。单机环境下,可以参考Java基础之定时任务调度

同样地,Linux系统也有这一概念,参考我的博文Linux学习之定时任务

定时器技术

crontab

crontab是类UNIX系统的一个命令,用于设置需要周期性执行的指令,有对应的crontab文件。crontab储存的指令被守护进程crond激活。分为两类:

  • 系统任务调度:系统级别,存在/etc/etc下子目录,管理员编辑权限;
  • 用户任务调度,用户级别, 存在/var/spool/cron目录下,文件名与用户名一致。

crontab文件的配置格式:

crontab的命令行常用选项:

JDK Timer

单线程,Timer类,TimerTask类及其几种任务调度方法;
缺陷:
时间不准确延迟:
异常终止:
执行周期任务时依赖系统时间:

ScheduledExecutor

基于线程,实现类ScheduledThreadPoolExecutor,是一个线程池,常用的4种调度方式:

相对于Timer的优势:

  • 并发执行
  • 线程隔离
  • 与系统时间无关
  • 执行过程中抛出异常则会终止,不会影响其他任务,业务层捕获异常

spring scheduler

TaskExecutor、TaskScheduler、Trigger三个抽象接口,

问题

在使用Spring @Scheduled时,遇到的一个报错:
spring schedule issue IllegalStateException: Encountered invalid @Scheduled method '': For input string
把注解的cron表达式:@Scheduled(cron = "0 /10 * * * ?")修改为@Scheduled(cron = "0 0/10 * * * ?"),解决问题。

Quartz

Job、JobDetail、Trigger、Scheduler;
quartz整合spring;
quartz整合spring boot;

cron表达式

分布式需求

业务量大,数据量大,节点多等等情况促成分布式定时任务的产生。其核心问题:某个定时任务在一个触发时刻仅有一台服务器在运行。
解决方案:

  1. 单服务器执行所有任务,pass(单点故障,任务量大,效率不够……)
  2. 配置参数分散运行,增加运维管理配置参数的难度,单点问题依然存在。
  3. 全局锁互斥执行,抢占执行,某个节点获取到任务key对应的锁,则执行任务,否则不执行,解决多节点重复执行的问题。
    分布式定时任务的处理方式:抢占式、协同式;
    特点:高可用性,可伸缩性,负载均衡,失效转移;
    核心:分布式锁,利用互斥来防止彼此干扰来保证一致性。

分布式锁的三种实现方式:

  1. 基于数据库;
  2. 基于redis;
  3. 基于zookeeper,简称zk;

zk,内部是一个分层的文件系统目录树结构,规定在同一个目录下面只能有一个唯一文件名。节点类型:永久节点,临时节点,顺序节点。监视器watcher。实现分布式锁的步骤:

开源产品

quartz分布式

只有使用JobStore的quartz才具有集群功能。jar包里面有数据库脚本,表明和作用略(12张表),quartz.propertiesspring-quartz.xml配置文件;quartz通过数据库实现分布式锁机制。表QRTZ_LOCKS,行锁表,悲观锁;两种存储方式,RAMJobStore(内存),以及JobStoreSupport(JDBC,数据库)。
被错过执行的job,misfired job,可能的原因:

  1. 系统重启;
  2. Trigger被暂停(suspend);
  3. 线程池中所有的线程都被占用,导致任务无法被触发执行;
  4. 有状态任务(StatefulJob)在下次触发时间到达时,上次的任务还没有结束。
    应对策略:

spring batch?

XXL-JOB

个人开源,主要分为调度中心和执行器两部分,调度中心在启动初始化时,会默认生成执行器的RPC代理。对象(http协议调用),执行器项目启动之后,调度中心在触发定时器之后通过jobHandle 来调用执行器项目里面的代码。
参考分布式任务系统XXL-JOB

ElasticJob

Github:https://github.com/apache/shardingsphere-elasticjob
官站:https://shardingsphere.apache.org/elasticjob/index_zh.html
ElasticJob是当当网基于Quartz + ZooKeeper二次开发后的分布式调度解决方案,包括两个相对独立的子项目,一般只用Elastic-Job-Lite:

  • Elastic-Job-Lite:定位为轻量级无中心化解决方案,使用jar包的形式提供分布式任务的协调服务
  • Elastic-Job-Cloud:使用Mesos + Docker(TBD)的解决方案,额外提供资源治理、应用分发以及进程隔离等服务

亮点:

  • 基于Quartz定时任务框架为基础的,具备Quartz的大部分功能
  • 使用zk做协调&调度中心,轻量级
  • 支持任务分片
  • 支持弹性扩容,可水平扩展 , 当任务再次运行时,会检查当前的服务器数量,重新分片,分片结束之后才会继续执行任务
  • 失效转移,容错处理,当一台调度服务器宕机或跟zk断开连接之后,会立即停止作业,然后再去寻找其他空闲的调度服务器,来运行剩余的任务
  • 提供运维界面,可以管理作业和注册中心

ElasticJob-Lite 的架构设计:
在这里插入图片描述
ElasticJob没有调度中心这一概念,而是使用ZK作为注册中心,注册中心负责协调分配任务到不同的节点上。ElasticJob中的定时调度都是由执行器自行触发,去中心化设计(调度和处理都是执行器单独完成)。

@Component
@ElasticJobConf(name = "dayJob", cron = "0/10 * * * * ?", shardingTotalCount = 2,
        shardingItemParameters = "0=AAAA,1=BBBB", description = "简单任务", failover = true)
public class TestJob implements SimpleJob {
    @Override
    public void execute(ShardingContext shardingContext) {
        log.info("TestJob任务名:【{}】, 片数:【{}】, param=【{}】", shardingContext.getJobName(), shardingContext.getShardingTotalCount(), shardingContext.getShardingParameter());
    }
}

优缺点:
优点:可与 Spring 集成、支持分布式、支持集群、性能不错
缺点:依赖额外的中间件如 Zookeeper,复杂度增加,可靠性降低、维护成本变高

TBSchedule

Azkaban

参考Azkaban入门笔记,LinkedIn开源的分布式工作流调度框架,目地在于解决Hadoop Jop依赖管理问题,但实际已经是一个通用的工作流调度框架,适用于不同业务场景。重心则在工作流调度,通过DSL语法定义工作流,支持子工作流,子工作流可以在主工作流中调度,也可单独调度。

Airflow

Airbnb开源的一款数据流程工具,Apache顶级项目。以非常灵活的方式来支持数据的ETL过程,支持非常多的插件来完成诸如HDFS监控、邮件通知等功能。Airflow支持单机和分布式两种模式,支持Master-Slave模式,支持Mesos等资源调度,有非常好的扩展性。基于Dag也可以定义复杂的工作流,属于Python技术栈。

Apache DolphinScheduler

对比

功能xxl-jobAzkabanAirflow
licenseGNU General Public License v3.0Apache License V2.0Apache License V2.0
调度模块QuartzQuartz自实现
调度中心HA支持,Quartz集群不支持不支持
执行器HA支持支持支持
业务耦合度高,业务逻辑在执行器中实现低,与实际业务无耦合低,与实际业务无耦合
Job类型Java、Shell、Python、NodeJS、PHP、PowerShellCommand、HadoopShell、Java、HadoopJava、Pig、Hive等,支持插件式扩展Python、Bash、HTTP、MySQL等,支持Operator的自定义扩展
Executor触发RPCRestfulRestful
工作流无,可配置任务级联触发支持,自定义DSL语法支持,基于Python DAG
管理界面简单但不美观简单,美观程度略胜于xxl-job,整体功能逻辑清晰,上手简单该有的功能都有,但是就是让你用得不爽。
部署运维简单简单较复杂,包括WebServer、Scheduler、Worker和Flower(可选)
单点故障Web Server存在单点故障风险Scheduler存在单点故障风险

参考

Java任务调度
Linux学习之进程调度
Azkaban、Xxl-Job与Airflow对比分析

posted @ 2018-08-27 21:44  johnny233  阅读(48)  评论(0编辑  收藏  举报  来源