Java 如何为不同服务器上的计划任务创建仲裁器
我正在寻找一个很好的解决方案,如何从几个实例中执行一个计划任务 问题: 我有一个带Spring Boot的Java服务器。此外,我还有一个通过使用Java 如何为不同服务器上的计划任务创建仲裁器,java,spring,postgresql,Java,Spring,Postgresql,我正在寻找一个很好的解决方案,如何从几个实例中执行一个计划任务 问题: 我有一个带Spring Boot的Java服务器。此外,我还有一个通过使用@scheduled(cron=“…”)注释运行的计划任务。我的应用程序使用负载平衡器,通常在3个实例上工作。计划任务不更新postgres DB,并且计划任务始终同时在3台服务器上运行 如何仅在一台服务器上运行计划任务 非常感谢 你必须以某种方式选择一个领导者,选择一个领导者可能非常困难。然而,有相当多的解决方案可以帮助选择领导者 我个人很喜欢。但是
@scheduled(cron=“…”)
注释运行的计划任务。我的应用程序使用负载平衡器,通常在3个实例上工作。计划任务不更新postgres DB,并且计划任务始终同时在3台服务器上运行
如何仅在一台服务器上运行计划任务
非常感谢 你必须以某种方式选择一个领导者,选择一个领导者可能非常困难。然而,有相当多的解决方案可以帮助选择领导者 我个人很喜欢。但是,根据您已经使用的工具,可能已经有一些工具可以提供所需的领导人选举支持,如Redis()或您的数据库(->咨询锁)
但是,如果您不需要故障切换功能,最简单的解决方案是将一个应用程序配置为配置文件中的lead,并且在未设置配置时不执行任务。我正在考虑一个实例中的一个应用程序可能因执行硬操作而被卡住的情况,因此,在这种情况下,计划的任务必须在第二台服务器上运行,而不是在
leader
上运行,那么您很可能需要某种超时,例如,如果在n分钟内没有进展,则假定进程失败,并在另一个节点上计划工作。然后,另一个节点可以收集锁并开始处理。此外,您还可以在表格中记录所做的工作。stackoverflow上有多篇关于带有postgres的工作队列的帖子,只需搜索它们。我已经使用Redis的distlock完成了锁定,谢谢!