我需要在具有不同节点的Docker集群中批处理我的应用程序Spring。我在docker-compose上找到了set replicas = 1的解决方案,但在我看来,这不是最好的解决方案,因为它最大限度地降低了Docker的潜力。
一些帮助或建议?谢谢。
如果我理解你正确,你想运行一个spring应用程序的几个副本(如果这是由docker,k8s管理,它是独立的,等等)。然后,您希望仅在一个实例上启动后台作业。对?在这种情况下,我可能会建议你看看ShedLock。
ShedLock只做一件事。它确保您的计划任务最多同时执行一次。如果正在一个节点上执行任务,它将获取一个锁,该锁可防止从另一个节点(或线程)执行相同的任务。请注意,如果一个任务已经在一个节点上执行,则其他节点上的执行不会等待,只是跳过它。
它在Spring中顺利集成。例如,计划的批处理作业可能如下所示:
@Scheduled(cron = ...)
@SchedulerLock(name = "scheduledTaskName")
public void scheduledTask() {
// do something
}
可以在引擎盖下使用各种选项来实现分布式锁定,例如, MySQL,Redis,Zookeeper等。