2012-07-12 6 views
8

Ustawiam kilka timeoutów po stronie serwera z setTimeout i setInterval dla każdego podłączonego użytkownika, który może trwać 10-30 sekund. Jeśli instancja Node.js uruchomi się ponownie w trakcie jednego z tych limitów czasu, oczywiście wszystkie są wyczyszczone po ponownym uruchomieniu, co może powodować problemy dla tych użytkowników. Jak mam zachować te limity czasowe, czy są jakieś moduły, które już w tym pomagają?Trwałe ustawienie setTimeout i setInterval dla Node.js restartuje się

+0

nie możesz użyć do tego węzła cron? – albertjan

+1

Jak to zrobić? Nie są to zadania cron, które konfiguruję, są to 10-30 sekundowe limity czasu na podstawie interakcji użytkownika z aplikacją. –

+0

Możesz użyć beanstalkd do tego. Może nawet przetrwać. – Alfred

Odpowiedz

1

Chciałbym przechowywać czasy rozpoczęcia i czasy trwania w Redis i wznowić nieukończone timery, gdy aplikacja przeładuje. Niektóre moduły Redis:

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

+0

Jak określić, czy aplikacja ulegnie awarii? Czy będziesz aktualizował czas rozpoczęcia/czas trwania w trybie redis co sekundę? –

1

setTimeOut trwa opóźnienie jako parametr, więc przy ustalaniu limitu czasu, przechwytywanie 'currentServerTime + delay' powiedzieć 'serverTriggerTime' i utrzymują to w DB. Następnie, po ponownym uruchomieniu serwera, utwórz ten sam programator przy użyciu serverTriggerTime. Następnie, delay = serverTriggerTime - currentServerTime, użyj tego opóźnienia, aby ustawić nowy timer.

Podczas ustawiania timera

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

na restart serwera:

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

Ponadto, należy ustawić nowy timer tylko jeśli newDelay> = 0, co oznacza, że ​​czas wyzwalania nie został osiągnięty i stanie się po raz newDelay .