我在负载均衡器后面有一层相同的应用服务器.出于操作原因,我有一个约束,即两个应用服务器上的应用程序配置必须相同,以便可以轻松添加和删除节点.所有应用服务器共享同一个数据库.应用服务器不会/不会被群集.
到目前为止,这种方法运行良好,但现在我希望在一个应用服务器上执行预定的作业.所有应用服务器都将运行Quartz并具有相同的运行作业计划.触发器将在每个应用服务器上触发,但我希望只有一个应用服务器实际执行该作业 - 实际上它们都是竞争启动而且只有一个实际启动,其余的应用服务器只是忽略了该作业.这里的想法是,如果我们丢失一个应用服务器,另一个将运行该作业,如果我们添加新的应用服务器,他们将轮流运行作业.
我计划通过在数据库中创建一个"作业锁定"表来执行此操作,所有应用程序服务器在启动作业之前都会读取该表,并且只有在作业"解锁"时才会启动.首先对表进行更新的应用服务器将通过将表更新为运行状态/在作业结束时重置它来实质上阻止其他服务器.
在我构建之前,我很感激那些有更多石英经验的人的一些意见:
a)我可以将此行为挂钩到Quartz中,以便不必在每个作业的基础上完成吗?即开发人员可以添加新的工作而不必担心工作锁定,因为它被抽象掉了.
b)Quartz是否提供任何内置机制来实现类似于上面的内容,所以我不必自己滚动它?
谢谢!
我们的(Spring)应用程序包含几个Schedulers在夜间变为活动状态以更改/更新某些数据(来自Database)的应用程序Batch.
这一切都运行正常,问题是我们的应用程序很快就会运行了clustered environment.
什么是防止最好的选择scheduler的instance A,并instance B在同一时间做同样的工作?
**更新**
集群环境设置为'active-active'.
每个节点都与它自己的数据库实例进行通信.每个数据库实例都将replicate数据发送到其他实例.
数据库实例未设置为,'master-slave'但将Galera cluster在每个实例执行insert-update-delete操作的位置运行.
所以每个scheduler应该只在一个实例上运行一次.其他实例不应运行调度程序.所以我需要找到一个实例的调度程序运行的方法,其他实例的相同调度程序不应该运行.
我们有一个Spring Boot应用程序,并有计划的任务。
我们希望将应用程序部署在多台服务器上,因此将有多个应用程序实例。
如何配置Spring以仅在指定的服务器上运行计划的任务?