Запустить только один экземпляр задачи узла - PullRequest
0 голосов
/ 14 декабря 2018

Описание: У меня есть модуль узла, который анализирует страницы внешнего мониторинга и передает ежедневные данные в дб.Эта задача может занять около 10 минут и запланирована на выполнение один раз в день через node-cron.У меня также есть страница, где вы можете запустить эту задачу вручную с дополнительными аргументами (например, идентификатор или дата).Доступ к нему осуществляется по экспресс-маршруту (скажем, app.post('/manual-task', runTask)).Задание Cron и HTTP-маршрут являются частью приложения Express Restfull API.

Вопрос: Мне нужен только один запущенный экземпляр этого модуля (фактически это модуль класса), например, кто-то запускает эту задачу на странице, но для этой задачи уже запущено задание cron.Он должен предупредить пользователя, что работа уже выполняется.У меня есть некоторые идеи, но я хотел бы избежать плохих практик:

  • pid?
  • переменная окружения?
  • cron задание как запрос к api вместо прямого выполнения?
  • следует ли использовать дочерний процесс, если я запускаю его внутри экспресс-маршрута?

Каков наилучший способ и практика, как этого добиться?

Спасибо

1 Ответ

0 голосов
/ 14 декабря 2018

Похоже, вам нужен постоянный способ для нескольких экземпляров вашего процесса делиться состоянием.Если возможно, лучшим подходом будет системно-независимый (то есть не что-то на работающей машине, например, pid или переменная env), чтобы ваше решение могло масштабироваться до нескольких машин для развертывания API отдельно от задания cron.

Существует несколько подходов в зависимости от ваших требований, но все они вращаются вокруг вашего процесса:

  • делает проверку при первом запуске, чтобы увидеть, запущен ли другой процесс.
    • если один есть, потенциально бросить?Логика зависит от вас.
    • В противном случае текущий процесс должен записать, что он запущен.
  • выполнить анализ.
  • запись, которая у него естьостановлен, когда он завершит анализ.

Лучший способ сделать это - каждый процесс получить Lock при запуске, возможно, используя Redisкак замок .Есть даже библиотека для узла .

Если вы не слишком беспокоитесь о Race Condition , вам не нужно реализовывать систему блокировки.Я бы по-прежнему рекомендовал что-то вроде Redis хранить во время работы процесса, но вы также можете просто записать в файл или что-то подобное.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...