我有一个要在多台机器上运行的 node.js 应用程序(可能在无服务器环境中)。
我想运行类似的东西:
setInterval(() => {
Scanner.process()
}, 1000*60)
问题是,当相同的代码被放大并在 5 台机器上运行时,它将每分钟触发 5 次,而不是一次。
我想我可以使用某种 Redis 锁来确保函数在该计划中只运行一次,无论有多少台机器运行它。
关于如何最好地解决这个问题有什么想法吗?
附言我不能真正依赖主机名并让代码只在那里运行
最佳答案
我假设您想在不使用数据库等中央资源来决定谁将运行该作业的情况下解决此问题。
您可以让所有服务器运行该作业,在随机时间开始间隔...
setTimeout(() => {
setInterval(() => {
Scanner.process()
}, 1000 * 60 * num_machines)
}, 1000 * 60 * num_machines * Math.random())
缺点是您需要知道有多少其他机器正在运行。
如果不了解其他机器,不确定是否有办法做到这一点。
如果作业的结果对所有机器都可用,您可以让他们使用该信息来调整他们的日程安排。例如,如果最后一个作业开始时间广泛可用,则每台机器都可以推迟执行自己的计划。 IE。只要作业一直在运行,我不会自己运行它,直到它看起来有一段时间没有运行。
关于node.js - 只运行一次但在多个主机上运行的 Cron 样式调度程序,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51051931/