Server Push : polling, Long polling, Server-Sent Events, web socket

so2·2021년 10월 10일
0

polling (= Ajax Polling)

  • 클라이언트가 주기적으로 서버에 데이터를 요청하고 응답받는 방식
  • 주기가 짧으면 서버에 부담이 되고, 길면 실시간성이 떨어진다
  • 실시간으로 주는건 불가능하다
  • 보낼 데이터가 없어도 계속해서 응답을 줘야하므로 서버 리소스를 낭비하게 된다 (HTTP 오버헤드 발생)

Long polling

  • 서버에 요청을 보내고 서버 이벤트가 발생할 때까지 연결을 유지하고, 이벤트가 발생하면 클라이언트는 응답을 받고 연결을 끊는다. 그리고 또 다른 이벤트를 받기 위해 다시 HTTP 요청을 보낸다.
  • 클라이언트에서 서버에 요청을 보내고 응답이 올때까지 or time out이 될때까지 무한정 기다린다. 커넥션이 끊기면 클라에서 서버로 다시 연결을 요청한다. 항상 연결이 유지 되어 있고, 실시간 통신이 가능하다
  • 이벤트가 발생하면 바로 응답이 이루어지기 때문에 실시간성이 아주 높다

Server-Sent Events (SSEs)

  • 클라이언트가 HTTP를 사용해 서버에 연결하면 서버는 이벤트가 발생할때마다 클라이언트에게 데이터를 보낸다 한 번 연결이 맺어지면 지속되고 만약 서버와 연결이 끊어질 경우 클라이언트는 자동으로 재연결을 시도한다.
  • HTML5 표준안
  • HTTP Content-Type을 application/event-stream으로 지정해야 한다.
  • HTTP 프로토콜을 기반으로 하므로 로드 밸런싱과 같은 수단을 통해 확장이 가능
  • 최대 동시 접속 수 : 6개
    - 이유 : 모든 웹 브라우저는 같은 서버에 동시 활성 HTTP/1 연결 상한선이 있다. 일반적으로 RFC 2616에 따라 4~6 범위이다.
    따라서 이 제한을 초과하여 새 연결을 열지 못하게 막는다.
    HTTP/2, HTTP/3을 사용하면 기본으로 100개를 허용한다. (이를 사용하기 위해선 HTTPS를 설정해야 한다.)
    - 참고 : https://stackoverflow.com/questions/16852690/sseeventsource-why-no-more-than-6-connections/62427993#62427993
    https://docs.pushtechnology.com/cloud/latest/manual/html/designguide/solution/support/connection_limitations.html
    https://javaboja.tistory.com/26
  • IE에서 사용 불가 → pollyfill을 통해 사용 가능
  • UTF-8 데이터만 전송 가능
  • 클라이언트에서 연결을 끊어도 서버단에서 감지가 어려움
  • 서버에서 받는 푸시 위주의 작업이 적합 ex) 친구 상태 업데이트, 주식 시세, 뉴스피드, 트위터

Web socket

  • HTML5 표준안, TCP/IP 스택 위에 구축된 전송 계층
  • 서버-클라이언트간 웹소켓 연결은 HTTP프로토콜을 통해 이루어진다. handshake 과정이 성공적으로 끝나면 HTTP를 웹소켓 프로토콜로 바꾸는 protocol switching 과정이 진행된다. 그러면 웹소켓을 위한 ws(일반)나 wss(SSL) 소켓이 만들어지고 이소켓을 이용해 통신한다
  • 웹소켓은 최초 접속을 제외하고 헤더정보를 보내지 않기에 네트워크 비용 측면에서 이득
  • 연결 끊겼을 때 자동으로 연결해주는 소스 추가해야함
  • 구버전 IE에서 지원되지 않기 때문에 순수 webSocket API 보다 자체 스펙으로 다시 감싼 다른 솔루션(socket.io, sockjs...) 을 이용해서 개발해야 한다

0개의 댓글