Persist setTimeout and setInterval across Node.js restarts

瘦欲@ 提交于 2019-12-23 07:59:04

问题


I set quite a few server-side timeouts with setTimeout and setInterval for each connected user that can last for 10-30 seconds. If the Node.js instance restarts in the middle of one of these timeouts, they are obviously all cleared on restart, which can cause some issues for these users. How would I go about persisting these timeouts, or are there any modules that already help with this?


回答1:


I would store the start times and durations in Redis and restart incomplete timers when your application reloads. Some Redis modules:

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




回答2:


setTimeOut takes delay as parameter, so when setting timeout, capture 'currentServerTime + delay' say 'serverTriggerTime' and persist this in DB. Then, on restart of server, create the same timer using the serverTriggerTime. Then, delay = serverTriggerTime - currentServerTime, use this delay to set new timer.

When setting timer

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

On server restart:

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

Also, set new timer only if newDelay >= 0, meaning the trigger time has not reached and will happen after newDelay time.



来源:https://stackoverflow.com/questions/11454587/persist-settimeout-and-setinterval-across-node-js-restarts

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!