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