集群环境中的调度器

Scheduler in clustered environment

我们的 (Spring) 应用程序包含几个 Schedulers,它们在夜间激活以 change/update Batch 中的一些数据(来自 Database)。

这一切 运行 都很好,问题是我们的应用程序很快就会 运行 在 clustered environment.

防止 schedulerinstance Ainstance B 同时做同样的工作的最佳选择是什么?

** 更新 **
集群环境设置为'active-active'
每个节点都与其自己的数据库实例进行通信。每个数据库实例都会 replicate 数据到其他实例。
数据库实例未设置为 'master-slave',但将 运行 设置为 Galera cluster,其中每个实例都执行插入-更新-删除操作。

因此每个 scheduler 应该 运行 在一个实例中只出现一次。其他实例不应该 运行 调度程序。所以我需要找到一种方法,一个实例的调度程序 运行s,其他实例的相同调度程序不应该 运行.

您应该将不同的任务委派给集群中的节点。晚上数据库在做什么工作?

如果节点在负载均衡器后面正确集群,则只有一个节点应该接收更新以写入数据库。

您可以使用Zookeeper来管理节点并设置一个primary来执行单独调度。

您将拥有代码来处理两个集群中的计划事件。有两种方法。

  1. 您可以选择 运行 在任何一个集群中举办此活动。然后你需要确保当这个集群关闭时,你会切换其他集群中的调度程序。以及类似的维护问题。
  2. 您可以选择 运行 两个集群中的此类事件。实施方式的差异是所有集群都将轮询并且任何一个集群都会成功 运行 它。 polling/locking.
  3. 可选择数据库或jms消息

我更喜欢第二种方法——写一次。

你没有说明你使用的是哪种Schedulers
您正在寻找的是持久性调度。 JEE 对此有支持,Quartz 也有。 Spring 开箱即用,但如果您愿意,它可以很好地与 Quartz 集成。

使用持久化调度器,作业被添加到数据库中,触发器在"transaction"中运行(不确定是否是实际事务),确保只有一个调度器可以运行触发器。
但是它需要一些数据库表来管理。

为了完整起见:我们最终得到了持久性 Quartz job scheduling
This post 对 Quartz schedulingSpring 的持久性帮助了我很多。