왜 HTTP Streaming을 사용해야 하는가?

레일즈 3.1 beta1 부터는 http streaming을 지원한다.

루비온레일즈 블로그에 관련한 내용이 있어서 요약 정리해 본다.

통상적으로 데이터베이스에서 자료를 읽어와서 실시간으로 클라이언트 브라우져에 보여주는 dynamic HTTP response들은 “Content-Length header”가 필요하다. 이러한 dynamic HTTP responses의 순서는 다음과 같다.

HTTP request -> dynamic content generation -> HTTP response

일련의 3가지 단계를 거치게 되는 이것은 컨텐츠를 생성한 후에야 컨텐츠의 크기를 알 수 있고  response 의 content-length header에 생성된 컨텐츠를 실어서 보내게 되는 것이다.

HTTP는 이러한 컨텐츠 생성과정의 대안을 제공하기도 하는데, “chunked transfer encoding”이라는 것이다. 바로 이것이 최근에 언급된 “streaming”이라는 것이다.

streaming으로 response를 보낼 때는 content-length header 대신에 “chunked” 라는 값을 가지는 “Transfer-Encoding header”와 body에 일련의 데이터와 크기를 소켓을 통해서 같이 보낸다.

HTTP/1.1 200 OK
Content-Type: text/plain
Transfer-Encoding: chunked
25

This is the data in the first chunk
1C

and this is the second one
3

con
8

sequence
0

핵심포인트는 컨텐츠 전체가 만들어질 때가지 기다렸다가 한꺼번에 보낼 필요없이 컨텐츠의 부분들이 만들어 질 때마다 소켓으로 그 때 그때 보낼 수 있게 된다는 것이다.

웹브라우져는 언제 자원들을 가져오는가?

웹브라우져는 웹컨텐츠를 전송받게 될 때 문서들을 파싱하게 된다. 웹브라우져가 문서내 참조되는 자원들, 즉, 이미지, 스타일쉬트, 또는 스크립트 등을 발견하게 되면 각각에 대한 요청을 하게 된다. 이러한 일련의 과정은 문서가 웹브라우져에 도착해서 처리되는 동안에 동시에 발생하게 되는데, 이것은 컨텐츠가 조금씩 나뉘어서 오는 거와 상관없이 일어난다.

브라우져는 서버로의 동시 요청 수에 제한이 있지만 문서내 자원들에 대한 요청은 문서내 컨텐츠가 파싱될 때 일어나는 것이다.

요즈음 클라이언트 브라우져는 이전과는 달리 자바스크립트를 블록하지 않는데 문서를 미리 스캔해서 자원들에 대한 요청을 하게 된다. 예를 들면, WebKit의 “preload scanner”같은 것이다.

Streaming의 이점은 무엇인가?

사실 스트리밍은 웹페이지가 지체 되는 것을 줄여주지 못한다. 또한,  동적인 response 보여주는 시간도 줄여주지 못한다. 그러나 웹어플리케이션이 전체 response가 만들어지는 것을 기다리는 대신에 즉각적으로 컨텐츠를 보내주기 때문에 클라이언트 브라우져는 보다 신속하게 문서 내 자원들에 대한 요청을 할 수 있게 된다. 특히, HTML 문서의 헤드를 보낼 때 서버가 컨텐츠를 생성하는 동안에 CSS와 자바스크립트 파일들을 동시에 가져올게 될 것이다. 결과적으로 웹페이지들을 보다 신속하게 로딩하게 된다.

글쓴이: 최효성

외과전문의,웹프로그래밍,컴퓨터 일러스트레이션 / Surgeon, Medical Illustration, Web Programmer

답글 남기기

아래 항목을 채우거나 오른쪽 아이콘 중 하나를 클릭하여 로그 인 하세요:

WordPress.com 로고

WordPress.com의 계정을 사용하여 댓글을 남깁니다. 로그아웃 / 변경 )

Twitter 사진

Twitter의 계정을 사용하여 댓글을 남깁니다. 로그아웃 / 변경 )

Facebook 사진

Facebook의 계정을 사용하여 댓글을 남깁니다. 로그아웃 / 변경 )

Google+ photo

Google+의 계정을 사용하여 댓글을 남깁니다. 로그아웃 / 변경 )

%s에 연결하는 중