고트래픽 Node.js API 최적화 전략
Source: Dev.to
Node.js의 이벤트‑드리븐 아키텍처 활용
I/O 작업을 논블로킹으로 유지하고, 블로킹 코드 대신 async/await 또는 프라미스를 사용하세요.
// Use async/await or promises instead of blocking code
const data = await getDataFromDatabase();
데이터베이스 호출 최소화
Redis나 Memcached와 같은 인‑메모리 스토어를 사용하여 자주 접근되는 데이터를 캐시하세요.
// Example with Redis
const cacheResult = await redisClient.get('user:123');
if (cacheResult) {
return res.json(JSON.parse(cacheResult));
}
다중 CPU 코어 활용
Node의 cluster 모듈을 사용해 앱을 여러 코어에 걸쳐 실행하고, 로드 밸런서(예: Nginx, PM2)를 이용해 들어오는 요청을 분산시키세요.
const cluster = require('cluster');
const http = require('http');
const numCPUs = require('os').cpus().length;
if (cluster.isMaster) {
for (let i = 0; i {
// Handle request
}).listen(8000);
}
미들웨어 및 라이브러리 최적화
- 불필요한 미들웨어와 API 엔드포인트 내부에서의 깊은 복제를 피하세요.
- 가능하면 가벼운 라이브러리를 선호하세요.
// Don’t use deep copies unless you must
const shallowCopy = { ...obj };
효율적인 데이터베이스 연결 관리
병목 현상과 요청 손실을 방지하기 위해 데이터베이스 연결을 신중히 관리하세요.
속도 제한 및 악용 방지
express-rate-limit와 같은 패키지를 사용해 API와 인프라를 악용으로부터 보호하세요.
const rateLimit = require('express-rate-limit');
app.use(
rateLimit({
windowMs: 60 * 1000, // 1 minute
max: 100, // limit each IP to 100 requests per windowMs
})
);
모니터링 및 프로파일링
New Relic, PM2, 또는 Node.js 내장 프로파일러와 같은 도구를 사용해 성능 병목을 식별하고 높은 트래픽 상황에서도 안정성을 확보하세요.