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

问题描述 投票:0回答:1

我有一个Spring Scheduler,我将在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
spring-boot spring-scheduled
1个回答
0
投票

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

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

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

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

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

再次取决于您的用例,对我们来说,信号量表在第一种情况下足够好,但在第二种情况下却很糟糕,因为尝试同时更新同一张表的多个进程最终导致大量数据库争用这带我们去了Hazelcast。

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

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

© www.soinside.com 2019 - 2024. All rights reserved.