node.js - 只运行一次但在多个主机上运行的 Cron 样式调度程序

标签 node.js redis

我有一个要在多台机器上运行的 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/

相关文章:

ajax - nodejs 中的 session 处理。 CORS问题

redis - 在 Redis 中处理多个列表的最佳方式?

python - 将 Azure Web 应用连接到 Azure Redis 缓存

node.js - Firebase 监听器占用大量内存

json - 使用socket.io 进行广播?

node.js - Node 中嵌套 readFiles 的 Promise 模式

redis - 将列表与哈希表匹配

php - Laravel 5.5 Session 在每个请求中丢失

redis - 数据不会从 Redis 主服务器复制到从服务器

javascript - Angular2 快速入门 - 'Cannot Get' 消息