多个实例上的 Spring 和计划任务

新手上路,请多包涵

我们有一个 Spring Boot 应用程序,并且有计划的任务。

我们希望将我们的应用程序部署在多个服务器上,因此将部署多个应用程序实例。

如何将 Spring 配置为仅在指定服务器上运行计划任务?

原文由 Combo 发布,翻译遵循 CC BY-SA 4.0 许可协议

阅读 362
1 个回答

这是一个非常广泛的话题。有很多选择可以实现这一目标。

  1. 您可以将应用程序配置为具有多个配置文件。例如使用另一个配置文件 ‘cron’ 。并仅在具有此配置文件的一台服务器上启动您的应用程序。例如,在生产环境中,您有三台服务器(S1、S2、S3),那么您可以使用配置文件 prod 和 cron( -Dspring.profiles.active=prod,cron )在 S1 上运行。在 S2 和 S3 上,只需使用产品配置文件( -Dspring.profiles.active=prod )。

在代码中,您可以在调度程序类上使用 @Profile("cron") 。这样它只会在 cron 配置文件处于活动状态时执行

  1. 使用分布式锁。如果你的环境中有 Zookeeper,你可以使用它来实现分布式锁定系统。

  2. 您可以使用一些数据库(mysql)并创建一个示例代码来锁定其中一个表并添加一个条目。无论哪个实例获得锁,都会在这个数据库中创建一个条目并执行 cron 作业。您需要检查您的代码,如果 getLock() 成功,则继续执行。 Mysql 具有 LOCK TABLES 类的实用程序,您可以使用它来避免并发读/写。

我个人会说,选项2是最好的。

原文由 pvpkiran 发布,翻译遵循 CC BY-SA 4.0 许可协议

推荐问题