gpt4 book ai didi

spring-boot - 仅在一个服务器实例上激活 Batch

转载 作者:行者123 更新时间:2023-12-02 00:07:10 25 4
gpt4 key购买 nike

我在两个 tomcat 实例前面有一个 nginx 负载均衡器,每个实例都包含一个 spring boot 应用程序。每个 spring boot 应用程序执行一个将数据写入数据库的批处理。该批处理每天凌晨 1 点执行。问题是两个实例同时执行我不想要的批处理。

有没有办法让批处理部署在两个实例中,并告诉 tomcat 或 nginx 在主服务器中启动批处理(并且从服务器不运行批处理)。

如果其中一台服务器停止,第二台服务器可以代表他启动批处理。

nginx 或 tomcat(或其他一些技术)中是否有工具可以做到这一点?

提前致谢。

最佳答案

这是一个简单的设计方法。

由于您在 2 个 VM 中同时触发了两个计划方法,因此请为两者添加一个随机延迟。这个答案有很多关于如何将触发器延迟随机持续时间的选项。 Spring @Scheduled annotation random delay

只有在作业尚未启动(由其他虚拟机启动)时,才在该方法内运行该作业。这可以通过一个新表来跟踪这一点来完成。

这里是这个设计的伪代码:

@Scheduled(cron = "schedule expression")
public void batchUpdateMethod() {
//Check database for signs of job running now.
if (job is not running){
//update database table to indicate job is running
//Run the batch job
//update database table to indicate job is finished
}
}

数据库或一些公共(public)文件位置应该用作两个运行之间同步的锁,因为两个 VM 彼此独立。

要获得更健壮的设计,请考虑使用 Spring BatchSpring Batch 为其作业使用数据库 (JobsRepository)。默认情况下,内存数据源用于跟踪正在运行的作业及其状态。在您的设置中,这 2 个实例(很可能)使用它们自己的内存数据库。如果 jobsRepository 数据库共享,Spring Batch 的多个实例可以作为一个集群相互协调,一个可以运行作业,而另一个可以作为备份。为此,您需要将 2 个实例配置为使用公共(public)数据源。

以下是一些文档: https://docs.spring.io/spring-batch/docs/current/reference/html/index-single.html#jobrepository

https://docs.spring.io/spring-batch/docs/current/reference/html/job.html#configuringJobRepository

关于spring-boot - 仅在一个服务器实例上激活 Batch,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/60216411/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com