Кластер 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 запускается всеми рабочими одновременно, и электронное письмо отправляется рабочему в зависимости от того, сколько процессоров на сервере. Работник I выбрал свой путь, запланировав работу как:

 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
})

person sndpkpr    schedule 22.12.2017    source источник


Ответы (2)


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

person sndpkpr    schedule 22.12.2017

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

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

  // continue initializing workers here
}
person tbking    schedule 22.12.2017
comment
Спасибо за ответ. Я на самом деле придумал что-то более адекватное. Чтобы выполнить задание cron отдельно, используя crontab. Но ваш ответ правильный. :) - person sndpkpr; 22.12.2017
comment
что есть несколько серверов, которые могут быть мастером? - person Aryeh Armon; 24.02.2019