Maison >interface Web >js tutoriel >Comment améliorer les performances de Node.js
Node.js est un environnement d'exécution puissant qui a révolutionné le développement côté serveur. Bien qu'il soit intrinsèquement performant, obtenir des performances optimales nécessite souvent une optimisation minutieuse. Dans cet article, nous explorerons les méthodes permettant d'améliorer les performances de Node.js, en commençant par le clustering et en couvrant d'autres stratégies cruciales.
Le clustering dans Node.js vous permet d'utiliser plusieurs cœurs de processeur pour gérer les requêtes simultanées, surmontant ainsi la nature monothread de Node.js. Ceci est réalisé en créant plusieurs processus partageant le même port de serveur.
const http = require('http'); const PORT = 3000; http.createServer((req, res) => { res.writeHead(200); res.end('Hello, world!'); }).listen(PORT, () => { console.log(`Server running on port ${PORT}`); });
const cluster = require('cluster'); const http = require('http'); const numCPUs = require('os').cpus().length; if (cluster.isMaster) { console.log(`Master process ${process.pid} is running`); // Fork workers for (let i = 0; i < numCPUs; i++) { cluster.fork(); } cluster.on('exit', (worker, code, signal) => { console.log(`Worker ${worker.process.pid} died`); cluster.fork(); // Restart a worker if one dies }); } else { http.createServer((req, res) => { res.writeHead(200); res.end('Hello, world!'); }).listen(3000, () => { console.log(`Worker ${process.pid} started`); }); }
Node.js s'appuie sur des E/S non bloquantes pour gérer efficacement plusieurs requêtes. L'écriture de code asynchrone garantit que la boucle d'événements reste débloquée.
const fs = require('fs'); const data = fs.readFileSync('file.txt', 'utf8'); console.log(data);
const fs = require('fs'); fs.readFile('file.txt', 'utf8', (err, data) => { if (err) throw err; console.log(data); });
L'équilibrage de charge répartit les requêtes entrantes sur plusieurs serveurs ou processus, empêchant un seul serveur de devenir un goulot d'étranglement.
Une configuration Nginx simple pour l'équilibrage de charge :
const http = require('http'); const PORT = 3000; http.createServer((req, res) => { res.writeHead(200); res.end('Hello, world!'); }).listen(PORT, () => { console.log(`Server running on port ${PORT}`); });
La mise en cache stocke les données fréquemment consultées en mémoire, réduisant ainsi le besoin de calculs coûteux ou de requêtes de base de données.
const cluster = require('cluster'); const http = require('http'); const numCPUs = require('os').cpus().length; if (cluster.isMaster) { console.log(`Master process ${process.pid} is running`); // Fork workers for (let i = 0; i < numCPUs; i++) { cluster.fork(); } cluster.on('exit', (worker, code, signal) => { console.log(`Worker ${worker.process.pid} died`); cluster.fork(); // Restart a worker if one dies }); } else { http.createServer((req, res) => { res.writeHead(200); res.end('Hello, world!'); }).listen(3000, () => { console.log(`Worker ${process.pid} started`); }); }
La surveillance de la boucle d'événements permet de détecter les goulots d'étranglement des performances causés par le blocage des opérations.
const fs = require('fs'); const data = fs.readFileSync('file.txt', 'utf8'); console.log(data);
La surveillance de la boucle d'événements permet une détection et une résolution proactives des goulots d'étranglement, garantissant ainsi des performances fluides.
Les flux traitent de gros morceaux de données de manière incrémentielle, réduisant ainsi l'utilisation de la mémoire.
const fs = require('fs'); fs.readFile('file.txt', 'utf8', (err, data) => { if (err) throw err; console.log(data); });
http { upstream backend { server 127.0.0.1:3001; server 127.0.0.1:3002; } server { listen 80; location / { proxy_pass http://backend; } } }
Des requêtes de base de données efficaces réduisent les temps de réponse et la charge du serveur.
const redis = require('redis'); const client = redis.createClient(); client.get('key', (err, data) => { if (data) { console.log('Cache hit:', data); } else { console.log('Cache miss'); client.set('key', 'value'); } });
const { monitorEventLoopDelay } = require('perf_hooks'); const h = monitorEventLoopDelay(); h.enable(); setInterval(() => { console.log(`Event loop delay: ${h.mean} ms`); }, 1000);
Les requêtes optimisées récupèrent uniquement les données nécessaires, réduisant ainsi le temps de traitement et améliorant les performances.
L'optimisation des performances de Node.js nécessite une combinaison de stratégies, allant de l'exploitation du clustering à la surveillance de la boucle d'événements. En mettant en œuvre ces techniques, vous pouvez créer des applications hautement performantes et évolutives.
Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!