Back Ground

Node - Cluster [ 멀티 스레드 처럼 ] 본문

Javascript/Node.js

Node - Cluster [ 멀티 스레드 처럼 ]

Back 2019. 3. 6. 10:46



클러스터



Node.js는 단일 스레드이다.

javascript기반이기 때문에 단일 쓰레드여도 서버로서 역할 할 수 있다.


기본적으로 하나의 프로세스가 

- 32bit에서는 512MB의 메모리,

- 64bit에서는 1.5GB메모리를 사용하도록 제한 되어 있다.


V8엔진의 제한을 그대로 반영한 것인데,

설정을 더 늘릴 수는 있지만 그렇게 하기보다는 worker를 늘리는것을 권장한다.

여러개의 워커들이 병렬로 동작하며 효율을 극대화 하는 것을 바람직한 방향으로 권하는 것.


모든 이벤트를 이벤트 큐로 넘기기 때문에 쓰레드가 하는 일은 그렇게 많지 않다.

대신 이벤트가 큐로 등록 되기에 실행 시간이 예측하기 힘들다는 단점이 있다.



그래서 사용하는 것이 Cluster라는 기술

사실 클러스터링 시스템이라는 말이 존재하는데 [분산 서비스]를 말한다.


node.js에서는 cluster모듈을 활용하면 손쉽게 멀티 스레드로 구현이 가능하다.



1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
const cluster = require('cluster');
 
if (cluster.isMaster) {
    const numCPUs = require('os') .cpus.length;
    
    for (var i = 0; i < cpuCount; i += 1) {
        cluster.fork();
    }
    cluster.on('exit'function (worker ,code, signal) {
        // Replace the terminated workers
        console.log('Worker ' + worker.id + ' died :(');
        console.log(`worker ${worker.process.pid} died`);
        cluster.fork();
    });
}else{
    const http = require('http');
    http.createServer(function(req,res){
        res.writeHead(200);
        res.end('helloworld');
    }).listen(8000,function(){
        console.log('slave server' +cluster.worker.process.pid);
    });
}
 
cs


cluster.isMaster로 묶인 부분과 그렇지 않은 부분을 나눠서 해석 해야 된다 . (편리성)


우선 초기에 서버를 실행하면 Master라고 하는 프로세스가 코드를 실행한다.

이때 cluster.isMatser는 true가 된다.



for문에서 numCPUs는 해당 시스템의 코어수가 인데

코어수 만큼 fork()하게 된다.


fork()는 프로세스를 생성하는 메소드

시스템 기반 API 


이때 코어 수 만큼 worker라고 하는 것을 생성한다.


워커가 생성되었기에 워커도  해당 코드를 다시 실행한다.

[이때도 역시나 코드의 첫 줄부터 읽기 시작한다.]


이 순간 if (cluster.isMaster)을 만나면 Master가 아니고 worker이기 때문에 false가 된다.

즉, 워커들은 웹 서버를 실행 시킨다. 이때 해당 포트번호는 공유가 된다.



각각의 워커끼리는 각자의 상태를 공유하지 않는다.

그 말은  메모리를 공유하지 않는다는 얘기다.


이렇게 되면 로그인을 할때마다 세션이 있을때도 없을때도 있다는 말이다.











http://blog.naver.com/PostView.nhn?blogId=pjt3591oo&logNo=220629022025&redirect=Dlog&widgetTypeCall=true

'Javascript > Node.js' 카테고리의 다른 글

Node - pm2란  (0) 2019.03.08
Node - npm 설치 항목 목록 보는법  (0) 2019.03.08
Node - [ MySQL ] - 시퀄라이즈(ORM) 이용한 데이터 베이스 세팅  (0) 2019.03.05
WebPack의 기본 개념  (0) 2019.03.01
Node - Event Loop  (0) 2019.03.01
Comments