我们的(Spring)应用程序包含多个Schedulers
,它们在夜间变为活动状态,以更改/更新Database
中的某些数据(来自Batch
)。
这一切都运行良好,问题是我们的应用程序很快会在clustered environment
中运行。
阻止scheduler
instance A
和instance B
同时执行相同工作的最佳选项是什么?
** 更新 **
群集环境设置为'active-active'
。
每个节点都与它自己的数据库实例进行通信。每个数据库实例将replicate
数据发送到其他实例。
数据库实例未设置为'master-slave'
,但将在Galera cluster
中运行,其中每个实例都执行insert-update-delete操作。
因此每个scheduler
应该只在一个实例上运行一次。其他实例不应运行调度程序。所以我需要找到一个实例的调度程序运行的方法,其他实例的相同调度程序不应该运行。
答案 0 :(得分:4)
为了完整起见:我们最终得到了持久性Quartz job scheduling
。
This帖子帮助了我很多关于Quartz scheduling
与Spring
的持久{{1}}。
答案 1 :(得分:1)
您应该将不同的任务委派给群集中的节点。晚上在数据库中发生了什么工作?
如果节点在负载均衡器后面正确聚类,则只有一个节点应该接收更新以写入数据库。
您可以使用Zookeeper
管理节点并设置主节点以执行单独调度。
答案 2 :(得分:1)
您将拥有代码来处理两个群集中的预定事件。有两种方法。
我更喜欢第二种方法 - 写一次。
答案 3 :(得分:1)
你不是说你正在使用什么样的Schedulers
您正在寻找的是持续安排。 JEE支持这一点,Quartz也支持。开箱即用的弹簧没有,如果你愿意,它可以很好地与Quartz集成。
使用持久调度程序,作业将添加到数据库中,触发器将在“事务”中运行(不确定它是否为实际事务),确保只有一个调度程序可以运行触发器。
但是,它需要一些数据库表来进行管理。