Кластер 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
}