✏️ App Cluster
- node 는 자체적으로 앱 클러스터 라는 수평적 확장 방법을 지원 하고있다.
- app cluster 는 CPU 하나당 독립적인 서버를 운영할 수 있게 해준다.
- 이 방법으로 서버성능을 최대한 끌어내고, 병렬서버를 최소한의 비용으로 테스트할 수 있게된다.
📍 setting
- 루트 파일의 listen 을 아래와 같이 수정해준다.
- 루트 파일을 직접 실행시키면 서버가 시작되고,
다른 모듈에 의해 import 되어 실행될 경우 외부에서 사용할 수 있도록 서버 실행 함수를 export 하게된다.
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');
}