[네트워크] 폴링, 롱폴링 정리

폴링

리얼타임 웹을 위한 기법으로 일정한 주기(특정한 시간)를 가지고 서버와 응답을 주고받는 방식이 폴링 방식이다.

ex) 실시간으로 변하는 야구중계 같은 데이터가 있다면 브라우저에서 5초 단위로 서버에 요청을 보내 업데이트하는 방식(네이버 실시간 문자중계 같은거?)

만약 정보가 변하지 않으면 리소스를 낭비하고 오버헤드/트래픽이 발생한다.

Ajax Polling이라고도 불리는데 주로 Ajax호출을 사용하기 때문이다. 또한 서버에서 데이터가 오지 않았는데 추가적으로 여러번 요청이 오게 되면 이전 데이터는 쓸모 없는 데이터가 되버린다. setTimeout같은 타이머를 이용해서 일정한 시간 간격으로 XMLHttpRequest를 보내 구현한다.

하지만 두가지 한계가 있다.

첫 번째 한계는 HTTP 통신의 빈도가 비교적 높다는 것이다.

이 때문에 실시간성이 중요한 대형 서비스에서 Ajax 폴링을 도입하기는 어렵다. 만약 http 통신이 1초에 2회 이루어지는 상황에서 100명이 접속한다면 서버는 1초에 200회나 되는 접속량을 감당해야 한다.

두 번째 한계는 Ajax 통신에서 응답이 지연될 경우에 위험한 상황이 발생할 가능성이 있다.

이를테면 서버나 데이터베이스에 부하가 높아져 파일의 응답시간이 500ms를 넘는 상황이라고 가정해보자. 아직 이전의 Ajax 통신이 끝나지 않았음에도 다음 Ajax 통신이 중첩되어 실행될 우려가 있다. 이렇게 중첩되어 실행된 Ajax 통신은 또다시 지연을 가중시키고, 그렇게 느려진 와중에 또다시 Ajax 통신이 시작되고, 또다시 지연이 가중되는 악순환이 벌어진다.

해결법

1) comet을 구현하는 방법

1-1) 롱폴링기법

서버 측에서 접속을 열어두는 시간을 길게하는 방식.

이벤트가 발생(변경된 데이터가 있을 때만 응답)하면 바로 응답이 이루어지기 때문에 실시간성이 아주 높으며,스트리밍방식과 달리 웹브라우저 환경에 관계없이 사용할 수 있기 때문에 흔히 사용하는 방식

ex) 브라우저가 서버로 요청을 보내면 서버는 요청한 데이터가 변경되었을때만 응답을 보낸다.

Transfer-Encoding : chunked 같은 응답을 반환해서 커넥션을 유지하여 동작한다.

만약 커넥션이 끊겼다면 클라이언트는 다시 서버에 연결을 요청한다.

이러한 방식은 실시간으로 응답받는 경우에 적당하고 서버의 부하도 줄여주지만 데이터가 자주 바뀌는 경우(대용량 채팅)에는 한명의 유저가 채팅을 입력할 경우 엄청난 수의 변경 호출이 일어나서 적합하지 않습니다. 또한 폴링과 롱폴링 모두 오랫동안 연결되어 있는 커넥션을 최적화 하지 못하는 문제가 있다. 이 방식을 위해서는 연결된 커넥션과 요청 리스트들을가지고 있어야 한다.

1-2) 스트리밍 방식

하나의 웹 요청에 대해 웹 접속을 계속 열어두고, 새로 이벤트가 발생하면

발생할 때마다 부분적인 응답으로 브라우저로 보내는 방식

스트리밍에서는 하나의 TCP 포트로 읽기와 쓰기를 동시에 할 수 없다. 즉 서버에서 클라이언트로 메세지를 보낼 수 있으나 클라이언트에서 서버로 메세지를 보내려면 꼼수가 필요하다.