本文所说分布式调度中心,等同于分布式定时任务。单机环境下,可以参考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表达式
分布式需求
业务量大,数据量大,节点多等等情况促成分布式定时任务的产生。其核心问题:某个定时任务在一个触发时刻仅有一台服务器在运行。
解决方案:
- 单服务器执行所有任务,pass(单点故障,任务量大,效率不够……)
- 配置参数分散运行,增加运维管理配置参数的难度,单点问题依然存在。
- 全局锁互斥执行,抢占执行,某个节点获取到任务key对应的锁,则执行任务,否则不执行,解决多节点重复执行的问题。
分布式定时任务的处理方式:抢占式、协同式;
特点:高可用性,可伸缩性,负载均衡,失效转移;
核心:分布式锁,利用互斥来防止彼此干扰来保证一致性。
分布式锁的三种实现方式:
- 基于数据库;
- 基于redis;
- 基于zookeeper,简称zk;
zk,内部是一个分层的文件系统目录树结构,规定在同一个目录下面只能有一个唯一文件名。节点类型:永久节点,临时节点,顺序节点。监视器watcher。实现分布式锁的步骤:
开源产品
quartz分布式
只有使用JobStore的quartz才具有集群功能。jar包里面有数据库脚本,表明和作用略(12张表),quartz.properties
,spring-quartz.xml
配置文件;quartz通过数据库实现分布式锁机制。表QRTZ_LOCKS,行锁表,悲观锁;两种存储方式,RAMJobStore(内存),以及JobStoreSupport(JDBC,数据库)。
被错过执行的job,misfired job,可能的原因:
- 系统重启;
- Trigger被暂停(suspend);
- 线程池中所有的线程都被占用,导致任务无法被触发执行;
- 有状态任务(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存在单点故障风险 |
参考
版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。
文章由极客之音整理,本文链接:https://www.bmabk.com/index.php/post/142358.html