我有一个node.js应用程序,它将在多台机器上运行(可能在无服务器环境中运行)。
我想运行以下内容:
setInterval(() => {
Scanner.process()
}, 1000*60)
问题是,当相同的代码扩大规模并在5台计算机上运行时,每分钟将触发5次,而不是一次。
我以为我可以使用某种Redis锁来确保该功能在该计划下仅运行一次,无论运行多少台计算机。
关于如何最好地解决此问题的任何想法?
P.S。我不能真正依靠主机名并使代码仅在其中运行
答案 0 :(得分:0)
我假设您想解决此问题,而无需使用数据库之类的中央资源来决定谁将负责这项工作。
您可以让所有服务器运行该作业,在随机时间开始间隔...
setTimeout(() => {
setInterval(() => {
Scanner.process()
}, 1000 * 60 * num_machines)
}, 1000 * 60 * num_machines * Math.random())
缺点是您需要知道有多少其他计算机正在运行。
不确定在没有其他机器知识的情况下是否有办法做到这一点。
如果作业的结果可用于所有计算机,则可以让他们使用该信息来调整其日程表。例如,如果上一次作业的开始时间广泛可用,则每台计算机都可以推迟执行其自己的计划。即只要作业已经运行,我就不会自己运行它,直到看起来好像已经有一段时间没有运行了。