Module Cluster de Node.js
de Node.jsclusterLe module vous permet de créer facilement des processus workers qui partagent le même port de serveur. Comme Node.js est monothread,clusterLe module peut nous aider à exploiter pleinement les performances des systèmes CPU multicœurs.
En termes simples,clusterLe module est comme un gérant de restaurant : il crée plusieurs serveurs (workers) pour s'occuper des clients (requêtes), au lieu de laisser un seul serveur s'occuper de tous les clients.
Pourquoi avez-vous besoin du module Cluster ?
Améliorer les performances: Les CPU modernes ont généralement plusieurs cœurs, mais Node.js n'utilise qu'un seul cœur par défaut.
clusterLe module vous permet d'utiliser tous les cœurs CPU disponibles.Améliorer la fiabilité: Si un worker plante, les autres workers peuvent continuer à traiter les requêtes, et le processus maître peut redémarrer le worker planté.
Zéro temps d'arrêt: Vous pouvez redémarrer les workers un par un pour mettre à jour le code sans interrompre le service.
Utilisation de base du module Cluster
Exemple
const http = require('http');
const numCPUs = require('os').cpus().length;
if (cluster.isMaster) {
console.log(`Le processus maître ${process.pid}est en cours d'exécution`);
// Forker des processus workers
for (let i = 0; i < numCPUs; i++) {
cluster.fork();
}
cluster.on('exit', (worker, code, signal) => {
console.log(`worker ${worker.process.pid}a quitté`);
});
} else {
// Les workers peuvent partager la même connexion TCP
// Ceci est un serveur HTTP
http.createServer((req, res) => {
res.writeHead(200);
res.end('Bonjour le monde\n');
}).listen(8000);
console.log(`Le worker ${process.pid}a démarré`);
}
Analyse des concepts fondamentaux
Processus maître
- Responsable de la gestion de tous les processus worker
- Ne traite généralement pas les requêtes réelles
- Peut écouter divers événements des workers
Processus worker
- Processus enfants qui traitent réellement les requêtes
- Chaque worker est un processus Node.js indépendant
- Partagent le même port de serveur
API courantes du module Cluster
cluster.fork()
Crée un nouveau processus worker. L'appel de cette méthode renvoie un objet worker.
cluster.isMaster
S'il s'agit du processus maître, alors il esttrue。
cluster.isWorker
S'il s'agit d'un processus worker, alors il esttrue。
cluster.workers
Une table de hachage contenant tous les objets worker actifs, avecworker.idcomme nom de clé.
Scénarios d'application pratiques
1. Équilibrage de charge
Exemple
const cluster = require('cluster');
const numCPUs = require('os').cpus().length;
if (cluster.isMaster) {
for (let i = 0; i < numCPUs; i++) {
cluster.fork();
}
} else {
require('./app'); // Votre fichier d'entrée d'application
}
2. Redémarrage gracieux
Exemple
console.log(`Le worker ${worker.process.pid}a quitté`);
// Vous pouvez forker un worker ici
cluster.fork();
});
3. Communication inter-processus
Exemple
worker.send('Bonjour worker !');
// Le worker reçoit le message
process.on('message', (msg) => {
console.log(`Worker ${process.pid}a reçu un message: ${msg}`);
});
Conseils d'optimisation des performances
Créer des workers en fonction du nombre de cœurs CPU: Il est généralement recommandé que le nombre de workers soit égal au nombre de cœurs CPU.
Port partagé: Tous les workers partagent le même port, et le système d'exploitation distribue automatiquement les requêtes entre les différents workers.
Connexions partagées: Pour les connexions de longue durée (comme WebSocket), vous devez prendre en compte la manière dont les connexions sont distribuées entre les différents workers.
État partagé: Les workers ne partagent pas la mémoire, vous devez donc utiliser un stockage externe tel que Redis pour partager l'état.
Problèmes courants et solutions
1. Fuite de mémoire
Chaque worker est un processus indépendant. Une fuite de mémoire dans un worker n'affectera pas les autres workers, mais vous devez surveiller et redémarrer les workers anormaux.
2. Persistance de session
Si la persistance de session est nécessaire, vous pouvez utiliser des sessions sticky ou stocker les données de session en externe (par exemple, Redis).
3. Limite de descripteurs de fichiers
Un grand nombre de workers peut épuiser les descripteurs de fichiers, vous devez donc ajuster les limites du système :
Exemple
Alternatives au module Cluster
Bien queclusterLe module est puissant, mais il existe d'autres options :
- PM2: gestionnaire de processus avec équilibrage de charge et fonctionnalités de surveillance intégrés
- Nginx: un proxy inverse capable de répartir la charge entre plusieurs instances Node.js
- Kubernete: un système d'orchestration de conteneurs capable de mettre à l'échelle automatiquement les services Node.js
Résumé
de Node.jsclustermodule est un outil important pour créer des services réseau hautes performances et hautement disponibles. En créant plusieurs processus worker, nous pouvons :
- Exploiter pleinement les performances des processeurs multicœurs
- Améliorer la fiabilité de l'application
- Réaliser un déploiement sans temps d'arrêt
Bien que la configuration et la gestion d'applications multiprocessus soient plus complexes que celles d'applications monoprocessus, pour les applications Node.js en production, l'utilisation declusterLe module ou des solutions similaires est presque indispensable.
J'espère que ce guide vous aidera à comprendre et à utiliser le module de Node.jsclustermodule!
Modules intégrés de Node.js