2015-05-31 2 views
0

Я хочу запланировать запуск некоторого кода за переменную. Например, через 60 минут я хочу отправить HTTP-запрос конечной точке и обновить документ базы данных, но я также хочу иметь возможность отменить этот код от запуска, если действие происходит до этого 60 минут.NodeJS код запуска за X минут архитектуры

Каков наилучший способ сделать это? Я хочу, чтобы он смог пережить перезагрузку сервера, а также работать, если мое приложение масштабируется на нескольких серверах.

Спасибо!

+0

Если вы масштабируетесь на нескольких секундах, вам понадобится какой-либо агент, который координирует, какой сервер делает то, что предназначено для времени. Существует много разных возможных подходов, и поскольку вы подробно рассказали о том, что вы на самом деле делаете, трудно сделать конкретную рекомендацию. Вы можете использовать все задания cron на пользовательский сервер, который управляет рабочей очередью и передает задачи другим серверам, чтобы серверы могли получать рабочие элементы непосредственно из общей базы данных. – jfriend00

+0

@ jfriend00 спасибо, просто нужно какое-то направление. Теперь смотришь в киэ. – timmyg13

ответ

1

Для этого вы должны использовать setTimeout() и сохранить идентификатор таймера, который он возвращает, потому что вы можете использовать этот идентификатор таймера, чтобы отменить таймер. Для планирования таймера:

var timer = setTimeout(myFunc, 60 * 60 * 1000); 

Затем, спустя некоторое время перед срабатыванием таймера, вы можете отменить таймер с:

clearTimeout(timer); 

Если вы хотите, чтобы выжить после перезапуска сервера, то вам необходимо для сохранения фактического системного времени, которое вы хотите, чтобы таймер загорелся в каком-либо постоянном хранилище (например, файл конфигурации на диске или базе данных). Затем, когда ваш сервер запускается, вы читаете это значение из постоянного хранилища и, если оно установлено, вы устанавливаете новый setTimeout(), который будет запускаться в это время. Аналогично, когда таймер срабатывает или когда вы очищаете таймер, потому что он вам больше не нужен, вы затем обновляете постоянный магазин, чтобы там не было будущего времени.

Вы можете сделать это достаточно чистым для использования, создав объект persistentTimer, у которого был метод установки таймера, очистки таймера и инициализации из любого постоянного хранилища, которое вы используете при перезапуске сервера.

+0

Что делать, если мое приложение масштабируется на нескольких серверах? Если приложение запускается на нескольких серверах, оно будет дублировать setTimeouts на разных серверах. Извиняюсь за то, что не упоминал об этом в оригинальном посте. Я обновлю. – timmyg13

+0

@ timmyg13 - что вы ожидаете от ответа? Вы, очевидно, должны решить, какой сервер будет обслуживать эту конкретную деятельность. Включая многостраничную часть вашего вопроса без какой-либо подробной информации о том, как это работает или что делает деятельность, делает ваш вопрос слишком широким для любого конкретного ответа. И, да, редактируя свой вопрос, чтобы включить этот факт, ПОЛНОСТЬЮ меняет весь вопрос, и теперь даже близко не хватает деталей, чтобы даже знать, какой может быть соответствующий ответ. – jfriend00