트위터, new tweet 갱신 알림 프로세스 조사

Posted in 모바일 // Posted at 2010. 7. 21. 15:44
728x90
점심시간에 책을 읽다가 문득 트위터에서 새로운 트윗을 알려 주는 방식을 좀 자세히 들여다 보고
싶어졌다

트위터 사이트를 열어 두면 아래 그림처럼 자동으로 새로 올라온 트윗이 있다고 알려 준다



사실 웹 표준을 준수하는 사이트의 자동 알림과 같은 기능은 대체로 폴링(pollling) 방식일 것이며
비동기로 호출해야 하기 때문에 AJAX 가 사용되리라는 것은 웬만한 웹 개발자면 다 아는 내용이다

따라서 심도있는 조사? 라는 것이 있을 수 없겠지만... 어쨋던 한번 들여다 보고 싶어졌다 ㅎㅎ

일단 Fiddler 와 네트워크패킷분석기라는 2개의 툴로 요청과 응답을 캡쳐 해 봤다

예상대로 AJAX를 통한 비동기 호출이었고 데이타 교환 포맷은 JSON 을 사용하는 듯 하다

아래는 트위터가 자동으로 호출하는 요청 패킷의 헤더 정보의 일부이다
XMLHttpRequest 로 부터 AJAX 통신을 유추할 수 있다. 그리고 JSON 포맷을 수용하고 있다
GET http://twitter.com/home?since_id=19054128561&refresh=true.......... HTTP/1.1
x-requested-with: XMLHttpRequest
Accept-Language: ko
Referer: http://twitter.com/
Accept: application/json, text/javascript, */*
Accept-Encoding: gzip, deflate
User-Agent: Mozilla/4.0 (compatible; MSIE 8.0; Windows NT 5.1; Trident/4.0; InfoPath.2; .....
If-Modified-Since: Wed, 21 Jul 2010 05:46:23 GMT; length=120
Host: twitter.com
Connection: Keep-Alive


그리고 아래는 위 요청에 대한 응답 헤더와 바디 정보의 일부이다
응답 컨텐츠 타입이 자바스크립트이며 JSON 특유의(?) 데이터 포맷인 바디 구성이 눈에 띈다

HTTP/1.0 200 OK
Date: Wed, 21 Jul 2010 05:47:10 GMT
Status: 200 OK
Last-Modified: Wed, 21 Jul 2010 05:47:10 GMT
Content-Type: text/javascript; charset=utf-8
Content-Length: 2566
Expires: Tue, 31 Mar 1981 05:00:00 GMT
Set-Cookie: lang=en; path=/
Set-Cookie: lang=en; path=/
Set-Cookie: dispatch_action=; path=/; expires=Thu, 01 Jan 1970 00:00:00 GMT
.......
Set-Cookie: _twitter_sess=........ ; domain=.twitter.com; path=/
Connection: close

{
 
  "users": {},
 
  "#pagination":null,
      "#timeline":"<ol id='timeline' class='statuses'>\n            <li class=\"hentry u-guitarbboy status\" id=\"status_19054414770\"\n>\n  <span class=\"thumb vcard author\"><a .........=\"photo fn\" height=\"48\" src=\"http://....=\"48\" /></a></span>  <span .....</ul>\n  </span>\n</li>\n      </ol>\n"
}



비동기 호출 (갱신) 주기
그렇다면, 비동기 호출 주기는 과연 얼마로 설정했을까? 일명 폴링 주기이다

폴링주기는 웹 사이트의 성능과 웹 서버의 부담이라는 측면에서 최대한 긴 것이 좋으며
최대한 실시간 같은 갱신 효과라는 측면에서는 최대한 짧은 것이 좋다

폴링주기 설정은 사이트의 특징과 사용 패턴, 웹서버 가용성 및 규모, 네트워크 환경에 따라
환경에 맞도록 최적화 시키는 것이 중요한데, 트위터에서는 어떻게 했는지 궁금해 졌다

비동기 호출을 일정기간 캡쳐했다. 그리고 각 호출간 시간차를 살펴 보았다
재미있는 것은 폴링 주기가 일정하지 않다는 것이다

즉 호출간 매번 일정한 간격이 아니라 조금씩 다른 간격으로 호출되는 것이다
그러나 패턴은 있었다. 항상 같은 간격은 아니지만 간격의 패턴은 유지되고 있었다

대체로 살펴봤을때,
45초 -> 1분 7초 -> 45 - > 1분 7초....와 같은 패턴이 많이 보였으며,
경우에 따라 2분 32초 -> 3분 48초 -> 5분 -> 3분 48초 -> 2분 32초... 와 같은 패턴도 보였다

음... 트위터에서는 항상 같은 간격으로 호출하지 않는다는 것은 명백하다
그러나 일정한 패턴은 유지하고 있다. 그럼 이유는???

글쎄....
처음엔 어떤 상황에 따라 패턴이 분리되지 않나 싶어 꽤 오랫동안 지켜봤다
예를 들어 사이트가 로딩 된 후 사용의 행동이 오랫동안 감지 되지 않을 경우에 간격을 조정한다?
라는 식으로 말이다

즉 항상 일정한 폴링주기가 아니라 나름대로 상황에 맞게 최적의 주기를 설정한 것이 아닌가 했다.
그리고 그 상황과 패턴을 찾고 싶었다

몇 가지 가설을 세워놓고 꽤 오랫동안 패킷을 지켜봤으나 딱 떨어지지는 않았다
다시말해 폴링 주기가 일정한 패턴으로 변경되는 상황을 알 수 없었다

나의 가설이 틀렸던지 아니면 정말 랜덤일수도 있다
몇가지 주기를 설정해 두고 랜덤하게 꺼내 쓴다... 처럼...

뭐.. 어쨋던 정확한 상황을 알지 못했지만 (웬지 관련성이 있을 것만 같은) 한가지는 목격(?)했다
새로운 트윗이 생긴경우 since_id 파라메타 값이 바뀐다는 것이다
그리고 계속 이 since_id는 변화가 없다가 다시 새로운 트윗이 생기면 바뀌는 식이다

어쨋던 점심시간,, 읽고 싶은 책은 1페이지도 못 읽고 문득 든 생각때문에
몇 시간을 보내 버렸다.......

'모바일' 카테고리의 다른 글

오픈페인트(OpenFeint)  (0) 2010.07.30
아이폰 에뮬레이터?  (0) 2010.07.21
모바일 결제 시스템 조사  (1) 2010.07.21
뷰 포트(Viewport)  (8) 2010.07.14
모바일 웹, 유효성 검사  (0) 2010.07.14