const cluster = require('cluster')
, http = require('http')
, os = require('os');
const cpus = os.cpus().length;
// 3 Уровня создание кластера воркеров
// 1 уровень - уровень прослушивания всех событий для всех воркеров
cluster.on('message', function (worker, message, handle) {
console.log('All messages: ' + worker.id + ' | ' + message);
});
cluster.on('fork', function (worker) {
console.log('Worker ' + worker.id + ' forked.');
});
if (cluster.isMaster) {
// 2 уровень - уровень создания воркеров и уровень прослушивания событий для каждого конкретного воркера
for (let i = 0; i < cpus; i++) {
let worker = cluster.fork(); // Создание воркера
// Навешивание событий на конкретный созданный воркер
worker.on('listening', (address) => {
console.log(JSON.stringify(address));
});
worker.on('message', function (message) { // Получение сообщения из мастер-процесса кластера
console.log(message + ' master ' + process.pid);
worker.send('shutdown'); // Посылка сообщения из воркера в мастер-процесс кластера
worker.kill(); // Уничтожение текущего активного воркера
});
}
cluster.on('exit', function (worker, code, signal) {
console.log('Worker ' + worker.id + ' killed.');
});
} else if (cluster.isWorker) {
// 3 уровень - уровень кода воркера и посылки сообщений из мастер-процесса кластера текущему активному воркеру
// Код воркера
http.createServer(function (request, response) {
response.writeHead(200, 'OK');
response.end('HI ' + process.pid);
process.send('Done: ' + process.pid); // Посылка сообщения из мастер-процесса кластера текущему активному воркеру
}).listen(8000, '127.0.0.1', function () {
console.log('Server started ' + process.pid);
});
// Получение сообщения из текущего активного воркера мастер-процессом кластера
process.on('message', function (message) {
console.log('Message from worker: ' + message);
});
}
Спасибо за статью. Все очень хорошо расписано :)
ОтветитьУдалить