NodeJS cluster

NodeJS je single thread technologie, narozdil od PHP, kde je každý request forkován do child procesu, který je zodpovědný za obsloužení daného požadavku. Single thread znamená, že všechny požadavky jsou obsluhovány v jednom jediném vláknu a to asynchronně, aby nedocházelo k zablokování provádění po dobu než je obsloužen požadavek, který provádí například čtení z disku, což může být časově náročná operace. V reálu je to trochu složitější, ale tolik v kostce.

V době vícejádrových procesorů se toto může jevit jako významné mínus, nicměně i využití výkonu nejnovějších procesorů není pro NodeJS žádný problém.

Jednou z možností jak využít více jader procesoru je spuštění více instancí NodeJS aplikace s tím, že každá bude poslouchat na jiném portu a například Nginx se bude starat o load balancing. Přicházející requesty pak budou dle nějakého interního mechanismu loadbalanceru distribuovány na jednotlivé spusštěné instance aplikace. Paráda. Nicméně problémem je to, že budete muset konfigurovat a spravovat Nginx a vše s tím související.
Další možností je například PM2 manager, který právě umí spouštět více instancí aplikace.

Nativním řešením rozložení zátěže a tedy zvýšení výkonu aplikace je NodeJS cluster.

NodeJS cluster

var express = require('express');
var cluster = require('cluster');
var numCPUs = require('os').cpus().length;

if (cluster.isMaster) {
    for (var i = 0; i < numCPUs; i++) {
        cluster.fork();
    }
} else {
    var app = express();
    app.get('/', function (req, red) {
        res.end('Hello, World!');
    });
    app.listen(8080);
}

Myslím si, že kód je samovysvětlující. Podle počtu jader pocesorů je spuštěno numCPUs subprocesů, ve kterých pak pěží jednotlivé instance NodeJS Express serveru.

Na rozdíl od řešení s Nginxem, nebo PM2, toto řešení nevyžaduje žádný další SW či konfiguraci OS.