Rev. 2.73

웹소켓과 폴링(polling)방식의 소켓이 공존하는 Socket.IO를 사용해 보면서 간과해서는 안될 점에 대해서 별도의 포스트로 작성합니다. 이전 포스트에 작성한 내용이지만 주제와 무관하여 다시 작성했습니다.

지금까지 여러 웹소켓 테스트를 통해 알아낸 사실들 중 꼭 집고 넘어가야 할 하나는 폴링방식과 웹소켓(플래시소켓 포함)을 무분별하게 사용하면 위험하다는 것입니다. 이것은 브라우저에서 HTTP 요청이 발생하느냐 마느냐의 차이이며 요청이 발생하는 경우 클라이언트나 서버 사이드 모두에 적잖은 오버헤드를 감수해야합니다. 그렇기 때문에 개발하고자하는 애플리케이션이 어떠한 빈도로 통신 횟수가 발생하는 수준에 따라 "폴링 방식 포함" 또는 "웹소켓 방식만 지원"으로 구분해서 취급해야 합니니다. 조금 과한 예를 들자면, 초당 20프레임을 확보해야하는 리얼타임 웹앱에서 폴링방식의 소켓을 활성하는 것은 DDoS 공격을 스스로 구현하는 자살행위나 다름없습니다.

아래의 표는 폴링과 웹소켓을 각각 사용하는 애플리케이션에서 불필요한 네트웍 처리량으로 인한 오버헤드를 비교한 것으로 Kaazing에서 폴링과 웹 소켓을 비교 분석한 자료중의 일부입니다.

kaazing-fig.jpg

Use case A: 1,000 clients receive 1 message per second:
Network throughput is (2 x 1,000) = 2,000 bytes = 16,000 bits per second (0.015 Mbps)
Use case B: 10,000 clients receive 1 message per second:
Network throughput is (2 x 10,000) = 20,000 bytes = 160,000 bits per second (0.153 Mbps)
Use case C: 100,000 clients receive 1 message per second:
Network throughput is (2 x 100,000) = 200,000 bytes = 1,600,000 bits per second (1.526 Mbps)

덧, 로드 밸런싱으로 어찌할만한 수준이 아닙니다.

Comments

Got something to add? You can just leave a comment.

  • Outsider Outsider

    RT @firejune: Socket.IO 사용시 집고 넘어야 할 한 가지 firejune.com/1698

    from Twitter for Mac

  • Outsideris Outsideris

    Outsideris: RT @firejune: Socket.IO 사용시 집고 넘어야 할 한 가지 http://t.co/wvAhWqK

    from Firejune.com

  • id4tweet id4tweet

    id4tweet: Socket.IO 사용시 집고 넘어야 할 한 가지: 웹소켓과 폴링방식의 소켓이 공존하는 Socket.IO를 사용해 보면서 관과해서는 안될 점에 대해서 별도의 포스트로 작성합니다. 이전 포스트에 ... http://t.co/0FiiFOr

    from twitterfeed

  • 최영목 최영목

    RT @firejune: Socket.IO 사용시 집고 넘어야 할 한 가지 firejune.com/1698

    from Flipboard

  • 최영목 최영목

    RT @firejune: Socket.IO 사용시 집고 넘어야 할 한 가지 firejune.com/1698

    from Flipboard

  • scroogy_choi scroogy_choi

    scroogy_choi: RT @firejune: Socket.IO 사용시 집고 넘어야 할 한 가지 http://t.co/wvAhWqK

    from Firejune.com

  • 강부자아들 강부자아들

    socket.io에서 websocket 프로토콜만 사용하게 할 수는 없나요? 왠지 그런 옵션이 있을 것 같은데 알려주세요. 예를 들어 현재 socket.io를 사용하니 일부 구글 크롬 브라우져에서는 websocket 프로토콜 버전때문인지 websocket이 동작 안하여서 XHR로 자동으로 넘어가고 있는데, 저는 그냥 websocket 프로토콜만 쓰고 싶고 브라우저에서 지원안하면 그냥 에러로 처리 받고 싶은데 방법을 좀 알려주세요

    reply edit

  • 웹 소켓만 사용하시려면 서버코드에서 다음처럼 작성하시면 됩니다.

    io.configure(function () {
      io.set('transports', [
        'websocket'
      ]);
    });

    reply edit

  • 강부자아들 강부자아들

    답변 감사드립니다.
    제가 우선 만들고 싶은 것은 두 모바일 기기 간의 채팅 프로그램입니다.
    이와 관련하여 질문이 몇 가지 더 있는데요. 지식인도 아닌데 계속 질문하게 되어 죄송합니다.

    첫 째는 모바일 기기(iPhone 혹은 iPad)의 슬립모드와 관련된 것입니다. 슬립모드에서는 클라이언트가 서버에서 보내오는 메세지를 받을 수가 없는데, 이 때 서버가 클라이언트의 disconnection을 알 수 있는지 여부입니다. disconnect라고 판정하는 시점도 애매하고 서버 측 disconnect이벤트는 발생하지 않는 거 같아서요.

    두 번째는 메세지를 .volatile로 보내면 그냥 메세지가 갔는지 안갔는지 확인을 안하는 건가요? git 페이지에 영어로 되어 있어서 해석이 잘 안되서요. 제가 슬립모드가 된 아이폰에 계속 메세지를 emit하니깐 서버가 뻣어버렸는데 메세지를 보낼 때 .volatile를 붙여서 emit하니깐 서버는 안 뻣더라고여. .volatile의 정확한 사용법과 의미를 알고 싶습니다.

    세 번째는 제가 슬립모드의 아이폰을 다시 켜고 사파리 브라우저의 콘솔을 확인했을 때는 websocket frame is too long에러가 뜨고 몇초 후에 웹소켓 종료에 관련된 이벤트를 확인할 수 있었는데(물론 몇초 후에 발생되었습니다) 이 때, 그 채널에 재접속을 해야 하는데 재접속은 어떻게 해야하는지 궁금합니다. http://readthedocs.org/docs/tornadio2/en/latest/bugs/#connect-after-disconnect보면은 재접속에 버그가 있고
    var conn = io.connect(addr);
    conn.on('disconnect', function(msg) { conn.socket.reconnect(); }); 식으로 재접속하게 되면 make sure you’re not setting up events again.라고 써있는데 이벤트를 재정의하지 말라는 소리 인가여? 재접속 기능을 구현해 보셨으면 조언이나 코드조각 좀 부탁드립니다.

    저는 프로그래머는 아니고 학생이다 보니 이거 저거 막히는게 많아서 두서 없이 질문하게 되었습니다. 꼭 답변 부탁드립니다.

    reply edit

  • iPhone/iPad가 슬립모드로 들어가면 socket.on('disconnect', fn); 이벤트에 의해 서버에서 즉시 감지할 수 있습니다. 그리고 .volatile은 저도 사용해 본적이 없어서 잘 모르겠습니다. 마지막으로 socket.io는 connect가 발생하면 무조건 새로운 세션을 엽니다. reconnect 이벤트가 클라이언트 스크립트에 있긴 하지만 이것은 서버-사이드에서 연결이 종료된 경우 연결이 자동으로 복구되었을 때 발생하는 이벤트입니다. 만약 클라이언트에서 새로 고침 혹은 새 페이지에서 열린 경우 같은 사용자임을 증명하기 위해서는 서버-사이드에서 세션을 직접 관리하는 프로그램을 필요로합니다.

    reply edit

Your Reaction Time!

captcha

avatar