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ę
Odpowiedz
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
Jak określić, czy aplikacja ulegnie awarii? Czy będziesz aktualizował czas rozpoczęcia/czas trwania w trybie redis co sekundę? –
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 .
nie możesz użyć do tego węzła cron? – albertjan
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ą. –
Możesz użyć beanstalkd do tego. Może nawet przetrwać. – Alfred