Многопроцессорная обработка в NodeJs

Один экземпляр Node работает в одном потоке. Чтобы воспользоваться преимуществами многоядерных систем, пользователь иногда хочет запустить кластер процессов Node для обработки нагрузки. Модуль кластера позволяет легко создать сеть процессов, которые совместно используют серверные порты.

Пример кода

Однопоточный сервер NodeJS имел бы следующий фрагмент кода

const http = require('http');
const port = 4000;
function init() {
  startHttpServer();
}
function startHttpServer() {
    var httpsServer = http.createServer(function (req, res) {
        res.writeHead(200);
        res.end("Hello Viewer!");
    });
    httpsServer.listen(port);
}
init();
Войти в полноэкранный режим Выйти из полноэкранного режима

Приведенный выше код будет работать на одном ядре в вашей многоядерной среде.

Поэтому, чтобы воспользоваться преимуществами NodeJs process & чтобы форкнуть наш процесс для увеличения пропускной способности программы, необходимо сделать следующие изменения

const os = require('os');
const http = require('http');
const cluster = require('cluster');
const port = 4000;
function init() {
    if (cluster.isMaster) {
        let numCPUs = os.cpus().length;
        console.log(" Num of CPU ", numCPUs);
        for (let idx = 0; idx < numCPUs; idx++) {
            cluster.fork();
        }
    } else {
        startHttpServer();
    }
}
function startHttpServer() {
    var httpsServer = http.createServer(function (req, res) {
        res.writeHead(200);
        res.end("Hello Viewer!");
    });
    httpsServer.listen(port);
}
init();
Войдите в полноэкранный режим Выйти из полноэкранного режима

Модули cluster & os помогут нам достичь этого. Приведенный выше код дает нам информацию о том, сколько ядер у нашей среды.
В моей системе количество CPU равно 8 (это может отличаться в зависимости от вашей системы & окружения).
Главное, что нужно заметить, это то, что текущий процесс является ведущим, потому что только ведущий может форкать рабочих.

Связь между ведущим и рабочим процессами

До этого момента мы понимали, что кластерный модуль берет наши процессы и порождает их снова как отдельный процесс в ОС. Между рабочими и мастером нет никакого обмена памятью. Чтобы установить это, нам необходимо установить коммуникационное сообщение

const os = require('os');
const http = require('http');
const cluster = require('cluster');
const port = 4000;
function init() {
    if (cluster.isMaster) {
        let numCPUs = os.cpus().length;
        console.log(" Num of CPU ", numCPUs);
        for (let idx = 0; idx < numCPUs; idx++) {
            let worker = cluster.fork();
            worker.on('message', function (msg) {
                console.log("Worker " + msg.worker + " served a " + msg.cmd);
                worker.send("Good work!");
            });
        }
    } else {
        startHttpServer();
    }
}
function startHttpServer() {
    process.on('message', function (msg) {
        console.log(msg);
    });
    var httpsServer = http.createServer(function (req, res) {
        res.writeHead(200);
        res.end("Hello Viewer!");
        process.send({ worker: cluster.worker.id, cmd: 'request' });
    });
    httpsServer.listen(port);
}
init();
Войти в полноэкранный режим Выйти из полноэкранного режима

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

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

Спасибо, что прочитали ❤️

Любыми другими соображениями или рекомендациями не стесняйтесь делиться ниже.

Следите за мной в Twitter, Github, Instagram

Оцените статью
devanswers.ru
Добавить комментарий