分布式定时任务调度

article/2025/10/10 3:50:57

前言

什么是分布式定时任务?

把分散的,可靠性差的计划任务纳入统一的平台,并实现集群管理调度和分布式部署的一种定时任务的管理方式。叫做分布式定时任务。

为什么要采用分布式定时任务?

单点定时任务的缺点:

  • 功能相对简单,交互性差,任务部署效率低,开发和维护成本比较高,不能很好的满足各系统定时任务的管理和控制,尤其在多系统的环境下更加明显;
  • 许多任务都是单机部署,可用性差;
  • 任务跟踪和告警难以实现。

分布式定时任务的优势:

  • 通过集群的方式进行管理调度,大大降低了开发和维护成本;
  • 分布式部署,保证了系统的高可用性,伸缩性,负载均衡,提高了容错;
  • 可以通过控制台部署和管理定时任务,方便灵活高效;
  • 任务都可以持久化到数据库,避免了宕机和数据丢失带来的隐患,同时有完善的任务失败重做机制和详细的任务跟踪及告警策略。

1 基础框架Quartz和其设计方案

1.1 quartz

quartz 集群中每个节点都是一个单独的Quartz应用,它又管理着其他的节点。这个集群需要每个节点单独的启动或停止;和我们的应用服务器集群不同,独立的quartz 节点之间是不需要 通信的。不同节点之间是通过数据库表来感知另一个应用。只有使用持久的JobStore才能完成quartz 集群。

  • Job:表示一个工作,要执行的具体内容。此接口中只有一个方法
    void execute(JobExecutionContext context)
  • JobDetail:表示一个具体的可执行的调度程序,Job是这个可执行程调度程序所要执行的内容,另外JobDetail还包含了这个任务调度的方案和策略。
  • Trigger代表一个调度参数的配置,什么时候去调用。
  • Scheduler代表一个调度容器,一个调度容器中可以注册多个JobDetail和Trigger。当Trigger与JobDetail组合,就可以被Scheduler容器调度了。

上图三个节点在数据库中都拥有同一份Job定义,如果某一个节点失效,那么Job会在其他节点上执行。由于三个节点上的Job执行代码是一样的,那么怎么保证只有在一台机器上触发呢?

答案是使用了数据库锁。在quartz的集群解决方案里有张表scheduler_locks,quartz采用了悲观锁的方式对triggers表进行行加锁,以保证任务同步的正确性。一旦某一个节点上面的线程获取了该锁,那么这个Job就会在这台机器上被执行,同时这个锁就会被这台机器占用。同时另外一台机器也会想要触发这个任务,但是锁已经被占用了,就只能等待,直到这个锁被释放。之后会看trigger状态,如果已经被执行了,则不会执行了。

优点:

保证节点高可用 (HA), 如果某一个几点挂了, 其他节点可以顶上

缺点:

  • 同一个任务只能有一个节点运行,其他节点将不执行任务,性能低,资源浪费
  • 当碰到大量短任务时,各个节点频繁的竞争数据库锁,节点越多这种情况越严重,造成性能会很低下
  • quartz 的分布式仅解决了集群高可用的问题,并没有解决任务分片的问题,不能实现水平扩展,还是会有单机处理的极限

1.2 方案

1.2.1 分时方案

严格划分时间片,交替运行计划任务,当主系统宕机后,备用系统仍然工作,但是处理初期被拉长了。

缺点:周期延长了。

fdf

1.2.2 HA高可用方案

正常情况下主系统工作,备用系统守候,心跳检测发现主系统出现故障备用系统启动。

缺点:单一系统,不能做负载均衡,只能垂直扩展,也就是硬件层面的升级,无法做水平扩展。

1.2.3 多路心跳方案

采用多路心跳,做服务级,进程级的,IP和端口级别的心跳检测,正常情况是主系统工作,备用系统守候,心跳检测主系统出现故障,备用系统启动,当再次检测到主系统工作,则将执行权交回主系统。

缺点:开发比较复杂,程序健壮性要求高。

1.2.4 任务抢占方案

A,B两台服务器同时工作,启动需要存在一前一后,谁先启动谁率先加锁,其他服务器只能等待,他们同时对互斥锁进行监控,一旦发现锁被释放,其他服务那个先抢到,那个运行,运行前加排他锁。

优点:可以进一步实现多服务器横向扩展。

缺点:开发复杂,程序健壮性要求高,有时候会出现不释放锁的问题。

img

1.2.5 任务轮询或任务轮询+抢占排队方案

每个服务器首次启动时加入队列;

每次任务运行首先判断自己是否是当前可运行任务,如果是便运行;

如果不是当前运行的任务,检查自己是否在队列中,如果在,便推出,如果不在队列中,便键入队列。

img

通过以上这些方案,可以看出1.3和1.5的方案才是优先选择的,扩展性好,开发复杂度不是很高。那么这种方案需要的需要的技术原理是什么呢,那就是分布式互斥锁和队列。

2 分布式定时任务调度框架

2.1 elastic-job

elastic-job 是由当当网基于quartz 二次开发之后的分布式调度解决方案 , 它主要的设计理念是无中心化的分布式定时调度框架,思路来源于Quartz的基于数据库的高可用方案。但数据库没有分布式协调功能,所以在高可用方案的基础上增加了弹性扩容和数据分片的思路,以便于更大限度的利用分布式服务器的资源。

elastic-job由两个相对独立的子项目Elastic-Job-Lite和Elastic-Job-Cloud组成 。

Elastic-Job-Lite定位为轻量级无中心化解决方案,使用jar包的形式提供分布式任务的协调服务。

Elastic-Job-Cloud使用Mesos + Docker(TBD)的解决方案,额外提供资源治理、应用分发以及进程隔离等服。

  • 分片概念:任务的分布式执行,需要将一个任务拆分为多个独立的任务项,然后由分布式的服务器分别执行某一个或几个分片项。
  • 中心化和去中心化的区别:在实现难度上中心化非常高,只能实现一个调度中心,而且调度中心和作业执行的服务器之间要进行通信。而去中心化的话,实现难度比较低,没有一个中心,各个作业节点是自治的,不需要分布式的调度。第二个,部署难度,中心化稍微高一些,有一个调度中心,服务器还有一个注册中心。

去中心化有两种,一个是作业执行服务器,还有一个注册中心。触发时间统一控制,中心化是可以的,去中心化差一些,作业服务器执行的时间本身不一样的怎么办,有的公司没有问题,作业乱掉时用中心化,用各个服务器去分发调度。去中心化,每个中心都是根据自己的时钟进行作业,这是很难控制的。

特点

  • 定时任务:基于成熟的定时任务作业框架Quartz cron表达式执行定时任务;
  • 作业注册中心:基于Zookeeper实现全局作业注册控制中心。用于注册,控制和协调分布式作业执行。
  • 作业分片:将要给任务分片成多个小任务项到多服务器上同时执行;
  • 弹性扩容缩容:运行中的作业服务器崩溃,或新增N台作业服务器,作业框架将在下次作业执行前重新分片,不影响当前作业执行;

任务监控和管理界面:Elastic-Job-Lite-Console。它和Elastic-Job-Lite是两个完全不关联的应用程序,使用ZooKeeper来交换数据,管理人员可以通过这个界面查看、监控和管理Elastic-Job-Lite的任务,必要的时候还能手动触发任务。

官方文档:http://elasticjob.io/docs/elastic-job-lite/00-overview/

2.2 xxl-job

许雪里个人开源的一个轻量级分布式任务调度框架 ,主要分为 调度中心和执行器两部分 , 调度中心在启动初始化的时候,会默认生成执行器的RPC代理。对象(http协议调用), 执行器项目启动之后, 调度中心在触发定时器之后通过jobHandle 来调用执行器项目里面的代码,核心功能和elastic-job差不多,同时技术文档比较完善。

设计思想:

将调度行为抽象形成“调度中心”公共平台,而平台自身并不承担业务逻辑,“调度中心”负责发起调度请求。将任务抽象成分散的JobHandler,交由“执行器”统一管理,“执行器”负责接收调度请求并执行对应的JobHandler中业务逻辑。因此,“调度”和“任务”两部分可以相互解耦,提高系统整体稳定性和扩展性。

系统架构图:

系统组成:

  • 调度模块(调度中心): 负责管理调度信息,按照调度配置发出调度请求,自身不承担业务代码。调度系统与任务解耦,提高了系统可用性和稳定性,同时调度系统性能不再受限于任务模块; 支持可视化、简单且动态的管理调度信息,包括任务新建,更新,删除,GLUE开发和任务报警等,所有上述操作都会实时生效,同时支持监控调度结果以及执行日志,支持执行器Failover。
  • 执行模块(执行器): 负责接收调度请求并执行任务逻辑。任务模块专注于任务的执行等操作,开发和维护更加简单和高效; 接收“调度中心”的执行请求、终止请求和日志请求等。

与quartz对比:

  1. 有任务管理界面,操作人性化
  2. 调度逻辑和QuartzJobBean任务解耦,quartz是耦合在同一个项目中的,调度任务数量逐渐增多,调度任务逻辑逐渐加重的情况下,调用系统的性能将大大受限于业务。
  3. quartz底层以“抢占式”获取DB锁并由抢占成功节点负责运行任务,会导致节点负载悬殊非常大;而XXL-JOB通过执行器实现“协同分配式”运行任务,充分发挥集群优势,负载各节点均衡。
  4. 支持多种模式的定时任务, GLUE模式(Shell) + GLUE模式(Python) + GLUE模式(NodeJS)

官方文档:http://www.xuxueli.com/xxl-job/#/?id=%E3%80%8A%E5%88%86%E5%B8%83%E5%BC%8F%E4%BB%BB%E5%8A%A1%E8%B0%83%E5%BA%A6%E5%B9%B3%E5%8F%B0xxl-job%E3%80%8B

2.3 对比

quartzelastic-job-cloudxxl-job
依赖mysqljdk1.7+, zookeeper 3.4.6+ ,maven3.0.4+ ,mesosmysql ,jdk1.7+ , maven3.0+
HA多节点部署,通过竞争数据库锁来保证只有一个节点执行任务通过zookeeper的注册与发现,可以动态的添加服务器。 支持水平扩容集群部署
任务分片支持支持
文档完善完善完善完善
难易程度简单较复杂简单
管理界面支持支持
开发者OpenSymphony当当网个人(许雪里)
高级功能弹性扩容,多种作业模式,失效转移,运行状态收集,多线程处理数据,幂等性,容错处理,spring命名空间支持弹性扩容,分片广播,故障转移,Rolling实时日志,GLUE(支持在线编辑代码,免发布),任务进度监控,任务依赖,数据加密,邮件报警,运行报表,国际化
缺点没有管理界面,以及不支持任务分片等。不适用于分布式场景需要引入zookeeper , mesos, 增加系统复杂度, 学习成本较高调度中心通过获取 DB锁来保证集群中执行任务的唯一性, 如果短任务很多,随着调度中心集群数量增加,那么数据库的锁竞争会比较厉害,性能不好。
使用企业大众化产品,对分布式调度要求不高的公司大面积使用36氪,当当网,国美,金柚网,联想,唯品会,亚信,平安,猪八戒大众点评,运满满,优信二手车,拍拍贷

参考文档:

https://www.jianshu.com/p/ab438d944669

https://blog.csdn.net/u012394095/article/details/79470904

https://www.jianshu.com/p/3da5ef692a04


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

相关文章

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

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

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

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

分布式定时任务

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

python类型转换函数str

str函数,将数字转为字符串:

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

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

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

在处理数据的时候,经常需要转换数据的格式,来方便数据遍历等操作。下面我们来看一下Python中的几种数据类型转换。 1、字符串转字典: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仅在无特殊字符(包括小数点)且全为数字的情况下可强转为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 类型的,仅有 float、str、bytes,其他类型均不支持。 1、str与bytes类型是什么,有什么区别 文本总是Unicode,由str类型表示,二进制数据则由bytes类型表示。 字符串是 以字符为单位进行处理…

浅谈Python中的类型转换

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

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

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

关于模态分析

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

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

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

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

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

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

本例介绍了对一个复杂结构—斜齿圆柱齿轮模型的创建方法,以及利用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.…

使用ANSYS进行对称边界的模态分析,制作【春节快乐】

这里写自定义目录标题 想法由来1. 建模2. 使用对称边界进行模态分析2.1 处理几何模型2.2 网格划分并设置边界条件进行计算2.3 求解2.4查看结果 延续去年的传统,最近几天一直在想做个什么东西来迎接新年。本来想用keras训练个深度网络,从一大堆图片中识别…

[Ansys Workbench] 平面对称斜拉桥的模态分析

1. 题目 2. 预处理 使用静态结构和模态分析两个模块 2.1 定义材料 2.2 定义几何结构 使用 DesignModeler 不知道 DM 中怎么使用对称轴画图……我就用了笨方法画了 一个主梁 使用 Concept - Lines From Sketches 从草图生成线 得到的线在结构树中如图所示 选择草图中所有的线&…

Ansys模态计算结果图片批量导出命令流

1.设置图片输出质量 2.命令流一键导出 *do,i,1,10 ###输出前10阶计算结果图片 set,1,i ####构造循环 plnsol,u,sum /image,save,D:\ANSYS\ban%i%,bmp ### 输出文件路径 *enddo

ANSYS apdl命令流笔记15-------模态分析

模态分析简介 前言一、案例1--均匀直杆的固有频率分析(1)完整命令(2)固有频率(3)第2阶固有频率下的振型 二、案例2--有预应力的固定弦1.完整命令2.固有频率3.第2阶固有频率下的振型 前言 模态分析的本质就是研究系统的自由振动特性,确定一个结构的固有频率和振型。…