Кластер Nodejs назначает задачу только одному работнику (любому)

Проблема, с которой я сталкиваюсь, заключается в том, что проект уже запрограммирован с cluster распределить задание.

if (cluster.isMaster) {
  // Fork workers.
  for (var i = 0; i < numCPUs; i++) {
    cluster.fork();
  }
  cluster.on('exit', (worker, code, signal) => {
  });
} else {
var server = http.createServer(app);
var usernames = {};
var showusernames = {};
var usersmessages = [];
require('../server/controllers/communication/chat.js').chatConfig(io, usernames);
    /**
     * Listen on provided port, on all network interfaces.
     */
    server.listen(port);
    server.on('error', onError);
    server.on('listening', onListening);
    }

У меня есть основная идея, что этот код предназначен для распределения задач между процессорами и поддержания работоспособности сервера в случае сбоя одного процессора.

Вопрос в том, что все работало нормально, пока я не начал работать с узлом, чтобы запланировать cron работа (которая будет отправлять электронную почту). Теперь cron запускается всеми работниками одновременно, и электронное письмо отправляется работнику в зависимости от того, сколько процессоров находится на сервере. Я выхожу, планируя работу как:

 if(cluster.isWorker)
 if(cluster.worker.id == 1){
   cron.schedule('*/1 * * * *', function() {
     //CRON JOB
 })
 } 

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

Есть ли способ получить только первого свободного работника и назначить ему задание.

Теперь я попробовал это

var wokerArr = []
wokerArr.push(cluster.worker.id)
if(cluster.worker.id == wokerArr[0])
cron.schedule('*/1 * * * *', function() {
    //CRON JOB
})

2 ответа

Я сделал это с помощью crontab, Создание отдельного файла cron и планирование работы с использованием crontab в командной строке, чтобы запланировать работу. Спасибо за помощь.

Вы можете запланировать cron в самом процессе. Крону нужно обращаться идемпотентно.

if (cluster.isMaster) {
  cron.schedule('*/1 * * * *', function() {
     //CRON JOB
  })

  // continue initializing workers here
}
Другие вопросы по тегам