Рекомендуются ли дочерние процессы для заданий cron в Node.js? - PullRequest
0 голосов
/ 09 декабря 2018

У меня есть экспресс-сервер для моего приложения реакции.Раз в неделю каждый пользователь должен получать электронное письмо.Я посмотрел, как выполняются задачи cron в Node, и кажется, что это довольно просто.Я бы просто настроил задание cron, которое запускает соответствующую функцию, которая перебирает все адреса электронной почты и отправляет письма.Тем не менее, я не совсем уверен, так ли это.

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

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

Было бы здорово, если бы вы могли дать мне некоторые общие рекомендации и, возможно, примеры, чтобы я знал, какдля начала.Спасибо за ваше время.

1 Ответ

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

Как указано в в этом ответе , он не должен блокироваться.

Однако я думаю, что хорошей практикой является не использовать тяжелые задания cron, подобные этому, на вашем файле основного сервера.Если вы можете, вы должны запустить отдельное приложение node.js, которое будет работать только с заданиями cron.

Дочерние процессы не должны использоваться для чего-то, что вы легко можете иметь дело с JS.Вы должны хранить их для конкретных задач, таких как, например, резервное копирование БД.

var exec = require('child_process').exec;
var CronJob = require('cron').CronJob;

new CronJob('00 14 * * 4', function() {
  sendNewsletter();
}, null, true);

new CronJob('00 12 * * *', function() {
  exec('sh dbbackup.sh', function(err, stdout, stderr){
    if (err) {
        // handle error
    }
  });
}, null, true);
...