클라우드 컴퓨팅 & NoSQL/Vert.x & Node.js

빠르게 훝어 보는 node.js - #13 Socket.IO 클러스터링

조대협 2014. 5. 6. 23:37

빠르게 훝어보는 node.js

#13 - Socket.IO 클러스터링

조대협 (http://bcho.tistory.com)


node.js 노드가 하나가 아니라 여러개의 프로세스를 이용해서 운영할 때,socket.io를 어떻게 사용해야 할까? 이런 멀티 프로세스를 지원하기 위해서, node.js는 내부적으로 redis store를 지원한다. redis에는 publish/subscribe라는 기능이 있는데, 마치 메세지 큐처럼 메세지를 subscriber로 보낼 수 있는 기능이다.

아래 그림을 보자,하나의 node프로세스에서 메세지를 보내면, 다른 프로세스로 redis를 통해서 메세지를 전달한다. 이때 메세지를 보내는 프로세스는 redis에 메세지를 “publish”하고 나머지 프로세스들은  “subscribe”를 이용하여 메세지를 읽어드린다. 이때, 메세지를 전달하는 채널은 “dispatch”라는 이름의 채널을 이용한다.



 

그러면 실제로, socket.io에서 redis store를 사용하려면 어떻게 해야 할까? 간단한 설정만으로 가능하다. 아래와 같이 redis client를 생성한 후에, socket.io set 명령을 이용하여 store redis client로만 지정해주면 된다.


var httpServer =http.createServer(app).listen(process.argv[2], function(req,res){

    console.log('Socket IO server has been started listen:'+process.argv[2]);

});

// upgrade http server to socket.io server

var io = socketio.listen(httpServer);

var pub = redis.createClient(6379,'127.0.0.1');

var sub = redis.createClient(6379,'127.0.0.1');

var store = redis.createClient(6379,'127.0.0.1');

 

io.set('store',new socketio.RedisStore({

    redis: redis

    ,redisPub : pub

    ,redisSub : sub

    ,redisClient : store

}));

 


그리고, cluster 모듈을 이용하거나, 앞단에 nginx(http:// http://nginx.org/ ) haproxy (http://haproxy.1wt.eu/)  로드밸런서를 이용하여 여러개의 node.js 프로세스에 대한 end point를 하나로 묶으면, 대규모 분산 서비스를 할 수 있는 socket.io 클러스터를 구성할 수 있다.