不同数据中心上的春季任务和计划任务



我有一个 Spring 调度程序,我将部署在 2 个不同的数据中心。 我的数据中心将处于主动和被动模式。我正在寻找一种机制,其中被动数据中心调度程序在该数据中心变为活动状态的地方开始工作。 我们可以使用手动将某些配置更改为真/假来做到这一点,但是,我正在寻找一个自动化过程。

-初始状态:

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

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

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

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

我们应用了这个,它在我们的一个应用程序中运行得很好。实际上,它比上面解释的要复杂得多,因为我们有很多应用程序实例,我们必须避免在它们之间发起所有权之争。为了解决这个问题,我们制定了"处理请求的权限"概念,因此无论有多少实例想要控制,都只有一个被授予。

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

同样,一切都取决于您的用例,对我们来说,信号量表在第一种情况下已经足够好了,但在第二种情况下证明很糟糕,因为多个进程试图同时更新同一个表,最终导致大量数据库争用,这把我们带到了 Hazelcast。

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

希望有帮助,只是我们经验中的想法。祝你好运。

最新更新