http long polling 구현시 참고할 사항http long polling 구현시 참고할 사항

Posted at 2012. 9. 16. 14:01 | Posted in Server

LongPolling 구현이 문제된 경우

 - 서버를 직접 만들고 경험한 내용이다.

 - Parent창이 longpoll 세션을 하나 열고, Child창을 띄워 별도의 longpoll 세션을 또 하나 열었다.

 - 각 세션에 논리 세션ID를 부여하고 서버측에서 데이터를 관찰.

 - 몇번 데이터가 왔다갔다 하면, Parent창과 Child창이 서로 다른 소켓으로 데이터를 보냄.

 - 브라우저가 물리 소켓을 pool 처럼 사용하는 것으로 추측. ?> pool처럼 사용한다고 함.


브라우저 동작 방식

 - 브라우저별 OS별 설정이 다르긴 하지만, 브라우저 프로세스 내에서 같은 도메인에 대해 열 수 있는 소켓 수는 제한적이다.

   * http 1.1 버전에서는 default=2 개라고 함. (사실 여부는 표준 문서 등 확인 필요)

   * 도메인별로 기본적으로 하나는 브라우저 메인이 사용하고, 나머지는 추가로 열어서 쓸 수 있다. 제한수가 2라는 의미는 추가로 열 수 있는 소켓수가 1이란 뜻이다.

   * 제한수를 넘어서 소켓을 열면 이전 소켓중 하나가 닫힌다고 함(역시 표준 문서 등 확인 필요)

 - 요즘 브라우저는 창을 여러개 띄우더라도 프로세스는 하나이고 쓰레드를 여러개 띄우는 형태.

 - 따라서, 창을 여러개 열어도 도메인이 같으면 제한된 소켓만 오픈할 수 있다.

 - 구글은 이런 브라우저 특성 때문에 빠른 로딩을 위해서 이미지 서버 도메인을 여러개 두고 한 화면 안의 img 태그에 여러개의 이미지 서버 도메인을 넣어 사용한다고 함. 병렬로 동시에 로딩 가능하다.

※ 위의 LongPolling구현의 문제는 Parent창이 추가로 longpoll 세션을 열었는데(2개), Child창이 뜨면서 세션을 하나더 연 경우(3개)가 됨.


해결

 - Child창을 띄우지 말고, Parent창 하나만 longpoll을 사용하거나,

 - Child창은 다른 도메인으로 longpoll 세션을 연다. (세션서버에 도메인을 여러개 등록) --> 잘 됨!

※ 더 정확한 내용 아시는 분은 댓글 부탁드립니다.

//