分布式定时任务调度框架

分布式定时任务调度框架

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

1.1 所需的功能

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

1.2 整体架构

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

2 常见的分布式调度框架

2.1 QuartZ

2.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 调度原理

策略会根据最小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定时、一次性任务、任务编排、分布式执行批量任务等功能,具备高可用、可视化、可运维、低延时等能力。
在这里插入图片描述

2.4 elastic-job

2.4.1 基本概念

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

2.4.2 调度原理

在这里插入图片描述
定时任务触发时,如需重新分片,则通过主服务器分片,分片过程中阻塞,分片结束后才可执行任务。如分片过程中主服务器下线,则先选举主服务器,再分片

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又支持分片等特殊功能。对应的概念:

JobLiteJob
Triggercron
SchedulerJobScheduler

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

2.5 xxl-job

2.5.1 基本概念

在这里插入图片描述
调度中心:一个用于发布任务的中心,可以控制任务启动和停止,已经维护监控注册和日志
执行器:用于执行任务的客户端,调度中心会根据注册执行器,按照算法分配任务执行。执行器有一个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 方案对比

在这里插入图片描述

  • 3
    点赞
  • 28
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Quartz是OpenSymphony开源组织在Job scheduling领域又一个开源项目,它可以与J2EE与J2SE应用程序相结合也可以单独使用。Quartz可以用来创建简单或为运行十个,百个,甚至是好几万个Jobs这样复杂的程序。Jobs可以做成标准的Java组件或 EJBs。 Quartz的优势: 1、Quartz是一个任务调度框架(库),它几乎可以集成到任何应用系统中。 2、Quartz是非常灵活的,它让您能够以最“自然”的方式来编写您的项目的代码,实现您所期望的行为 3、Quartz是非常轻量级的,只需要非常少的配置 —— 它实际上可以被跳出框架来使用,如果你的需求是一些相对基本的简单的需求的话。 4、Quartz具有容错机制,并且可以在重启服务的时候持久化(”记忆”)你的定时任务,你的任务也不会丢失。 5、可以通过Quartz,封装成自己的分布式任务调度,实现强大的功能,成为自己的产品。6、有很多的互联网公司也都在使用Quartz。比如美团 Spring是一个很优秀的框架,它无缝的集成了Quartz,简单方便的让企业级应用更好的使用Quartz进行任务的调度。   课程说明:在我们的日常开发中,各种大型系统的开发少不了任务调度,简单的单机任务调度已经满足不了我们的系统需求,复杂的任务会让程序猿头疼, 所以急需一套专门的框架帮助我们去管理定时任务,并且可以在多台机器去执行我们的任务,还要可以管理我们的分布式定时任务。本课程从Quartz框架讲起,由浅到深,从使用到结构分析,再到源码分析,深入解析Quartz、Spring+Quartz,并且会讲解相关原理, 让大家充分的理解这个框架框架的设计思想。由于互联网的复杂性,为了满足我们特定的需求,需要对Spring+Quartz进行二次开发,整个二次开发过程都会进行讲解。Spring被用在了越来越多的项目中, Quartz也被公认为是比较好用的定时器设置工具,学完这个课程后,不仅仅可以熟练掌握分布式定时任务,还可以深入理解大型框架的设计思想。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值