【问题标题】:Quartz Scheduler Cluster Time SyncQuartz 调度器集群时间同步
【发布时间】:2012-04-03 17:48:13
【问题描述】:
我查看了 Quartz 文档,但似乎无法找到问题的明确答案:如果我在集群环境中使用 Quartz Scheduler 但机器不同步会发生什么(我们将使用 JobStoreTX )? Quartz 会解雇多项工作吗?它会只通过锁定数据库行条目来触发一个吗?
【问题讨论】:
-
tutorial 只是说:“永远不要在单独的机器上运行集群,除非它们的时钟使用某种形式的时间同步服务(守护程序)进行同步,这种服务非常定期运行(时钟必须彼此相差不到一秒钟)。“
标签:
java
database
quartz-scheduler
sync
cluster-computing
【解决方案1】:
很遗憾,我认为它没有被记录在案,但我相信结果并没有那么具有破坏性和错误性。
集群中的每个 Quartz 调度程序实例每隔几秒钟轮询一次数据库,试图找到要触发的新作业(我认为默认情况下,它会搜索下一个预定时间在 now - 30 和 now + 60 秒之间的所有作业 - 但这是无关紧要,取决于配置)。这个操作显然是跨集群安全的,因为很可能有多个实例同时轮询新作业。
如果服务器时间未跨集群同步,则假设其中一台服务器具有未来的时钟。该服务器认为它比实际时间晚,因此它太早地获取和启动作业 - 或者至少比所有其他服务器都早。这意味着单个服务器将运行更多(如果不是全部)作业,从集群的其余部分窃取工作。这并不是不安全本身,但会导致不对称的集群负载。
我正在考虑提出一个问题,建议在所有服务器中使用数据库时间来避免这些问题。然而,ntp 的流行以及使用外部时间源增加的复杂性使其成为一个坏主意。