分布式任务调度系统

勤奋不是嘴上说说而已,而是实际的行动,在勤奋的苦度中持之以恒,永不退却。业精于勤,荒于嬉;行成于思,毁于随。在人生的仕途上,我们毫不迟疑地选择勤奋,她是几乎于世界上一切成就的催产婆。只要我们拥着勤奋去思考,拥着勤奋的手去耕耘,用抱勤奋的心去对待工作,浪迹红尘而坚韧不拔,那么,我们的生命就会绽放火花,让人生的时光更加的闪亮而精彩。

导读:本篇文章讲解 分布式任务调度系统,希望对大家有帮助,欢迎收藏,转发!站点地址:www.bmabk.com,来源:原文

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

参考

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

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。

文章由极客之音整理,本文链接:https://www.bmabk.com/index.php/post/142358.html

(0)
飞熊的头像飞熊bm

相关推荐

发表回复

登录后才能评论
极客之音——专业性很强的中文编程技术网站,欢迎收藏到浏览器,订阅我们!