如有8个实例,执行的时候会随机分配一个实例运行还是8个都会运行?在这节博客中没有办法完全解决这个问题,在这里抛砖引玉说明下。 看下本章大纲:
(1)回顾定时任务的实现方式;
(2)集群环境下的任务调度说明;
(3)Spring的Scheduled Task实现集群思路;
(4)Quartz实现集群思路;
我们一起看下本节具体的内容:
(1)回顾定时任务的实现方式;
定时任务的实现方式有多种,例如
JDK自带的Timer+TimerTask方式,
spring3.0以后的调度任务(ScheduledTask),
Quartz等。
(2)集群环境下的任务调度说明;
Timer+TimerTask是最基本的解决方案;
Spring自带的Scheduled Task是一个轻量级的定时任务调度器,支持固定时间(支持cron表达式)和固定时间间隔调度任务,支持线程池管理
以上两种方式有一个共同的缺点,那就是应用服务器集群下会出现任务多次被调度执行的情况,因为集群的节点之间是不会共享任务信息的,每个节点上的任务都会按时执行。
Quartz是一个功能完善的任务调度框架,特别牛叉的是它支持集群环境下的任务调度,当然代价也很大,需要将任务调度状态序列化到数据库。Quartz框架需要10多张表协同,配置繁多。
(3)Spring的Scheduled Task实现集群思路;
如果在实际项目中使用的scheduled task的话,那么也有自己变通的方式进行实现。
无非是一个任务互斥访问的问题,声明一把全局的“锁”作为互斥量,哪个应用服务器拿到这把“锁”,就有执行任务的权利,未拿到“锁”的应用服务器不进行任何任务相关的操作。另外就是这把“锁”最好还能在下次任务执行时间点前失效。
(4)Quartz实现集群思路;
选Quartz的团队基本上是冲着Quartz本身实现的集群去的, 不然JDK自带Timer就可以实现相同的功能, 而Timer存在的单点故障是生产环境上所不能容忍的。 在自己造个有负载均衡和支持集群(高可用、伸缩性)的调度框架又影响项目的进度, 所以大多数团队都直接使用了Quartz来作为调度框架
一个Quartz集群中的每个节点是一个独立的Quartz应用,它又管理着其他的节点。这就意味着你必须对每个节点分别启动或停止。Quartz集群中,独立的Quartz节点并不与另一其的节点或是管理节点通信,而是通过相同的数据库表来感知到另一Quartz应用的
-
spring
+关注
关注
0文章
340浏览量
14334 -
Boot
+关注
关注
0文章
149浏览量
35821
发布评论请先 登录
相关推荐
评论