1. 目标

把定时任务通过集群的方式进行管理调度,并采用分布式部署,保证系统的高可用,提高了容错。那么如何保证定时任务只在集群的某一个节点上执行,或者一个任务如何拆分为多个独立的任务项,由分布式的机器去分别执行, 众多的定时任务如何统一管理,现在有很多成熟的分布式定时任务框架,都能很好的实现上述的功能。

2. 调度框架

2.1 Quartz

介绍

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

image.png

Job

表示一个工作,要执行的具体内容。此接口中只有一个方法

void execute(JobExecutionContext context)

JobDetail

JobDetail表示一个具体的可执行的调度程序,Job是这个可执行程调度程序所要执行的内容,另外JobDetail还包含了这个任务调度的方案和策略。

Trigger代表一个调度参数的配置,什么时候去调。

Scheduler代表一个调度容器,一个调度容器中可以注册多个JobDetail和Trigger。当Trigger与JobDetail组合,就可以被Scheduler容器调度了。

image.png

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

缺点

但是对于大量的短任务,各个节点都会抢占数据库锁,这样就出现大量的线程等待资源。这种情况随着节点的增加会越来越严重。quartz的分布式只是解决了高可用的问题,并没有解决任务分片的问题,还是会有单机处理的极限。

2.2 elastic-job

介绍

elastic-job 是由当当网基于quartz 二次开发之后的分布式调度解决方案 , 由两个相对独立的子项目Elastic-Job-Lite和Elastic-Job-Cloud组成 。

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

分片概念:任务的分布式执行,需要将一个任务拆分为多个独立的任务项,然后由分布式的服务器分别执行某一个或几个分片项。

中心化和去中心化的区别:在实现难度上中心化非常高,只能实现一个调度中心,而且调度中心和作业执行的服务器之间要进行通信。而去中心化的话,实现难度比较低,没有一个中心,各个作业节点是自治的,不需要分布式的调度。第二个,部署难度,中心化稍微高一些,有一个调度中心,服务器还有一个注册中心。

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

特点

定时任务:基于成熟的定时任务作业框架Quartz cron表达式执行定时任务;

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

作业分片:将要给任务分片成多个小任务项到多服务器上同时执行;

弹性扩容缩容:运行中的作业服务器崩溃,或新增N台作业服务器,作业框架将在下次作业执行前重新分片,不影响当前作业执行;

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

image.png

2.3 XXL-JOB

介绍

XXL-JOB是一个轻量级分布式任务调度平台,调度采用中心式设计,“调度中心”基于集群Quartz实现并支持集群部署。任务分布式执行,任务"执行器"支持集群部署。

设计思想

将调度行为抽象形成“调度中心”公共平台,而平台自身并不承担业务逻辑,“调度中心”负责发起调度请求。

将任务抽象成分散的JobHandler,交由“执行器”统一管理,“执行器”负责接收调度请求并执行对应的

JobHandler中业务逻辑。

因此,“调度”和“任务”两部分可以相互解耦,提高系统整体稳定性和扩展性;

系统组成

调度模块(调度中心): 负责管理调度信息,按照调度配置发出调度请求,自身不承担业务代码。调度系统

与任务解耦,提高了系统可用性和稳定性,同时调度系统性能不再受限于任务模块; 支持可视化、简单且动

态的管理调度信息,包括任务新建,更新,删除,GLUE开发和任务报警等,所有上述操作都会实时生效,

同时支持监控调度结果以及执行日志,支持执行器Failover。

执行模块(执行器): 负责接收调度请求并执行任务逻辑。任务模块专注于任务的执行等操作,开发和维护更加简单和高效; 接收“调度中心”的执行请求、终止请求和日志请求等。

与quartz对比

有任务管理界面,操作人性化

调度逻辑和QuartzJobBean任务解耦,quartz是耦合在同一个项目中的,调度任务数量逐渐增多,调度任务逻辑逐渐加重的情况下,调用系统的性能将大大受限于业务。

quartz底层以“抢占式”获取DB锁并由抢占成功节点负责运行任务,会导致节点负载悬殊非常大;而XXL-JOB通过执行器实现“协同分配式”运行任务,充分发挥集群优势,负载各节点均衡。

调用中心管理界面

image.png

参考

https://www.jianshu.com/p/14f86c6efe22

http://blog.51cto.com/lavasoft/181907

https://blog.csdn.net/qq_27232757/article/details/77775538

python分布式任务调度_分布式定时任务调度框架相关推荐

  1. python虚拟机分布式爬虫_分布式爬虫实战

    一.环境搭建 由于条件有限,一台虚拟机,一台笔记本. 在虚拟机上装上mongodb数据库.redis数据库.redis_scrapy.pymongo.scrapyd 在本地电脑上装上monodb数据库 ...

  2. python分布式事务_分布式事务的管理--atomikos

    在一些业务场景及技术架构下,跨库的事务时不可避免的,这时候如何统一管理事务,保证事务的强一致性是整个系统稳定.可用基石.一些中间件如tuxedo.cics就是凭借这个能力占据了金融.电信.银行等很大的 ...

  3. ole db 访问接口 sqlncli 无法启动分布式事务_分布式事务,看这篇就够了

    0. 前言 1. 单数据源事务 & 多数据源事务 2. 常见分布式事务解决方案 2.1. 分布式事务模型 2.2. 二将军问题和幂等性 2.3. 两阶段提交(2PC) & 三阶段提交( ...

  4. python自动化从零开始_从零开始的自动化测试框架——Python篇

    随着软件测试领域对于技术要求越来越清晰,到现在测试人员在市场上的岗位需求也变得越来越复杂.极大部分的企业都开始对自动化测试岗位有了更多的需要.自然而然,自动化测试技术开始成为了下一个被玩烂的技术点.网 ...

  5. mysql ef 分布式事务_分布式事务系列--分布式跨库查询解决方案 mysql federated引擎的使用...

    背景 在服务高度拆分,数据库不断细化切分的情况下,我们经常有连接多台数据库查询的需求,如果不断的把数据库连接的逻辑添加在代码中,那么这种耦合会越来越严重,这会给程序的拓展和维护带来很大的麻烦. mys ...

  6. ole db 访问接口 sqlncli 无法启动分布式事务_分布式锁真的安全吗?

    最近工作中遇到了一个非常棘手有趣的故障. 让我结结实实通了两宵,睡了一个周末才缓过来.不过这篇文章讲的并不是这个故障的原因, 而是修复故障所带来的衍生问题和思考. 在升级解决这些机器的过程中, 机器被 ...

  7. mysql分布式数据库_分布式数据库搭建详细教程

    由于业务本身的需求,有时需要构建分布式数据库.一个具有较好设计的分布式数据库,对于用户(调用者)来说透明,跟使用本地数据库一样. 本文准备使用中间件的架构,实现分布式数据库的构建.简单点说,调用者与中 ...

  8. java分布式全文检索_分布式全文检索服务器——ElasticSearch(1)

    写在前面 Elaticsearch,简称为es,es是一个开源的高扩展的分布式全文检索引擎,它可以近乎实时的存储.检索数据:本身扩展性很好,可以扩展到上百台服务器,处理PB级别的数据.es也使用Jav ...

  9. python热部署_关于Spring Cloud 框架热部署的方法

    1.在对应的pom.xml 文件中添加依赖 org.springframework.boot spring-boot-devtools true 2.注:project 中添加 spring-boot ...

最新文章

  1. scikit-learn 多分类混淆矩阵
  2. 《SpringCloud超级入门》使用Eureka编写注册中心服务《九》
  3. (38)FPGA数码管驱动设计(第8天)
  4. Python+tkinter动态创建与销毁组件小案例
  5. Oracle安装本地和远程两种方式的DISPLAY设置
  6. 如何用c语言批量替换字符串,[C/C++]急速批量替换字符串
  7. SogouLabDic搜狗词库
  8. AutoCAD输出矢量图
  9. 爬虫爬取文件(图片,视频)
  10. leetcode 881 救生艇 (python3- 贪心算法)
  11. 创建Mesh-格子地图转NavMesh-可破坏墙壁
  12. 浅谈4款低功耗电流测试“神器”
  13. 用html做相片墙加音乐,把照片做成视频 所有图片像墙一样展示 图片墙动态展示特效...
  14. 批量将文件名称转为大写
  15. python单选按钮取消_取消选中单选按钮-PyQt4
  16. 华为防火墙IPSec对接飞塔
  17. matlab/simulink 风电调频,双馈调频,四机两区,调频策略对比,下垂控制,虚拟惯性,综合惯性。
  18. 一台电脑同时使用两个jlink v8
  19. 计算机 本科生发论文,北京大学图灵班本科生获STOC最佳论文奖
  20. 晋江怎样保存html,晋江文学网作者如何设置这些标签,在哪里设置 – 手机爱问...

热门文章

  1. ToF技术的三个典型应用场景案例浅析
  2. 电子支付平台软件测试,电子支付的类型-51testing软件测试网.ppt
  3. 红外非均匀矫正matlab实现,红外图像非均匀矫正——两点矫正
  4. FPGA设计中inout端口信号的仿真测试
  5. 一个简单可以聊天的聊天界面
  6. [IMX6Q][Android5.1]移植笔记 --- kernel停在Starting kernel 分析
  7. 手机游戏直播 : 悟空TV客户端设计与技术难点
  8. JavaScript基础对象创建模式之静态成员(027)
  9. C#微信公众平台账号开发,从零到整,步骤详细。
  10. 2018年上半年综合素质问答题