Jdbcjobstore中Quartz集群负载均衡算法内部实现
Quartz clustering load balancing algorithm internal implementation in Jdbcjobstore
我已经在我的应用程序中配置了 quartz。它适用于集群,我可以看到集群节点一次触发一个作业。但是,我有一个关于负载平衡算法如何在 quartz 中工作的问题。我想知道在 jdbcJobstore 代码中的什么时候,节点获取信息表明它无法获取 lock.How 特定集群节点获取锁以触发代码中的作业?
Quartz 没有使用明确的负载平衡。发生的情况是各个集群的 Quartz 调度程序实例竞争执行作业。当时间到了并且应该执行作业时,各个调度程序实例会尝试在配置的作业存储数据库中的 QRTZ_LOCKS table 中创建数据库行锁。设法创建数据库行锁的实例获胜并执行作业。另一个调度程序收到 SQL 异常并放弃。
正如您可以推断的那样,Quartz 中的负载平衡非常简单,因为负载较高的节点 "somewhat less likely" 是第一个成功创建数据库锁的节点。这显然假设时间在所有集群 Quartz 实例上正确同步。
如果您对数据库行锁定在 Quartz 中的工作原理感兴趣,可以查看 DBSemaphore API.
我已经在我的应用程序中配置了 quartz。它适用于集群,我可以看到集群节点一次触发一个作业。但是,我有一个关于负载平衡算法如何在 quartz 中工作的问题。我想知道在 jdbcJobstore 代码中的什么时候,节点获取信息表明它无法获取 lock.How 特定集群节点获取锁以触发代码中的作业?
Quartz 没有使用明确的负载平衡。发生的情况是各个集群的 Quartz 调度程序实例竞争执行作业。当时间到了并且应该执行作业时,各个调度程序实例会尝试在配置的作业存储数据库中的 QRTZ_LOCKS table 中创建数据库行锁。设法创建数据库行锁的实例获胜并执行作业。另一个调度程序收到 SQL 异常并放弃。
正如您可以推断的那样,Quartz 中的负载平衡非常简单,因为负载较高的节点 "somewhat less likely" 是第一个成功创建数据库锁的节点。这显然假设时间在所有集群 Quartz 实例上正确同步。
如果您对数据库行锁定在 Quartz 中的工作原理感兴趣,可以查看 DBSemaphore API.