我为每个连接的用户设置了很多服务器端超时,其中setTimeout和setInterval可以持续10-30秒。如果Node.js实例在其中一个超时中间重新启动,则显然它们在重新启动时都被清除,这可能会导致这些用户出现一些问题。我将如何坚持这些超时,或者是否有任何模块可以帮助解决这个问题?
答案 0 :(得分:1)
我会在Redis中存储开始时间和持续时间,并在应用程序重新加载时重新启动不完整的计时器。一些Redis模块:
https://github.com/joyent/node/wiki/modules#wiki-db-nosql-redis
答案 1 :(得分:1)
setTimeOut
需要延迟作为参数,因此在设置超时时,捕获' currentServerTime + delay
'说' serverTriggerTime
'并将其保留在DB中。然后,在重新启动服务器时,使用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时间之后发生。