Node.js
Moduł klastrowy
Szukaj…
Składnia
- const klaster = wymagany („klaster”)
- uster.fork ()
- uster.isMaster
- uster.isWorker
- klaster.schedulingPolicy
- uster.setupMaster (ustawienia)
- ustawienia klastrów
- klaster.worker // w pracowniku
- uster.workers // w systemie głównym
Uwagi
Zauważ, że cluster.fork()
odradza proces potomny, który rozpoczyna wykonywanie bieżącego skryptu od samego początku, w przeciwieństwie do fork()
systemowego fork()
w C, które klonuje bieżący proces i kontynuuje instrukcje po wywołaniu systemowym zarówno w rodzicu, jak i proces potomny.
Dokumentacja Node.js zawiera bardziej kompletny przewodnik po klastrach tutaj
Witaj świecie
To jest twoja cluster.js
:
const cluster = require('cluster');
const http = require('http');
const numCPUs = require('os').cpus().length;
if (cluster.isMaster) {
// Fork workers.
for (let i = 0; i < numCPUs; i++) {
cluster.fork();
}
cluster.on('exit', (worker, code, signal) => {
console.log(`worker ${worker.process.pid} died`);
});
} else {
// Workers can share any TCP connection
// In this case it is an HTTP server
require('./server.js')();
}
To jest twój główny server.js
:
const http = require('http');
function startServer() {
const server = http.createServer((req, res) => {
res.writeHead(200);
res.end('Hello Http');
});
server.listen(3000);
}
if(!module.parent) {
// Start server if file is run directly
startServer();
} else {
// Export server, if file is referenced via cluster
module.exports = startServer;
}
W tym przykładzie hostujemy podstawowy serwer WWW, jednak rozdzielamy pracowników (procesy potomne) za pomocą wbudowanego modułu klastra . Liczba forker procesów zależy od liczby dostępnych rdzeni procesora. Dzięki temu aplikacja Node.js może korzystać z wielordzeniowych procesorów, ponieważ pojedyncze wystąpienie Node.js działa w jednym wątku. Aplikacja będzie teraz współużytkować port 8000 we wszystkich procesach. Obciążenia będą automatycznie rozdzielane między pracowników przy użyciu metody Round-Robin.
Przykład klastra
Pojedyncze wystąpienie Node.js
działa w jednym wątku. Aby skorzystać z systemów wielordzeniowych, aplikację można uruchomić w klastrze procesów Node.js w celu obsługi obciążenia.
Moduł cluster
umożliwia łatwe tworzenie procesów podrzędnych, które współużytkują porty serwera.
W poniższym przykładzie utwórz proces potomny procesu roboczego w procesie głównym, który obsługuje obciążenie wielu rdzeni.
Przykład
const cluster = require('cluster');
const http = require('http');
const numCPUs = require('os').cpus().length; //number of CPUS
if (cluster.isMaster) {
// Fork workers.
for (var i = 0; i < numCPUs; i++) {
cluster.fork(); //creating child process
}
//on exit of cluster
cluster.on('exit', (worker, code, signal) => {
if (signal) {
console.log(`worker was killed by signal: ${signal}`);
} else if (code !== 0) {
console.log(`worker exited with error code: ${code}`);
} else {
console.log('worker success!');
}
});
} else {
// Workers can share any TCP connection
// In this case it is an HTTP server
http.createServer((req, res) => {
res.writeHead(200);
res.end('hello world\n');
}).listen(3000);
}