클러스터(cluster)
기초/Node.js2021. 10. 19. 22:22
기본적으로 노드는 싱글 스레드. CPU 코어를 모두 사용할 수 있게 해 주는 모듈이다.
→ 코어를 하나밖에 사용하지 못하고 나머지 7개는 놀고 있음.
→ 서버를 코어 개수만큼 실행시키면 놀고 있는 코어도 모두 활용할 수 있다.
→ 이 때, cluster로 코어 하나당 노드 프로세스 하나를 배정할 수 있다.
코어 개수와 성능이 비례하는 것은 아니지만,
요청이 많이 들어왔을 때 병렬로 실행된 서버의 개수만큼 요청이 분산되어 더 효율적이다.
단, 서버를 여러 개 띄운다고 해도 메모리나 세션과 같은 컴퓨터 자원을 공유할 수는 없다.
로그인같은 경우는 Redis 등 별도 서버로 해결이 가능함(나중에)
http2를 적용하면서 같이 적용하는 게 좋다.
const cluster = require("cluster");
const http = require("http");
const numCPUs = require("os").cpus().length; //나의 cpu개수를 카운트해줌
if (cluster.isMaster) {
console.log(`마스터 프로세스 아이디: ${process.pid}`);
// 마스터 프로세스는 CPU 개수만큼 워커를 생산한다.
for (let i = 0; i < numCPUs; i += 1) {
cluster.fork(); //워커 프로세스 만듬(워커 스레드 아님)
}
// 워커가 종료되었을 때
cluster.on("exit", (worker, code, signal) => {
console.log(`${worker.process.pid}번 워커가 종료되었습니다.`);
console.log("code", code, "signal", signal);
cluster.fork(); //종료된 서버를 다시 살려 주는 부분.
});
} else {
// 워커들이 포트에서 대기. 여기부터 워커 프로세스.
http
.createServer((req, res) => {
res.writeHead(200, { "Content-Type": "text/html; charset=utf-8" });
res.write("<h1>Hello Node!</h1>");
res.end("<p>Hello Cluster!</p>");
setTimeout(() => {
// 워커 존재를 확인하기 위해 1초마다 강제 종료
process.exit(1);
console.log(error); //어떤 에러가 발생했을 때 기록하도록.
}, 1000);
})
.listen(8086);
console.log(`${process.pid}번 워커 실행`);
}
클러스터를 활용하면 워커마다 다른 포트를 사용하지 않고, 여러 개의 서버를 하나의 포트에 배정할 수 있다.
그리고 워커들에게 round robin 알고리즘에 따라 요청을 고르게 분배해 준다.
'기초 > Node.js' 카테고리의 다른 글
노드로 http 서버 만들기 (0) | 2021.10.12 |
---|---|
예외 처리하기 (0) | 2021.09.22 |
File System (0) | 2021.09.22 |
댓글()