Persist setTimeout and setInterval across Node.js restarts
Asked Answered
F

2

11

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?

Frogman answered 12/7, 2012 at 14:54 Comment(5)
can't you use node cron for this?Haddock
How so? These are not cron jobs I'm setting up, they are 10-30 second timeouts based on user interactions with the app.Frogman
You could use beanstalkd for that. It can even persist.Trichromat
@JamesSimpson Did you get anywhere with this?Damaris
Yes, I ended up doing something similar to Loc Nguyen's suggestion (looks like I forgot to mark it as the answer). This solution has worked very well, and it has been in production since August without issue.Frogman
T
2

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

Trangtranquada answered 12/7, 2012 at 16:55 Comment(1)
How would you determine that app going to crash? Or you will update start_time/duration in redis every second?Shawnshawna
O
4

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.

Overplay answered 10/6, 2017 at 4:11 Comment(0)
T
2

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

Trangtranquada answered 12/7, 2012 at 16:55 Comment(1)
How would you determine that app going to crash? Or you will update start_time/duration in redis every second?Shawnshawna

© 2022 - 2024 — McMap. All rights reserved.