分布式定时任务调度框架

分布式定时任务调度框架

1 分布式定时任务框架设计

1.1 所需的功能

一个分布式定时任务,需要具备有以下几点功能:
1)核心功能:定时调度、任务管理、可观测日志
2)高可用:集群、分片、失败处理
3)高性能:分布式锁
4)扩展功能:可视化运维、多语言、任务编排

1.2 整体架构

一个分布式定时任务调度框架一般分为3个模块:
调度中心:负责接收并分配任务,任务调度,核心调度模块。
任务执行:负责执行任务,执行完反馈给调度中心。
监控中心:主要负责节点管理,任务队列管理,监控管理等。

2 常见的分布式调度框架

2.1 QuartZ

2.1.1 基本概念

分布式定时任务调度框架_第1张图片
JOB: 定义自己的任务
JobDetail: 封装 JOB 对象的
scheduler调度器: 管理全部的任务(Scheduler)
Trigger触发器: 开启新的线程执行任务(jobDetail)

2.1.2 调度原理

在Quartz中,线程分为Scheduler调度线程和任务执行线程。
Scheduler调度线程主要有:执行常规调度的线程和执行misfired trigger的线程。
Scheduler有一个QuartzSchedulerThread(Thread的子类)属性,在scheduler实例化的时候,实例化了一个对象,并用ThreadExecutor启动该线程对象。该线程就是调度线程,主要任务就是不停的从JobStore中获取即将被触发的触发器(默认30s调度一次)。

2.1.3 分布式锁

使用数据库分布式事务锁。
1)默认不开启悲观锁,需要在配置文件中
org.quartz.jobStore.acquireTriggersWithinLock=true
2)也可以集成redis实现分布式锁

2.2 tbschedule

2.2.1 基本概念

任务:定义某一个任务,绑定实现IScheduleTaskDealSingle或者IScheduleTaskDealMulti的任务类,同时可以通过设置任务项,将任务同一时间分片。
策略:定义执行的时间,一般采用cron表达式。绑定某个任务以及绑定机器。用于按照某个时间点分配给不同机器执行某个任务。策略可以设置线程组数量,就是使用多少给线程组来同时处理任务。
机器:监控调度机的状态。
分布式定时任务调度框架_第2张图片

2.2.2 调度原理

策略会根据最小ID的机器,分配任务执行。定时器使用Timer实现。

2.2.3 分布式锁

使用zookeeper来做分布式锁,就是机器注册zookeeper后,会查找所有策略中绑定的机器,然后写入到策略节点下面。策略会根据最小ID的机器,分配任务执行。

2.2.4 任务分片

搞清楚几个参数的作用
1)策略中的线程组:该参数是该策略总共启动多少个线程组来执行任务
2)任务中的任务项:可以按照0、1、2、3、4或者A、B、C、D等划分
3)selectTasks(String taskParameter, String ownSign, int taskItemNum, List list, int eachNum)方法
其中 List list就是分配到不同线程组的任务项。
那么任务分片就是根据设定的任务项,将其分配到不同的线程组中实现分片功能。

2.3 Schedulerx2.0

分布式任务调度SchedulerX是阿里巴巴自研的基于Akka架构的分布式任务调度平台,兼容开源XXL-JOB、ElasticJob,支持Cron定时、一次性任务、任务编排、分布式执行批量任务等功能,具备高可用、可视化、可运维、低延时等能力。
分布式定时任务调度框架_第3张图片

2.4 elastic-job

2.4.1 基本概念

elasti-job分为2独立2大块,一个是lite-core(核心去中心化的调度),一个是cloud(监控平台)。
分布式定时任务调度框架_第4张图片
schedule:是会选出一个leader,作为每次任务执行时,分配任务(包括分片)的机器
job:是真正执行任务
Simple类型作业:意为简单实现,未经任何封装的类型。需实现SimpleJob接口。该接口仅提供单一方法用于覆盖,此方法将定时执行。与Quartz原生接口相似,但提供了弹性扩缩容和分片等功能。
Dataflow类型作业:Dataflow类型用于处理数据流,需实现DataflowJob接口。该接口提供2个方法可供覆盖,分别用于抓取(fetchData)和处理(processData)数据。(类似tbschedule的seletTask)
Script类型作业:Script类型作业意为脚本类型作业,支持shell,python,perl等所有类型脚本。只需通过控制台或代码配置scriptCommandLine即可,无需编码。执行脚本路径可包含参数,参数传递完毕后,作业框架会自动追加最后一个参数为作业运行时信息。

2.4.2 调度原理

分布式定时任务调度框架_第5张图片
定时任务触发时,如需重新分片,则通过主服务器分片,分片过程中阻塞,分片结束后才可执行任务。如分片过程中主服务器下线,则先选举主服务器,再分片

2.4.3 分布式锁

使用zookeeper来做分布式锁,就是机器注册zookeeper后,会选出leader,然后做分配工作,最后执行

2.4.4 分片原理

AverageAllocationJobShardingStrategy:基于平均分配算法的分片策略,也是默认的分片策略。
OdevitySortByNameJobShardingStrategy:根据作业名的哈希值奇偶数决定IP升降序算法的分片策略。
RotateServerByNameJobShardingStrategy:根据作业名的哈希值对服务器列表进行轮转的分片策略。

2.4.5 与quartz的关系

elastic-job使用了quartz的调度机制,内部原理一致,他可以看作是quartz的一个扩展实现,使用注册中心(zookeeper)替换了quartz的jdbc数据存储方式,此外,elastic-job又支持分片等特殊功能。对应的概念:

Job LiteJob
Trigger cron
Scheduler JobScheduler

底层其实使用LiteJob 实现了quartz的Job接口,在JobScheduleController.java创建创建trigger。

2.5 xxl-job

2.5.1 基本概念

分布式定时任务调度框架_第6张图片
调度中心:一个用于发布任务的中心,可以控制任务启动和停止,已经维护监控注册和日志
执行器:用于执行任务的客户端,调度中心会根据注册执行器,按照算法分配任务执行。执行器有一个appName,与调度中心的执行器管理的appName对应,名称一致才会分配任务
任务:设置任务、执行策略、分片机制、执行器等属性,其中执行器与执行器管理中选择一个执行器名称,这样就可以分配到对应appName的执行器。

2.5.2 调度原理

  • 1、“调度中心”向“执行器”发送http调度请求: “执行器”中接收请求的服务,实际上是一台内嵌Server,默认端口9999;
  • 2、“执行器”执行任务逻辑;
  • 3、“执行器”http回调“调度中心”调度结果: “调度中心”中接收回调的服务,是针对执行器开放一套API服务;#### 2.5.3 分布式锁

2.5.4 分片原理

执行器集群部署时,任务路由策略选择”分片广播”情况下,一次任务调度将会广播触发对应集群中所有执行器执行一次任务,同时系统自动传递分片参数;可根据分片参数开发分片任务;

2.6 LTS(light-task-scheduler)

3 serverless解决方案

利用容器化,定时启动执行器,执行任务。

4 方案对比

分布式定时任务调度框架_第7张图片

你可能感兴趣的:(5,架构设计,分布式,java)