Для действительно длительных таймеров вам необходимо каким-то образом хранить данные тайм-аута на диске.Как вы упомянули, если вы делаете это исключительно в памяти, вы потеряете информацию о времени при перезапуске сервера.
Способ справиться с этим прост.Это тот же алгоритм, который использует cron:
Запись, когда вы хотите, чтобы тайм-аут произошел на диске - формат зависит от вас, вы можете использовать формат cron или придумать свой собственный.Поскольку это javascript, у меня будет соблазн просто записать в формате JSON.
Считайте файл синхронизации в вашу программу.Есть два способа сделать это.Если вас беспокоит производительность во время выполнения, прочитайте ее один раз при запуске вашей программы.Однако это означает, что вам нужно перезагрузить сервер, если вы редактируете файл.Если вы хотите, чтобы обновления для файла были получены автоматически, читайте его каждый раз, когда вы хотите обработать события синхронизации.
Периодически запускать цикл таймера.Крон, например, имеет разрешение в одну минуту.Поэтому cron запускает цикл таймера каждую минуту.Если это достаточно хорошо, чем бегать каждую минуту.Для меня я бы делал setInterval()
каждые 30 секунд или около того.Обратите внимание, что запуск цикла таймера каждую секунду не так уж и тяжел в JavaScript на любом приличном процессоре.
Обработка событий таймера из файла в цикле таймера.Просмотрите все события и проверьте, не истек ли срок их действия.
Вот и все.Так работают все системы планирования (календарь Google, cron и т. Д.).
Вот очень простая реализация javascript:
var events = require("events.js");
// Assume events.js look something like:
// return [ {
// timeout: <millisecs like what Date.now() returns>,
// callback: <function>
// } ]
setInterval(function(){
var now = Date.now();
events.forEach(e=>{
if (e.timeout >= now) {
e.callback(); // execute event
}
});
events = events.filter(e=>e.timeout<now); // remove stale events
},10000); // every 10 seconds
Вы можете добавить такие необычные функции, как сохранение текущих событий на диск, если в коде есть какие-либо изменения, сделать формат тайм-аута понятным для человека.для отладки определите систему для передачи аргументов в функцию обратного вызова события и т. д. Но суть очень проста.