Spring 和不同数据中心的计划任务

Spring and scheduled tasks on different Data Centers

我有一个 spring 调度程序,我将在 2 个不同的数据中心部署它。 我的数据中心将处于主动和被动模式。我正在寻找一种机制,让被动数据中心调度程序在该数据中心变得活跃的地方开始工作。 我们可以通过手动将一些配置更改为 true/false 来实现,但是,我正在寻找一个自动化过程。

-初始状态:

Data center A active - Scheduler M is running.
Data center B passive - Scheduler M is turned off.

-可能是3天后。

Data center A passive - Scheduler M turned off.
Data center B active - Scheduler M is starting

我不知道您的业务需求,但除非您想要多个实例 运行ning 但只有一个处于活动状态,否则您拥有负载均衡器的目的是将负载分散到同一实例的多个实例应用程序而不是只坚持一个实例。

无论如何,我认为一种不使用非常复杂的机制(根据您 运行 您的应用程序的位置会带来很多复杂性)的简单方法是这样的:

  1. 在您的数据库中有共享位置,例如信号量table,用于存储拥有调度程序进程的应用程序实例的 ID
  2. 为每个任务设置超时。假设调度程序应该每两分钟 运行 将超时设置为两分钟。
  3. 让您的调度程序始终在所有应用程序实例上启动
  4. 一旦任务开始,首先检查它是否是拥有处理的人。如果是,则进行工作,如果不是,则进行第 7 点。
  5. 完成工作后在信号量中记录任务完成的时间戳table
  6. 等待下一次开球的时间
  7. 如果不是拥有处理的任务,请检查信号量 table 中任务最后一次 运行 的时间。如果自上次 运行 以来的时间大于为该进程设置的超时时间,则取得该进程的所有权(在信号量 table 中记录您的应用程序实例 ID)

我们在我们的一个应用程序中很好地应用了它,运行。实际上,它比上面解释的要复杂得多,因为我们有很多应用程序实例,我们必须避免在它们之间引发所有权之争。为了解决这个问题,我们提出了一个 "Permission to process request" 概念,因此无论有多少实例想要控制,它都只有一个被 g运行ted。

对于另一个具有类似要求的应用程序,我们使用了一种更简单的方法来实现这一点,但我们付出的代价是使用 Hazelcast IMGB 框架中的 ILock 需要一些额外的学习曲线。这真的很容易,但请记住,Hazelcat 社区版完全没有安全性,仅仅为了实现这一点而支付 Hazelcast 许可证可能会有点开销。

同样,一切都取决于您的用例,对我们来说,信号量 table 在第一个场景中已经足够好了,但在第二个场景中证明很糟糕,因为多个进程试图更新相同的 table同时以大量数据库争用结束,这将我们带到了 Hazelcast。

其他想法是自定义健康检查实现,它可以根据收到的响应触发激活一个调度程序或另一个调度程序。

希望对您有所帮助,这只是我们的经验之谈。祝你好运。