分布式定时任务框架说明

article/2025/10/10 2:24:35

分布式定时任务框架说明

  • 分布式定时任务框架说明
    • Quartz
      • 概念
      • 架构
      • 组件
      • springboot集成方式
        • 使用内存
        • 使用数据库
    • TBSchedule:
    • elastic-job
      • 概念
      • 架构
      • 组件
      • 执行流程
      • 特性
    • satum
    • xxl-job
      • 概念
      • 特性
      • 架构
      • 组件
      • 使用

分布式定时任务框架说明

Quartz

概念

  • Quartz:Java事实上的定时任务标准。但Quartz关注点在于定时任务而非数据,并无一套根据数据处理而定制化的流程。虽然Quartz可以基于数据库实现作业的高可用,但缺少分布式并行调度的功能

    优缺点:

    • 调用API的的方式操作任务,不人性化;

    • 需要持久化业务QuartzJobBean到底层数据表中,系统侵入性相当严重。

    • 调度逻辑和QuartzJobBean耦合在同一个项目中,这将导致一个问题,在调度任务数量逐渐增多,同时调度任务逻辑逐渐加重的情况加,此时调度系统的性能将大大受限于业务;

    • Quartz关注点在于定时任务而非数据,并无一套根据数据处理而定制化的流程。虽然Quartz可以基于数据库实现作业的高可用,但缺少分布式并行调度的功能。

架构

在这里插入图片描述

组件

  1. Job和JobDetail

    • Job是Quartz中的一个接口,接口下只有execute方法,在这个方法中编写业务逻辑。
    • JobDetail用来绑定Job,为Job实例提供许多属性:name、group、jobClass、jobDataMap
    • JobDetail绑定指定的Job,每次Scheduler调度执行一个Job的时候,首先会拿到对应的Job,然后创建该Job实例,再去执行Job中的execute()的内容,任务执行结束后,关联的Job对象实例会被释放,且会被JVM GC清除。
    • JobDetail定义的是任务数据,而真正的执行逻辑是在Job中。这是因为任务是有可能并发执行,如果Scheduler直接使用Job,就会存在对同一个Job实例并发访问的问题。而JobDetail & Job 方式,Sheduler每次执行,都会根据JobDetail创建一个新的Job实例,这样就可以规避并发访问的问题。
  2. Trigger
    Trigger是Quartz的触发器,会去通知Scheduler何时去执行对应Job。

    • SimpleTrigger
      SimpleTrigger可以实现在一个指定时间段内执行一次作业任务或一个时间段内多次执行作业任务。例如,指定时间触发,每隔10秒执行一次,重复10次:
    trigger = newTrigger().withIdentity("trigger3", "group1").startAt(myTimeToStartFiring)  // if a start time is not given (if this line were omitted), "now" is implied.withSchedule(simpleSchedule().withIntervalInSeconds(10).withRepeatCount(10)) // note that 10 repeats will give a total of 11 firings.forJob(myJob) // identify job with handle to its JobDetail itself                   .build();
    
    • CronTrigger
      CronTrigger功能非常强大,是基于日历的作业调度,而SimpleTrigger是精准指定间隔,所以相比SimpleTrigger,CroTrigger更加常用
  3. Scheduler
    与调度程序交互的主要API。
    Scheduler的生命期,从SchedulerFactory创建它时开始,到Scheduler调用shutdown()方法时结束;Scheduler被创建后,可以增加、删除和列举Job和Trigger,以及执行其它与调度相关的操作(如暂停Trigger)。但是,Scheduler只有在调用start()方法后,才会真正地触发trigger(即执行job),使用Scheduler之前,需要实例化。

public class MyScheduler2 {public static void main(String[] args) throws SchedulerException, InterruptedException {// 1、创建调度器SchedulerSchedulerFactory schedulerFactory = new StdSchedulerFactory();Scheduler scheduler = schedulerFactory.getScheduler();// 2、创建JobDetail实例,并与PrintWordsJob类绑定(Job执行内容)JobDetail jobDetail = JobBuilder.newJob(PrintWordsJob.class).usingJobData("jobDetail1", "这个Job用来测试的").withIdentity("job1", "group1").build();// 3、构建Trigger实例,每隔1s执行一次Date startDate = new Date();startDate.setTime(startDate.getTime() + 5000);Date endDate = new Date();endDate.setTime(startDate.getTime() + 5000);CronTrigger cronTrigger = TriggerBuilder.newTrigger().withIdentity("trigger1", "triggerGroup1").usingJobData("trigger1", "这是jobDetail1的trigger").startNow()//立即生效.startAt(startDate).endAt(endDate).withSchedule(CronScheduleBuilder.cronSchedule("* 30 10 ? * 2-6 2018")).build();//4、执行scheduler.scheduleJob(jobDetail, cronTrigger);System.out.println("--------scheduler start ! ------------");scheduler.start();System.out.println("--------scheduler shutdown ! ------------");}
}

springboot集成方式

pom中引入依赖来使用

<dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-quartz</artifactId>
</dependency>

Quartz持久化配置提供了两种存储器:

类型优点缺点
RAMJobStore不要外部数据库,配置容易,运行速度快因为调度程序信息是存储在被分配给 JVM 的内存里面,所以,当应用程序停止运行时,所有调度信息将被丢失。另外因为存储到JVM内存里面,所以可以存储多少个 Job 和 Trigger 将会受到限制
JDBC 作业存储支持集群,因为所有的任务信息都会保存到数据库中,可以控制事物,还有就是如果应用服务器关闭或者重启,任务信息都不会丢失,并且可以恢复因服务器关闭或者重启而导致执行失败的任务运行速度的快慢取决与连接数据库的快慢

使用内存

spring:datasource:quartz:driver-class-name: com.mysql.cj.jdbc.Driverurl: jdbc:mysql://localhost:3306/quartz?serverTimezone=GMT%2B8username: rootpassword: 123456# Quartz 的配置,对应 QuartzProperties 配置类quartz:job-store-type: jdbc # 使用数据库存储scheduler-name: hyhScheduler # 相同 Scheduler 名字的节点,形成一个 Quartz 集群wait-for-jobs-to-complete-on-shutdown: true # 应用关闭时,是否等待定时任务执行完成。默认为 false ,建议设置为 truejdbc:initialize-schema: never # 是否自动使用 SQL 初始化 Quartz 表结构。这里设置成 never ,我们手动创建表结构。properties: # 添加 Quartz Scheduler 附加属性org:quartz:# JobStore 相关配置jobStore:dataSource: quartzDataSource # 使用的数据源class: org.quartz.impl.jdbcjobstore.JobStoreTX # JobStore 实现类driverDelegateClass: org.quartz.impl.jdbcjobstore.StdJDBCDelegatetablePrefix: QRTZ_ # Quartz 表前缀isClustered: true # 是集群模式clusterCheckinInterval: 1000useProperties: falsethreadPool:threadCount: 25 # 线程池大小。默认为 10 。threadPriority: 5 # 线程优先级class: org.quartz.simpl.SimpleThreadPool # 线程池类型

使用数据库

quartz中有sql脚本创建数据库,支持多种数据库,以mysql为例

spring:datasource:quartz:driver-class-name: com.mysql.cj.jdbc.Driverurl: jdbc:mysql://localhost:3306/quartz?serverTimezone=GMT%2B8username: rootpassword: 123456# Quartz 的配置,对应 QuartzProperties 配置类quartz:job-store-type: jdbc # 使用数据库存储scheduler-name: hyhScheduler # 相同 Scheduler 名字的节点,形成一个 Quartz 集群wait-for-jobs-to-complete-on-shutdown: true # 应用关闭时,是否等待定时任务执行完成。默认为 false ,建议设置为 truejdbc:initialize-schema: never # 是否自动使用 SQL 初始化 Quartz 表结构。这里设置成 never ,我们手动创建表结构。properties: # 添加 Quartz Scheduler 附加属性org:quartz:# JobStore 相关配置jobStore:dataSource: quartzDataSource # 使用的数据源class: org.quartz.impl.jdbcjobstore.JobStoreTX # JobStore 实现类driverDelegateClass: org.quartz.impl.jdbcjobstore.StdJDBCDelegatetablePrefix: QRTZ_ # Quartz 表前缀isClustered: true # 是集群模式clusterCheckinInterval: 1000useProperties: falsethreadPool:threadCount: 25 # 线程池大小。默认为 10 。threadPriority: 5 # 线程优先级class: org.quartz.simpl.SimpleThreadPool # 线程池类型

TBSchedule:

  • 阿里早期开源的分布式任务调度系统。代码略陈旧,使用timer而非线程池执行任务调度。众所周知,timer在处理异常状况时是有缺陷的。而且TBSchedule作业类型较为单一,只能是获取/处理数据一种模式。还有就是文档缺失比较严重

elastic-job

概念

  • 当当开发的弹性分布式任务调度系统,功能丰富强大,采用zookeeper实现分布式协调,实现任务高可用以及分片,目前是版本2.15,并且可以支持云开发
  • E-Job 关注的是数据,增加了弹性扩容和数据分片的思路,以便于更大限度的利用分布式服务器的资源。但是学习成本相对高些,推荐在“数据量庞大,且部署服务器数量较多”时使用

架构

在这里插入图片描述

组件

  • App:内部包含任务执行业务逻辑和Elastic-Job-Lite组件
  • Registry**:**以Zookeeper作为Elastic-Job的注册中心组件,存储了执行任务的相关信息
  • Console**:**Elastic-Job运维平台

执行流程

  1. app启动时,在其内嵌的Elastic-Job-Lite组件向Zookeeper注册该实例的信息。
  2. 触发选举从众多实例中选举出一个Leader,让其执行任务
  3. 当到达定时任务执行时间时,
    Elastic-Job-Lite组件调用由应用程序实现的任务业务逻辑

特性

  • 集群部署 : 重写Quartz基于数据库的分布式功能,改用Zookeeper实现注册中心

作业注册中心:基于Zookeeper和其客户端Curator实现的全局作业注册控制中心。用于注册,控制和协调分布式作业执行。

  • 多节点部署时,将任务拆分为n个任务项后,各个服务器分别执行各自分配到的任务项。一旦有新的服务器加入集群,或现有服务器下线,elastic-job将在保留本次任务执行不变的情况下,下次任务开始前触发任务重分片。
  • 日志可追溯:可通过事件订阅的方式处理调度过程的重要事件,用于查询、统计和监控。Elastic-Job目前提供了基于关系型数据库两种事件订阅方式记录事件。
  • 监控告警:通过事件订阅方式可自行实现

作业运行状态监控、监听作业服务器存活、监听近期数据处理成功、数据流类型作业(可通过监听近期数据处理成功数判断作业流量是否正常,如果小于作业正常处理的阀值,可选择报警。)、监听近期数据处理失败(可通过监听近期数据处理失败数判断作业处理结果,如果大于0,可选择报警。)

  • 弹性扩容缩容:通过zk实现各服务的注册、控制及协调;
  • 并行调度:采用任务分片方式实现。将一个任务拆分为n个独立的任务项,由分布式的服务器并行执行各自分配到的分片项。
  • 高可用:调度器的高可用是通过运行几个指向同一个ZooKeeper集群的Elastic-Job-Cloud-Scheduler实例来实现的。ZooKeeper用于在当前主Elastic-Job-Cloud-Scheduler实例失败的情况下执行领导者选举。通过至少两个调度器实例来构成集群,集群中只有一个调度器实例提供服务,其他实例处于”待命”状态。当该实例失败时,集群会选举剩余实例中的一个来继续提供服务。
  • 失败处理:弹性扩容缩容在下次作业运行前重分片,但本次作业执行的过程中,下线的服务器所分配的作业将不会重新被分配。失效转移功能可以在本次作业运行中用空闲服务器抓取孤儿作业分片执行。同样失效转移功能也会牺牲部分性能。
  • 动态分片:支持多种分片策略,可自定义分片策略

默认包含三种分片策略:基于平均分配算法的分片策略、 作业名的哈希值奇偶数决定IP升降序算法的分片策略、根据作业名的哈希值对Job实例列表进行轮转的分片策略,支持自定义分片策略

elastic-job的分片是通过zookeeper来实现的。分片的分片由主节点分配,如下三种情况都会触发主节点上的分片算法执行:

a、新的Job实例加入集群

b、现有的Job实例下线(如果下线的是leader节点,那么先选举然后触发分片算法的执行)

c、主节点选举”

satum

  • Saturn:是唯品会自主研发的分布式的定时任务的调度平台,基于当当的elastic-job 版本1开发,并且可以很好的部署到docker容器上。

xxl-job

概念

  • xxl-job: 是大众点评员工徐雪里于2015年发布的分布式任务调度平台,是一个轻量级分布式任务调度框架,其核心设计目标是开发迅速、学习简单、轻量级、易扩展。
  • X-Job 侧重的业务实现的简单和管理的方便,学习成本简单,失败策略和路由策略丰富。推荐使用在“用户基数相对少,服务器数量在一定范围内”的情景下使用

特性

  • 集群部署 : 集群部署唯一要求为:保证每个集群节点配置(db和登陆账号等)保持一致。调度中心通过db配置区分不同集群。

执行器支持集群部署,提升调度系统可用性,同时提升任务处理能力。集群部署唯一要求为:保证集群中每个执行器的配置项 “xxl.job.admin.addresses/调度中心地址” 保持一致,执行器根据该配置进行执行器自动注册等操作。

  • 多节点部署时,使用Quartz基于数据库的分布式功能实现任务不能重复执行
  • 日志可追溯:有日志查询界面
  • 监控告警:调度失败时,将会触发失败报警,如发送报警邮件。

任务调度失败时邮件通知的邮箱地址,支持配置多邮箱地址,配置多个邮箱地址时用逗号分隔

  • 弹性扩容缩容:使用Quartz基于数据库的分布式功能,服务器超出一定数量会给数据库造成一定的压力;
  • 并行调度:调度系统多线程(默认10个线程)触发调度运行,确保调度精确执行,不被堵塞。
  • 高可用:“调度中心”通过DB锁保证集群分布式调度的一致性, 一次任务调度只会触发一次执行;
  • 失败处理:调度失败时的处理策略,策略包括:失败告警(默认)、失败重试;
  • 动态分片:分片广播任务以执行器为维度进行分片,支持动态扩容执行器集群从而动态增加分片数量,协同进行业务处理;在进行大数据量业务操作时可显著提升任务处理能力和速度。

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

架构

在这里插入图片描述

组件

xxl-job-admin:调度中心管理调度信息,按照调度配置发出调度请求,自身不承担业务代码可视化,动态进行任务创建,更新,删除,GLUE开发和任务报警xxl-job-core:公共依赖
xxl-job-executor-samples:接收调度请求并执行任务逻辑与调度中心解耦执行器Sample示例(选择合适的版本执行器,可直接使用,也可以参考其并将现有项目改造成执行器):xxl-job-executor-sample-springboot:Springboot版本,通过Springboot管理执行器,推荐这种方式;:xxl-job-executor-sample-frameless:无框架版本;

使用

  1. 先编译xxl-job-core,再编译xxl-job-admin
  2. 部署xxl-job-admin
  3. 部署执行器xxl-job-executor-sample-springboot,一个执行器可以创建多个任务
  4. bean模式自定义方法定时任务
@XxlJob("myJobHandler")public void myJobHandler() throws InterruptedException {XxlJobHelper.log("hello znbase");DateFormat dateFormat = new SimpleDateFormat("yyyy/MM/dd HH:mm:ss");Date date = new Date();System.out.println(dateFormat.format(date));for(int i =0;i<5;i++){XxlJobHelper.log("times:"+i);System.out.println("hello znbase" +i);TimeUnit.SECONDS.sleep(1);}}

在admin界面注册任务

在这里插入图片描述

任务调度中心

在这里插入图片描述

参照资料:
聊一聊分布式定时任务框架选型


http://chatgpt.dhexx.cn/article/laRtM6qJ.shtml

相关文章

分布式定时任务对比

1. 什么是分布式定时任务 把分散的&#xff0c;可靠性差的计划任务纳入统一的平台&#xff0c;并实现集群管理调度和分布式部署的一种定时任务的管理方式。叫做分布式定时任务。 2. 常见开源方案 elastic-job , xxl-job &#xff0c;quartz , saturn, opencron , antares el…

简单粗暴的分布式定时任务解决方案

分布式定时任务 1.为什么需要定时任务&#xff1f;2.数据库实现分布式定时任务3.基于redis实现 1.为什么需要定时任务&#xff1f; 因为有时候我们需要定时的执行一些操作&#xff0c;比如业务中产生的一些临时文件&#xff0c;临时文件不能立即删除&#xff0c;因为不清楚用户…

Java 实现分布式定时任务

文章目录 前言一、技术点二、代码实践1、引入库2、创建启动线程入口3、表结构4、任务解析5、任务拉取 三、结果展示四、总结 前言 最近有一个需求&#xff1a;需要实现分布式定时任务。而市面上的定时任务大多数都是基于Scheduled注解进行实现。不符合需求。所以根据需求整体思…

分布式定时任务调度

前言 什么是分布式定时任务? 把分散的&#xff0c;可靠性差的计划任务纳入统一的平台&#xff0c;并实现集群管理调度和分布式部署的一种定时任务的管理方式。叫做分布式定时任务。 为什么要采用分布式定时任务&#xff1f; 单点定时任务的缺点: 功能相对简单&#xff0c…

分布式定时任务-XXL-JOB-教程+实战

一.定时任务概述 1.定时任务认识 1.1.什么是定时任务 定时任务是按照指定时间周期运行任务。使用场景为在某个固定时间点执行&#xff0c;或者周期性的去执行某个任务&#xff0c;比如&#xff1a;每天晚上24点做数据汇总&#xff0c;定时发送短信等。 1.2.常见定时任务方案…

几种常用的分布式定时任务

1. 什么是分布式定时任务 把分散的&#xff0c;可靠性差的计划任务纳入统一的平台&#xff0c;并实现集群管理调度和分布式部署的一种定时任务的管理方式。叫做分布式定时任务。 2. 常见开源方案 elastic-job xxl-job quartz saturn opencron antares elastic-job el…

分布式定时任务

分布式定时任务 1&#xff0c;什么是分布式定时任务&#xff1b;2&#xff0c;为什么要采用分布式定时任务&#xff1b;3&#xff0c;怎么样设计实现一个分布式定时任务&#xff1b;4&#xff0c;当前比较流行的分布式定时任务框架&#xff1b; 1&#xff0c;什么是分布式定时…

python类型转换函数str

str函数&#xff0c;将数字转为字符串&#xff1a;

Python 类型转换(数据类型转换函数大全)

文章目录 虽然 Python 是弱类型编程语言&#xff0c;不需要像 Java 或 C 语言那样还要在使用变量前声明变量的类型&#xff0c;但在一些特定场景中&#xff0c;仍然需要用到类型转换。 比如说&#xff0c;我们想通过使用 print() 函数输出信息“您的身高&#xff1a;”以及浮点…

python怎么转换文件格式_python怎么转换数据类型

在处理数据的时候&#xff0c;经常需要转换数据的格式&#xff0c;来方便数据遍历等操作。下面我们来看一下Python中的几种数据类型转换。 1、字符串转字典&#xff1a;dict_string "{name:linux,age:18}" to_dict eval(dict_string) print(type(to_dict)) 也可以用…

python强制类型转换

1.强转为int string->int a string print(int(a))a 1.2 print(int(a))a 12 print(int(a))string仅在无特殊字符&#xff08;包括小数点&#xff09;且全为数字的情况下可强转为float boolen->int a True b False print(int(a)) print(int(b))float->int a …

python批量转换数据类型_python中数据类型转换

1、list转str 假设有一个名为test_list的list,转换后的str名为test_str 则转换方法: test_str = "".join(test_list) 例子: 需要注意的是该方法需要list中的元素为字符型,若是整型,则需要先转换为字符型后再转为str类型。 2、str转list 假设有一个名为test_str的…

python类型转换

一、int——支持转换为 int 类型的&#xff0c;仅有 float、str、bytes&#xff0c;其他类型均不支持。 1、str与bytes类型是什么&#xff0c;有什么区别 文本总是Unicode&#xff0c;由str类型表示&#xff0c;二进制数据则由bytes类型表示。 字符串是 以字符为单位进行处理…

浅谈Python中的类型转换

目录 &#xff08;一&#xff09;前言 &#xff08;二&#xff09;四种常见转换类型 1. int()函数 &#xff08;1&#xff09;int()函数的格式 &#xff08;2&#xff09;示例 2. float()函数 &#xff08;1&#xff09;float()函数格式&#xff1a; &#xff08;2&…

初学ansys:模态分析及谐响应分析

谐响应为线性系统对简谐激励的稳态响应&#xff0c;当系统含有阻尼或者激励为复数&#xff08;相位不为0或pi&#xff09;,谐响应为复数。 ansys可在模态分析的基础上进行谐响应分析&#xff1a; 2阶频率377.47&#xff0c;振型如下&#xff1a; 当z向加速度10g,右端平面z向位…

关于模态分析

模态分析目的是获得固有频率、模态振型、振型参与系数、有效质量 模态分析是动力学的基础分析,谐响应分析的前提是进行模态分析。 什么是固有频率呢&#xff1f;共振频率呢&#xff1f; 比如一个单摆做好后&#xff0c;他的振动频率等于2Pi&#xff08;l/g&#xff09;^&#x…

Ansys-模态分析基础上的谱分析学习收获

谱分析是一种将模态分析和已知谱联系起来的、计算结构位移和应力的分析方法&#xff0c;主要用于确定结构对随机载荷或时间变化载荷&#xff08;如地震载荷&#xff09;的动力响应。谱是谱值和频率的关系曲线&#xff0c;它反映了时间历程载荷的强度和频率之间的关系。响应谱&a…

什么是模态分析?什么是振型?

模态和振型是两个比较难懂的概念&#xff0c;涉及的理论比较多&#xff0c;我想通过一句话引出&#xff0c;然后通过逐步解释的方法去阐释这两个概念。 以一根梁为例&#xff0c;通过理论计算寻找其固有频率、阻尼比、振型的过程就是解析模态分析&#xff0c;通过实验得到的就…

模态分析实例—斜齿圆柱齿轮的固有频率分析

本例介绍了对一个复杂结构—斜齿圆柱齿轮模型的创建方法&#xff0c;以及利用ANSYS对其进行固有频率和振型研究即模态分析的方法、步骤和过程。 APDL: /CLEAR,NOSTART /FILNAME,EXAMPLE11/PREP7 ET,1,SOLID45 MP,EX,1,2E11 MP,PRXY,1,0.3 MP,DENS,1,7800 K,1,21.87E-3 K,2,22.…