블로그 이미지
평범하게 살고 싶은 월급쟁이 기술적인 토론 환영합니다.같이 이야기 하고 싶으시면 부담 말고 연락주세요:이메일-bwcho75골뱅이지메일 닷컴. 조대협


Archive»


빠르게 훝어보는 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 클러스터를 구성할 수 있다.

본인은 구글 클라우드의 직원이며, 이 블로그에 있는 모든 글은 회사와 관계 없는 개인의 의견임을 알립니다.

댓글을 달아 주세요

  1. 진이 2015.06.10 12:35  댓글주소  수정/삭제  댓글쓰기

    node 관련자료를 보고 많이 배워 갑니다. ^^

    위의 내용을 참고하여 cluster한 프로세서들을 데이터 공유를 위해 redis를 적용하고 있는데요

    io.set 은 예전 버전에만 적용되는가요? 제가 최신버전을 사용중인데 저 옵션은 사용할수 없다고 뜨네요

    그리고 클러스터링이 좀 불안정한건지 뭘 잘못한건지 다른 프로세서끼리 데이터 공유가 되긴하는데

    자꾸 reconnect 현상이 일어나서요 그러니까

    1브라우저에서 A 프로세서 connect
    2브라우저에서 B 프로세서 connect
    A : hi -> B : hi
    이런식으로 가능한데

    1브라우저에서 A 프로세서 connect
    2브라우저에서 B 프로세서 connect
    B : hi 를 하게 되면 A 프로세서에게 전달 되는게 아니라 다시 socket 이 다시 connect 를 시도해버립니다.
    그리곤 2브라우저가 A프로세서를 찾아가서 connect 후 같은 프로세서 라인에 connect를 하는데

    혹시 뭐가 문제인지 아시는지요