Web pull/poll(push)

윤강석·2022년 11월 29일
0

현재 진행 중인 프로젝트에서 웹 소켓을 사용할 일이 있었다. 관련하여 웹을 동적으로 노출시키기 위한 서버-클라이언트 통신 방식들을 정리하고자 한다.

간단하게 상황을 요약하자면, "다른 누군가의 상태를 알기 위해선, 주기적으로 알려주던가 주기적으로 확인하러 가야한다." 이다. 전자를 Poll(push, 같은 개념은 아니지만 적당히 포함한다 정도로 얘기할 수 있다.) 후자를 pull 이라 한다. 당연히 뭐가 더 낫다의 개념이 아닌 쓰임새가 다른 방식이다.

Server push 기법

기본적으로 http 프로토콜 특성상, 요청과 응답만이 존재할 뿐 기밀한 연결 따위 유지되지 않는다. 이를 극복하고자 push 를 구현한 방법이 polling, long polling, streaming 등이 있다.

  • polling
    로직이 단순하다. 주기적으로 요청을 보내 응답을 확인하는 것이다. 구현이 단순하고 쉽지만, 불필요한 요청과 응답이 많아 낭비되는 자원이 많다.

  • long poll
    요청을 보낸 후, 서버에서 특정 이벤트가 발생한다면 응답을 보내는 것이다. 이벤트마다 응답을 보내기 때문에, 서버의 상태변화가 잦다면 서버에 많은 부하가 걸릴 것이므로 상태변화가 잦지 않은 서버에 유리하다.

  • streaming
    한번의 요청 후, 필요한 이벤트 발생시 꾸준히 응답을 보내는 것이다. (매 응답시 응답을 완료시키지 않음으로써 연결을 유지하는 방식) 매 응답마다 재 요청을 요구하는 long poll 보다 효율적이며, 서버의 잦은 상태변경에도 유리하다.

웹 소캣

위의 방식들로도 실시간 통신을 구현할 수 있으나, 요청과 응답자체가 무겁기떄문에(헤더,바디) 이를 해결하고자 등장한 방식(프로토콜)이다.

  • TCP 와 같이 Handshake 를 통해 연결을 유지한다.
  • Open handShake(빨간 박스) 가 완료 되면, "ws://localhost:8080" 과 같이 새로운 url 을 통해 요청-응답을 주고 받게 된다. 이 때 클라이언트 측은 서버의 포트하나를 점유하여 사용하게 된다.

0개의 댓글