之前看到很多关于quartz的讨论,尤其是关于quartz和集群应用的讨论是非常的激烈,很多人都共享了自己的想法,很多基本上比较统一的观点是重新启动一个job server,用来跑job,然后把这个job server独立在web container之外启动。然后各节点如果需要启动任务那么就通过db或jms来通知job server。这个方法是robbin大哥提出的,原贴见http://www.iteye.com/topic/40970,第8楼。用这种方法比较好的处理了quartz和应用集群问题。

首先请大家原谅,这个图是我用visio画的,画的不咋滴(上次收到pd的警告信之后不敢再用pd了),大概就是这个样子吧,如果理解有误请大家指出来啊。这种情况下jobserver也可以看作是一个node,如果定时任务很多的话就有问题了,因为所有的任务都会在这个节点上运行。

第二种方案
在上面的基础上,我想到,能不能通过轻量级远程调用和quartz结合起来,也是把任务定时跑到一个jobserver上,但是正真跑任务还是在web节点上,那么如何实现呢,我也来详细讲解一下自己的想法。
1, 独立出一个job server,这个server上跑一个spring+quartz的应用,这个应用专门用来启动任务。
2, 在jobserver上加上hessain,得到业务接口,这样jobserver就可以调用web container中的业务操作,也就是正真执行任务的还是在cluster中的tomcat。
3, 在jobserver上配置cluster上各节点的地址,即各tomcat的hessian。他们的业务接口都是一样的,只不过地址是不一样的。
4, 在jobserver启动定时任务之后,轮流调用各地址上的业务操作(类似apache分发tomcat一样),这样可以让不同的定时任务在不同的节点上运行,减低了一台某个node的压力(我觉得这个优点是一个比较重要的优点,尤其是定时任务比较重的情况下)。

我觉得这种方式对jobserver来说就比较简单了,它只需要考虑调用谁谁谁,不需要把node上的应用部署到JobServer上去,但是有优点肯定就有缺点(用易中天的话说:喜欢的人越多,反对的声浪也越高),我们再来看看这种方式的缺点:
1 即使是用了hessain也可以象上面那种方式jobserver是一个单独的虚拟机实例,不在web container中。当然我们也可以用RMI来代替,而且RMI的速度比hessian快得多,但是显然带来的是开发上更多的复杂性,RMI环境的配置非常麻烦,而且在网络端口方面也存在一些问题,如防火墙的问题等。
2 网络延迟问题,如果是时间要求比较精准的任务用这种方案就不合适了,因为hessain调用是有网络延迟的时间的,数量级从十到百不等,单位十毫秒。尤其是第一次调用,可能需要1秒钟,如果在同一台机器上第一次调用大概是300-600毫秒。
3 需要再做一个额外的web应用,就是做一个基于web的jobserver(不过这一条也不一定是缺点)

这两种方法事实上都没有把quart集群起来,虽然应用是集群了,但是jobserver还是只有一个。第一种方案只能在jobserver中执行定时操作,第二种方法还是在集群的各节点中执行定时操作。在这两种情况下,只要jobserver挂了,整个定时的任务就挂了。

或者我们也可以把这些单独的jobserver集群起来,比如在第一种情况下再部署一个jobserver,通过数据库中的表的记录的锁定与否来判断这条任务是否在执行,这种情况下需要两个jobserver的时间一定要保持一致,因为如果有一个时间差,定时任务就有可能被执行两遍了。而且同一个应用就需要被部署多次,保存部署到jobserver上,如果在第二种情况下做集群,那么没有业务操作的jobserver集群起来应该是非常轻松的,但是还是有同样的问题,就是时间差不能太大,否则应用又会被调用多次。而且这两个方案的集群都需要数据库的支持(不过没有数据库还真不知道如何做到定时操作的集群了),这种方案要实现起来就需要另写文章仔细叙述了。

第三种情况:
quartz本身事实上也是支持集群的。在这种方案下,cluster上的每一个node都在跑quartz,然后也是通过数据中记录的状态来判断这个操作是否正在执行,这就要求cluster上所有的node的时间应该是一样的。而且每一个node都跑应用就意味着每一个node都需要有自己的线程池来跑quartz(俺反而觉得这样做比较累赘)。

这种方式也有一个很大的优点,就是不同的node可能会执行的不同的定时任务,这个要看服务器的时间设定了,可能node1执行一个任务,此时node2会执行另一个任务,这样做会比较好的做到负载均衡,而且也能比较好的做到容错,一个node挂了,不会
影响到其他node上的定时任务。每个node上的quartz定期的向数据库里登记它们的时
间,如果某个实例在一定的时间内没有登记,就表示这个实例挂了 ,其它的实例就会重新获取这个挂了的实例所执行的任务。

总结一下:
从上面的描述看来,3种方法都各有优点和缺点。我觉得不同的情况下应该选择自己项目最合适的方案。以上只不过是我自己天马行空想出来了,估计有些地方有问题,欢迎大家探讨一下这个问题。

quartz和应用的集群问题相关推荐

  1. Quartz.net持久化与集群部署开发详解

    支持集群高可用的开发方案 Quartz.net的数据库表结构 如果支持集群与持久化,单靠本机的内存和xml来保存计算任务调度的各种状态值,可想而知,是困难的.所以支持数据库这样的解决方案,OpenSy ...

  2. quartz在集群环境下的最终解决方案

    在集群环境下,大家会碰到一直困扰的问题,即多个 APP 下如何用 quartz 协调处理自动化 JOB . 大家想象一下,现在有 A , B , C3 台机器同时作为集群服务器对外统一提供 SERVI ...

  3. quartz集群调度机制调研及源码分析---转载

    quartz2.2.1集群调度机制调研及源码分析 引言 quartz集群架构 调度器实例化 调度过程 触发器的获取 触发trigger: Job执行过程: 总结: 附: 引言 quratz是目前最为成 ...

  4. quartz(6)--集群

    Quartz应用能被集群,是水平集群还是垂直集群取决于你自己的需要.集群提供以下好处: · 伸缩性 · 高可用性 · 负载均衡 目前,Quartz只能借助关系数据库和JDBC作业存储支持集群. qua ...

  5. 第十节: 利用SQLServer实现Quartz的持久化和双机热备的集群模式

    背景: 默认情况下,Quartz.Net作业是持久化在内存中的,即 quartz.jobStore.type = "Quartz.Simpl.RAMJobStore, Quartz" ...

  6. 第十节: 利用SQLServer实现Quartz的持久化和双机热备的集群模式 :

    背景: 默认情况下,Quartz.Net作业是持久化在内存中的,即 quartz.jobStore.type = "Quartz.Simpl.RAMJobStore, Quartz" ...

  7. 阿里P8架构师谈:Quartz调度框架详解、运用场景、与集群部署实践

    以下将分别从Quartz架构简介.集群部署实践.Quartz监控.集群原理分析详解Quartz任务调度框架. Quartz简介 Quartz是Java领域最著名的开源任务调度工具,是一个任务调度框架, ...

  8. Springboot整合Quartz集群部署以及配置Druid数据源

    参考链接: https://blog.csdn.net/wangmx1993328/article/details/105441308 https://blog.csdn.net/qq_3966905 ...

  9. Spring整合Quartz集群部署

    Spring整合Quartz集群部署 Quartz的分布式模式 数据表创建 quartz.properties spring-job.xml Quartz的分布式模式 集群中的每个节点都是一个独立的Q ...

最新文章

  1. WPF框架的内存泄漏BUG
  2. 微软职位内部推荐-Senior BSP Engineer
  3. 上海市国资大数据课题启动仪式暨数据资产技术及金融行业应用沙龙隆重开幕...
  4. cmake (2)build方面的指令
  5. Python中type()详解:动态创建类
  6. [转]JavaScript优化方案
  7. java public object_Java_Object
  8. C语言项目:图形马赛克处理技术
  9. 海龟绘图两小时上手C语言 - 3 正方形螺旋线
  10. 可编辑列表标签_好用的音频标签管理工具Music Tag Editor Pro Mac4.0.1 中文版
  11. sql server 2005 T-SQL ALTER SCHEMA (Transact-SQL)
  12. socket通信之epoll模型
  13. PHP 类似time控件功能,最新火车头免费伪原创插件,多功能秒杀市面上所有同类工具...
  14. 乘法计算机公式,Excel表格乘法函数公式
  15. idea代码编辑CPU使用率飙升100%
  16. iOS开发 - 给Label加下划线、中划线
  17. win10设置窗口背景
  18. [BZOJ2298]problem a
  19. 一比二购增加您指定商品降价时,给您发送邮件通知的功能
  20. 每日一学:洛必达法则及其使用条件

热门文章

  1. Private strand flush not complete 说明
  2. 转,动态生成的高度自适应
  3. Netty工作笔记0063---WebSocket长连接开发2
  4. Linux工作笔记038---Centos下Linux下解决root用户Operation not permitted
  5. Linux工作笔记031---Centos7.3下安装tomcat
  6. Android学习笔记---26_网络通信之资讯客户端,使用pull解析器,解析,从网络中获得的自定义xml文件
  7. error C4430: 缺少类型说明符 - 假定为 int。注意: C++ 不支持默认 int错误的解决方法
  8. 矩阵键盘数 码管显示多位数 c语言,4×4矩阵键盘数码管显示按键值程序
  9. mysql end case连接_MySql 中 case when then else end 的用法
  10. mysql utf-8_完美解决mysql下utf-8的乱码问题