仅运行一次但可在多个主机上运行的Cron式调度程序

时间:2018-06-26 22:01:57

标签: node.js redis

我有一个node.js应用程序,它将在多台机器上运行(可能在无服务器环境中运行)。

我想运行以下内容:

setInterval(() => {
  Scanner.process()
}, 1000*60)

问题是,当相同的代码扩大规模并在5台计算机上运行时,每分钟将触发5次,而不是一次。

我以为我可以使用某种Redis锁来确保该功能在该计划下仅运行一次,无论运行多少台计算机。

关于如何最好地解决此问题的任何想法?

P.S。我不能真正依靠主机名并使代码仅在其中运行

1 个答案:

答案 0 :(得分:0)

我假设您想解决此问题,而无需使用数据库之类的中央资源来决定谁将负责这项工作。

您可以让所有服务器运行该作业,在随机时间开始间隔...

setTimeout(() => {
    setInterval(() => {
        Scanner.process()
    }, 1000 * 60 * num_machines)
}, 1000 * 60 * num_machines * Math.random())

缺点是您需要知道有多少其他计算机正在运行。

不确定在没有其他机器知识的情况下是否有办法做到这一点。

如果作业的结果可用于所有计算机,则可以让他们使用该信息来调整其日程表。例如,如果上一次作业的开始时间广泛可用,则每台计算机都可以推迟执行其自己的计划。即只要作业已经运行,我就不会自己运行它,直到看起来好像已经有一段时间没有运行了。