【问题标题】:Persist setTimeout and setInterval across Node.js restarts在 Node.js 重新启动时保持 setTimeout 和 setInterval
【发布时间】:2012-07-12 14:54:16
【问题描述】:

我使用 setTimeout 和 setInterval 为每个连接的用户设置了相当多的服务器端超时,这些超时可以持续 10-30 秒。如果 Node.js 实例在这些超时之一的中间重新启动,它们显然会在重新启动时全部清除,这可能会给这些用户带来一些问题。我将如何坚持这些超时,或者是否有任何模块已经对此有所帮助?

【问题讨论】:

  • 你不能为此使用 node cron 吗?
  • 怎么样?这些不是我设置的 cron 作业,它们是基于用户与应用程序交互的 10-30 秒超时。
  • 你可以使用 beanstalkd。它甚至可以持续存在。
  • @JamesSimpson 你有什么收获吗?
  • 是的,我最终做了类似于 Loc Nguyen 的建议的事情(看起来我忘了将其标记为答案)。该解决方案运行良好,自 8 月以来一直在生产中,没有出现任何问题。

标签: javascript node.js settimeout setinterval


【解决方案1】:

setTimeOut 将延迟作为参数,因此在设置超时时,捕获currentServerTime + delayserverTriggerTime 并将其保存在数据库中。然后,在服务器重新启动时,使用serverTriggerTime 创建相同的计时器。 然后,delay = serverTriggerTime - currentServerTime,使用这个延迟来设置新的计时器。

设置定时器时

const date = Date.now();
const serverTriggerTime = date + delay; // time in milliseconds

服务器重启时:

serverTriggerTime = // retrieve from DB.
newDelay = serverTriggerTime - Date.now();

另外,只有当 newDelay >= 0 时才设置新的计时器,这意味着触发时间尚未达到,将在 newDelay 时间之后发生。

【讨论】:

    【解决方案2】:

    我会将开始时间和持续时间存储在 Redis 中,并在您的应用程序重新加载时重新启动不完整的计时器。一些 Redis 模块:

    https://github.com/joyent/node/wiki/modules#wiki-db-nosql-redis

    【讨论】:

    • 您如何确定该应用程序会崩溃?或者你会每秒更新 redis 中的 start_time/duration?
    猜你喜欢
    • 2021-12-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多