Spring boot 仅在一个服务器实例上激活批处理

Spring boot 仅在一个服务器实例上激活批处理,spring-boot,nginx,tomcat,spring-batch,load-balancing,Spring Boot,Nginx,Tomcat,Spring Batch,Load Balancing,我在两个tomcat实例前面有一个nginx负载平衡器,每个实例都包含一个spring引导应用程序。每个spring引导应用程序执行一个批处理,将数据写入数据库。 该批处理每天凌晨1点执行。 问题是这两个实例同时执行批处理,这是我不希望看到的 有没有办法让批处理部署在两个实例中,并告诉tomcat或nginx在主服务器中启动批处理,而从服务器不运行批处理 如果其中一台服务器停止,第二台服务器可以代表他启动批处理 nginx、tomcat或其他技术中是否有工具可以做到这一点 提前感谢。这里是一个简

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

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

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

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


提前感谢。

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

由于两个VM中同时触发了两个计划的方法,因此在这两个VM中都添加一个随机延迟。这个答案有很多关于如何延迟触发随机持续时间的选项

在方法内部,仅当其他VM尚未启动作业时才运行作业。这可以通过一个新的表来跟踪

以下是此设计的伪代码:

@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
     }
}
数据库或某个公共文件位置应用作两次运行之间同步的锁,因为两个VM彼此独立

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

以下是一些文档:


这是一种过于简单的设计方法

由于两个VM中同时触发了两个计划的方法,因此在这两个VM中都添加一个随机延迟。这个答案有很多关于如何延迟触发随机持续时间的选项

在方法内部,仅当其他VM尚未启动作业时才运行作业。这可以通过一个新的表来跟踪

以下是此设计的伪代码:

@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
     }
}
数据库或某个公共文件位置应用作两次运行之间同步的锁,因为两个VM彼此独立

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

以下是一些文档:


如果将两个app server实例设计为同时运行同一个作业,则通过设计,一个将成功创建作业实例,另一个将失败,此失败可以忽略。看见这是作业存储库的角色之一:在集群环境中充当防止重复作业执行的保护措施

如果其中一台服务器停止,第二台服务器可以代表他启动批处理。nginx、tomcat或其他技术中是否有工具可以做到这一点


我相信没有必要使用这样的工具或技术。如果其中一台服务器在计划执行时停机,则另一台服务器将能够接管并成功启动作业。

如果您设计两个app server实例以同时运行同一作业,则通过设计,一个将成功创建作业实例,另一个将失败,此失败可以忽略。看见这是作业存储库的角色之一:在集群环境中充当防止重复作业执行的保护措施

如果其中一台服务器停止,第二台服务器可以代表他启动批处理。nginx、tomcat或其他技术中是否有工具可以做到这一点


我相信没有必要使用这样的工具或技术。如果其中一台服务器在计划执行时停机,另一台服务器将能够接管并成功启动作业。

我实现了一个简单的BCM服务器功能,其中所有服务器都使用其唯一的IP注册创建服务器表项。服务器需要在规定的时间内注册,例如。10秒。如果服务器未在timelast update timestamp>10秒内注册,则服务器将获得由服务器取消注册的Delete Server表项,而该服务器不进行注册

最后,我有一个带有有序服务器条目的表,可以为注册的服务器定义唯一的任务

实现非常简单,工作非常完美。 之前我也考虑过Spr 我正在开发批处理作业共享功能,但我希望zu有一个更轻量级和更灵活的解决方案


目前,我在所有需要实施批处理的项目中都使用了它。

我实现了一个简单的BCM服务器功能,所有服务器都使用其唯一的IP注册创建服务器表条目。服务器需要在规定的时间内注册,例如。10秒。如果服务器未在timelast update timestamp>10秒内注册,则服务器将获得由服务器取消注册的Delete Server表项,而该服务器不进行注册

最后,我有一个带有有序服务器条目的表,可以为注册的服务器定义唯一的任务

实现非常简单,工作非常完美。 之前我也考虑过Spring批处理作业共享功能,但我希望zu有一个更轻量级和更灵活的解决方案


目前,我在所有需要实施批处理的项目中都使用它。

作业计划在特定时间运行,或由外部系统触发。在这里,您有安排在凌晨1点的作业,您正在寻找通过tomcat或nginx在一个实例而不是另一个实例上触发它们的方法。这还不清楚。你能详细说明一下你的作业是如何安排的吗?这是一个带有@EnableScheduling注释的spring调度程序。作业可以安排在特定时间运行,也可以由外部系统触发。在这里,您有安排在凌晨1点的作业,您正在寻找通过tomcat或nginx在一个实例而不是另一个实例上触发它们的方法。这还不清楚。你能详细说明一下你的作业是如何安排的吗?这是一个带有@EnableScheduling注释的spring调度器。我不使用spring批处理所有的表。只有调度程序部分,所以我没有所有的spring批处理表。我不使用作业,也不想使用作业,除非我必须使用作业case@batmaniac我错误地认为您已经在使用Spring批处理。我会更新我的答案。我不会在所有的表格中使用spring批处理。只有调度程序部分,所以我没有所有的spring批处理表。我不使用作业,也不想使用作业,除非我必须使用作业case@batmaniac我错误地认为您已经在使用Spring批处理。我会更新我的答案。