Node.js는 서버측 개발에 혁명을 일으킨 강력한 런타임 환경입니다. 본질적으로 성능이 뛰어나지만 최적의 성능을 얻으려면 신중한 최적화가 필요한 경우가 많습니다. 이 기사에서는 클러스터링부터 시작하여 기타 중요한 전략을 다루면서 Node.js 성능을 향상시키는 방법을 살펴보겠습니다.
Node.js의 클러스터링을 사용하면 여러 CPU 코어를 활용하여 동시 요청을 처리하고 Node.js의 단일 스레드 특성을 극복할 수 있습니다. 이는 동일한 서버 포트를 공유하는 여러 프로세스를 생성하여 달성됩니다.
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는 비차단 I/O를 사용하여 여러 요청을 효율적으로 처리합니다. 비동기 코드를 작성하면 이벤트 루프가 차단되지 않은 상태로 유지됩니다.
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); });
로드 밸런싱은 들어오는 요청을 여러 서버 또는 프로세스에 분산시켜 단일 서버에서 병목 현상이 발생하는 것을 방지합니다.
로드 밸런싱을 위한 간단한 Nginx 구성:
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`); }); }
이벤트 루프를 모니터링하면 작업 차단으로 인한 성능 병목 현상을 감지하는 데 도움이 됩니다.
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); });
http { upstream backend { server 127.0.0.1:3001; server 127.0.0.1:3002; } server { listen 80; location / { proxy_pass http://backend; } } }
효율적인 데이터베이스 쿼리는 응답 시간과 서버 부하를 줄여줍니다.
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);
최적화된 쿼리로 필요한 데이터만 검색하여 처리 시간을 단축하고 성능을 향상시킵니다.
Node.js 성능을 최적화하려면 클러스터링 활용부터 이벤트 루프 모니터링까지 다양한 전략의 조합이 필요합니다. 이러한 기술을 구현하면 성능이 뛰어나고 확장성이 뛰어난 애플리케이션을 구축할 수 있습니다.
위 내용은 Node.js 성능을 향상시키는 방법의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!