티스토리 뷰
nodejs는 싱글 쓰레드 기반으로 동작한다.
싱글 쓰레드 기반의 한계점을 극복 하기 위해 node자체적으로 clustering을 지원을 한다
사용법은 간단하다
var http = require('http');
var cluster = require('cluster');
//멀티 코어 클러스터
if (cluster.isMaster) {
// 클러스터 워커 cpu 갯수 만큼 프로세스 포크 한다
for (var i = 0; i < numCPUs; i++) {
cluster.fork();
}
//프로세스가 죽게 되면 받는 이벤트
cluster.on('exit', function(worker, code, signal) {
console.log('worker ' + worker.process.pid + ' died');
});
} else {
//작업 시작
}
간단한 구분 으로 cluster를 사용할 수 있다
하지만 cluster 환경에서 node js 모듈인 socket io는 정상 작동하지 않는다
이유는 cpu갯수 만큼 할당된 프로세스들은 소켓 정보를 공유 하지 못하기 때문에
적상적으로 작동 될 수 없다.
이런 부분을 해소 하기위해서 redis서버와 redis 모듈을 설치 한 후 socket 정보들을
redis에서 공유 할 수 있도록 해주면 cluster 환경에서도 적상적인 socket io를
사용 할 수 있다
-----------------------------------------------소스
var http = require('http');
var cluster = require('cluster');
var numCPUs = require('os').cpus().length;
var cluster = require('cluster');
var httpServer;
if (cluster.isMaster) {
// 클러스터 워커 프로세스 포크
for (var i = 0; i < numCPUs; i++) {
cluster.fork();
}
cluster.on('exit', function(worker, code, signal) {
console.log('worker ' + worker.process.pid + ' died');
});
} else {
httpServer = http.createServer(function(req, res) {
}).listen(1337);
var io = require('socket.io').listen(httpServer);
var redis = require('socket.io-redis'); //npm install socket.io-redis
io.adapter(redis({ host: 'localhost', port: 6379 }));
console.log('Server running at http://localhost:1337/');
io.sockets.on('connection', function(socket) {
});
}
이렇게 소스만 추가 하면
Error: Redis connection to localhost:6379 failed - connect ECONNREFUSED 127.0.0.
1:6379
at Object.exports._errnoException (util.js:890:11)
at exports._exceptionWithHostPort (util.js:913:20)
at TCPConnectWrap.afterConnect [as oncomplete] (net.js:1059:14)
이런 에러를 볼 수 있다
redis 서버를 띄워야 한다
https://github.com/dmajkic/redis/downloads //redis 설치 파일 경로
binary 형태로 exe 파일 실행시 바로 서버를 띄울 수 있다
[9044] 14 Apr 21:55:39 # Warning: no config file specified, using the default co
nfig. In order to specify a config file use 'redis-server /path/to/redis.conf'
[9044] 14 Apr 21:55:39 * Server started, Redis version 2.4.5
[9044] 14 Apr 21:55:39 # Open data file dump.rdb: No such file or directory
[9044] 14 Apr 21:55:39 * The server is now ready to accept connections on port 6
379
[9044] 14 Apr 21:55:39 - 0 clients connected (0 slaves), 1179896 bytes in use
[9044] 14 Apr 21:55:41 - Accepted 127.0.0.1:52918
redis 서버를 띄우면 자동으로 127.0.0.1 6379포트로 서버가 실행이 된다
redis 정상 실행 후 노드를 다시 실행 하면 정상 동작하는 걸 확인 할 수 있다.