10

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

4

2 回答 2

4

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 时间之后发生。

于 2017-06-10T04:11:50.390 回答
2

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

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

于 2012-07-12T16:55:50.387 回答