【问题标题】:Quartz scheduler in cluster mode: do high-frequent and low-frequent trigger fire on random nodes?集群模式下的 Quartz 调度器:高频和低频触发器会在随机节点上触发吗?
【发布时间】:2021-04-28 07:47:32
【问题描述】:

我已阅读以下关于 Quartz 集群模式here 的声明:

每次触发时只有一个节点会触发作业。我的意思是,如果作业有一个重复触发器,告诉它每 10 秒触发一次,那么在 12:00:00 恰好一个节点将运行该作业,而在 12:00:10 恰好一个节点将运行作业等。 不一定每次都是同一个节点 - 哪个节点运行它或多或少是随机的。负载平衡机制对于繁忙的调度程序(许多触发器)来说是近乎随机的,但偏向于刚刚对非繁忙(例如一两个触发器)调度程序处于活动状态的同一节点

如果我有多个触发器(例如 10 个),无论是高频触发器(例如每 10 秒一次)还是低频触发器(例如每天下午 1:00 一次),这两种触发器类型都会导致作业在不同的位置执行(随机)节点?还是“很多触发器”仅指高频触发器?

我会假设“低频率触发器”(每天仅一次)也会导致作业在随机节点上执行,因为有很多触发器“接近其执行时间”(高频触发器),所以从 Quartz 的角度来看,大约在 01:00 pm 存在很多触发器。

【问题讨论】:

    标签: quartz-scheduler quartz


    【解决方案1】:

    每个 Quartz 实例以特定间隔轮询数据库,由属性 org.quartz.scheduler.idleWaitTime

    控制

    是当调度程序空闲时,调度程序在重新查询可用触发器之前等待的时间量(以毫秒为单位)。通常,您不必“调整”此参数,除非您使用的是 XA 事务,并且在延迟触发应立即触发的触发器时遇到问题。不建议使用小于 5000 毫秒的值,因为它会导致过多的数据库查询。小于 1000 的值是不合法的。

    此属性的默认值为 30 秒

    另一个属性控制可以并行运行的线程数,org.quartz.threadPool.threadCount

    可以是任何正整数,尽管您应该意识到只有 1 到 100 之间的数字非常实用。这是可用于并发执行作业的线程数。如果您只有几个每天触发几次的作业,那么 1 个线程就足够了!如果您有数以万计的作业,每分钟触发许多作业,那么您可能希望线程数更像 50 或 100(这在很大程度上取决于您的作业执行的工作的性质以及您的系统资源!)。

    Link to documentation

    通过配置这两个属性,我认为负载平衡取决于哪个实例首先轮询数据库以获取触发器的锁定,以及哪个实例的线程可以空闲来获取工作。

    对于非繁忙的调度程序,尤其是所有实例具有相同的间隔时,作业可以优先考虑每分钟首先轮询数据库的实例。

    【讨论】:

      猜你喜欢
      • 2020-09-07
      • 1970-01-01
      • 2016-09-07
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-03-18
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多