为什么要用分布式集群任务调度?
作为一个开发者,避免不了定时任务的问题,最粗暴和简单直接的解决方案就是crontab。当然在机器少,任务不多,定时任务之间关联少的情况下,crontab效率还是比较高和便捷的。但当机器越多、定时任务越多,各个任务联系越紧密的情况下,用crontab进行定时任务的管理配置,就会非常混乱,严重影响工作效率。
机器多、定时任务多的情况下,就会遇到以下问题:
1、每个服务器各个用户下的crontab任务管理混乱,生命周期无法统一协调管理
2、定时任务运行异常告警难以统一对接
3、任务A和任务B如果存在互斥关系,crontab很难进行互斥处理
4、随着时间增长,当定时任务达到几千上万的时候,定时任务就非常难以管理,线上跑了多个定时任务,每个定时任务什么时候运行,属于哪个应用和哪个开发负责等等问题变得很难解决。
Linux原生Crontab调度系统和Quartz对比:
1、执行粒度方面:
Crontab:进程调度
Quartz:线程调度
线程调度优势:一是更节省资源,二是可以在进程内做数据交换,做数据交换这点很重要。
2、平台依赖性:
Crontab支持Linux系统
Quartz由于是Java实现,所以支持跨平台。
3、调度操作集上:
Quartz的设置更为灵活,可以很方便的通过代码完成各种自定义需求,而且完全闭包Crontab。
但是Crontab的最小调度单元为分钟级,而Quartz可以更细,Crontab实现自定义需求比较麻烦。
4、Job监控方面:
Quartz支持Listener,对job运行情况监控很方便,并且能用JobStores进行调度信息的持久化(内存、DB均可),进而可以实现job可视化。
5、高可用:
Quartz支持分布式集群,这一点很重要,而且实现很方便。
为什么要用分布式集群任务调度?
想象一下,现在有 A 、B、 C 3 台机器同时作为集群服务器对外统一提供 SERVICE,3 台机器上各有一个 QUARTZ Job,它们会按照即定的 SCHEDULE 自动执行各自的任务。由于三台SERVER 里都有 QUARTZ ,因此会存在重复处理 TASK 的现象。一般的解决方案是只在一台服务器上装 QUARTZ ,其它两台不装,这样的话其实就是单机了,quartz会存在单点问题,一旦装有quartz的服务器宕了,服务就无法提供了。当然通过改 QUARTZ JOB 的代码也可以实现,但是这对开发人员要求比较高,而且可能会出现其他问题。然而quartz本身就提供了很好的集群方案。quartz集群需要数据库的支持(JobStore TX或者JobStoreCMT),从本质上来说,是使集群上的每一个节点通过共享同一个数据库来工作而达到高可用的。分布式集群任务调度,quartz是一个比较好的选择。简单,强大,稳定。
分布式集群时有个问题,就是所有服务器时钟应当要同步,以免出现离奇且不可预知的问题。

低调大师中文资讯倾力打造互联网数据资讯、行业资源、电子商务、移动互联网、网络营销平台。
持续更新报道IT业界、互联网、市场资讯、驱动更新,是最及时权威的产业资讯及硬件资讯报道平台。
转载内容版权归作者及来源网站所有,本站原创内容转载请注明来源。
-
上一篇
Nginx 用ModSecurity实现WAF功能
转载:https://www.52os.net/articles/nginx-use-modsecurity-module-as-waf.html nginx配合modsecurity实现WAF功能 January 26, 2015 modsecurity原本是Apache上的一款开源waf,可以有效的增强web安全性,目前已经支持nginx和IIS,配合nginx的灵活和高效,可以打造成生产级的WAF,是保护和审核web安全的利器。 一.准备工作 系统:centos 6.5 64位、 tengine 2.1.0, modsecurity 2.8.0 tengine:http://tengine.taobao.org/download/tengine-2.1.0.tar.gz modsecurity for Nginx:https://www.modsecurity.org/tarball/2.8.0/modsecurity-2.8.0.tar.gz OWASP规则集:https://github.com/SpiderLabs/owasp-modsecurity-crs 依赖关系: t...
-
下一篇
JavaScript学习之旅-10(原创)
在上一篇文章中,主要学习了JavaScript了map、reduce、filter、Sort等关键字的使用。这一篇文章我们主要学习JavaScript中的闭包,箭头函数 闭包: 在说到闭包以前,我们先复习下JavaScript中的变量作用域。JavaScript中变量的作用域无非就是两种:全局变量和局部变量。需要注意的是,函数内部可以直接读取全局变量;但是在函数外部无法直接读取函数内的局部变量。 举个例子: 其中:data是我们定义的全局变量,在test函数中,我们可以直接使用。所以弹窗也弹出了数据 但是,如果我们在函数里面定义变量,然后直接通过外部引用,就会报错,如下图,异常信息显示第六行错误,那么实际上是data 没有定义,导致的错误。因为data定义是在test函数里面局部变量,外部直接使用局部变量就会报错 需要注意!!!函数内部声明变量的时候,一定要使用var。如果不用的话,你实际上声明了一个全局变量!如下图: 没有使用var变量 那么,正常情况下,如何从外部去获取函数内部定义的变量? 闭包 可以帮助我们有效解决这个问题: 有权访问另一个函数作用域内变量的函数都是闭包。简单点理...
相关文章
文章评论
共有0条评论来说两句吧...