在多节点环境中仅触发一次调度作业

Posted

技术标签:

【中文标题】在多节点环境中仅触发一次调度作业【英文标题】:Triggering schedule job only once in multiple node environment 【发布时间】:2018-06-15 07:18:39 【问题描述】:

我正在使用 Docker swarm 模式运行多个 Java (Spring Boot) 应用程序实例,我想每天运行两次调度作业,但它只需要由一个应用程序实例触发。

是否有任何机制可以配置 Spring Boot 应用程序和 Docker swarm 只运行一次该计划任务?

我在 Jive 房产中见过:

<property name="allNodes" value="false"/>

现在我想知道是否可以在我的基础架构上做一些类似的事情。

应用程序实例在同一个网络中,所以我想网络发现不会是问题。

【问题讨论】:

不确定 docker swarm,但我已经通过其他几种方式实现了这一点。 1. 通过获取数据库表的锁。 2.使用zookeeper 3、使用分布式锁 你有 Zookeeper 设置吗? 我们没有zookeeper,也没有这个应用程序中的数据库(它只是计算某些东西)。如果可能的话,我想只用 Spring 和 Docker 来解决它,否则我们将不得不使用一些替代方法。 【参考方案1】:

您可以创建一个节点作为主节点,并且计划的作业将仅在主节点中运行。失败时,其他节点将提升并成为主节点,从而有资格运行该作业。

或者你可以创建一个分布式锁(Hazelcast 支持分布式锁)。每个节点都会调用 tryLock()。节点获胜将允许运行作业。

【讨论】:

我们有 5 个应用副本,目前没有一个是主副本。也许尝试使用主节点,然后再引入 Hazelcast(计划在未来使用)。感谢您的回答!

以上是关于在多节点环境中仅触发一次调度作业的主要内容,如果未能解决你的问题,请参考以下文章

NodeJs 在多个节点上调度作业

ETL作业调度软件TASKCTL4.1单机部署

在多焦点 d3 力布局中重新定位节点

ETL作业调度软件TASKCTL4.1怎么安装?

在多节点集群上安装 HappyBase

Springboot整合Elastic-Job