App Cluster 를 사용한 Scale out

알파로그·2023년 12월 14일
0

Node.js

목록 보기
22/25

✏️ App Cluster

  • node 는 자체적으로 앱 클러스터 라는 수평적 확장 방법을 지원 하고있다.
  • app cluster 는 CPU 하나당 독립적인 서버를 운영할 수 있게 해준다.
    • 이 방법으로 서버성능을 최대한 끌어내고, 병렬서버를 최소한의 비용으로 테스트할 수 있게된다.

📍 setting

  • 루트 파일의 listen 을 아래와 같이 수정해준다.
    • 루트 파일을 직접 실행시키면 서버가 시작되고,
      다른 모듈에 의해 import 되어 실행될 경우 외부에서 사용할 수 있도록 서버 실행 함수를 export 하게된다.
//-- application start --//
function startServer(port) {
    app.listen(port, () => {
        start('EXPRESS  START')
        console.log(
            `Express ${app.get('env')} mode started on http://localhost:${port};`,
            `\npress Ctrl-C to terminate.`
        )
    })
}

if(require.main === module) {
    startServer(process.env.PORT || 3000)} 
} else {
    module.exports = startServer
}

📍 클러스터 모듈

  • 아래 파일을 실행시키면 master 로 실행하게 된다.
    • 마스터일경우 cpu 수 만큼 worker 를 생성하고 워커일 경우 루트 파일을 실행시킨다.
    • 만약 서버가 다운된 워커가 존재할경우 마스터에서 워커의 id 를 기록하고 자동으로 다시 띄울 수 있도록 자동화 되어있다.
var cluster = require('cluster');

function startWorker() {
    var worker = cluster.fork();
    console.log('CLUSTER: Worker %d started', worker.id);
}

if(cluster.isMaster){

    require('os').cpus().forEach(startWorker);

    // 연결이 끊어진 워커를 로그에 기록
    cluster.on('disconnect', function(worker){
        console.log('CLUSTER: Worker %d disconnected from the cluster.',
            worker.id);
    });

    // 워커가 종료되면 이를 대체할 새 워커 생성
    cluster.on('exit', function(worker, code, signal){
        console.log('CLUSTER: Worker %d died with exit code %d (%s)',
            worker.id, code, signal);
        startWorker();
    });

} else {
    const port = process.env.PORT || 3000
    require('./app.js')(port);
}

📍 라우팅 확인

  • 요청이 발생하면 클러스터 모듈은 요청을 각 워커에게 라운드빈 방식으로 요청을 분배해준다.
    • 정말 요청이 잘 분배되고 있는지 확인하려면 아래와 같이 콘솔에서 확인해볼 수 있다.
const cluster = require('cluster')

exports.home = (req, res) => {
    if (cluster.isWorker)
        console.log(`Worker ${cluster.worker.id} 가 실행중`)
    res.render('home');
}
profile
잘못된 내용 PR 환영

0개의 댓글