대부분의 웹 사이트에서 메시지 조회수가 지연되는 이유는 무엇입니까?


10

YouTube 동영상 조회수가 항상 게으르다는 점에 주목하세요. 예를 들어 동영상에 댓글 1000 개가 있고 조회수가 500 회이고 몇 시간 후에 조회수가 10000 회입니다.

유튜브는 혼자가 아닙니다. 대부분의 게시판은 이런 방식으로 구현되며 조회수는 10 분마다 업데이트됩니다.

누구든지 이것의 이유를 알고 있습니까?

감사.

답변:


20

뷰를 기록하는 것은 매우 간단합니다. 간단히 "보기"조치를 나타내는 행을 테이블에 추가하십시오. 데이터베이스에는 잠금이 필요하지 않기 때문에 빠릅니다. 힙 끝에 행을 추가하기 만하면됩니다.

이를 총 뷰 수로 집계하려면 SELECT COUNT(*) FROM ...계산이 진행되는 동안 테이블을 잠 가야한다는 것을 의미합니다. 또는 UPDATE ... SET num_views = num_views + 1누군가 특정 행을 볼 때마다 해당 행을 잠그도록 요구합니다.

따라서 확장 성의 관점에서 누군가가 비디오를 볼 때마다 행을 추가 한 다음 SELECT COUNT(*) FROM ...10 분마다 행하는 것이 훨씬 더 효율적 입니다.

실제로 유튜브의 구조를 알고, 또는 심지어 자신의 데이터를 저장하는 관계형 데이터베이스를 사용하는지 여부가 없습니다, 그러나 무엇이든 사용을 원칙 가능성이 동일합니다 : 삽입 데이터를 저렴이며, 값을 집계하는 (상대적으로) 비싼 .


4
BigTable을 나머지 Google과 함께 사용하지 않습니까?
TheLQ

@Dean Harding 감사합니다.하지만 트래픽이 적고 YouTube가 훨씬 적더라도 웹 사이트에 대한 수십억 달러의 기록이 테이블에 있다고해서 그렇지 않습니까? 이러한 대규모 레코드를 사용하면 SELECT COUNT (*)가 10 분마다 실행 되더라도 DB에 성능에 영향을 줄 것으로 생각됩니다. 또한 데이터베이스 및 백업을위한 추가 디스크 공간이 필요합니다. 모든 페이지 히트에서 테이블을 잠그는 것이 더 좋다고 말하지는 않지만 큰 웹 사이트가 그러한 거대한 데이터를 처리하는 방법을 이해하기는 어렵습니다.
Tom Tucker

내가 처음 듣는 것은 아닙니다. 정말 당황스러운 것은 스레드 안전 방식으로 카운터를 늘리는 것이 목록에 추가하는 것보다 어렵거나 비싸다는 것입니다. 후자를 해결할 수 있다면 전자는 정말 쉬워야합니다.
back2dos

2
@Tom Tucker : 그렇습니다. 그러나 여기서 구글에 대해 이야기하고 있습니다. 데이터를 계산했습니다. 따라서 "원시"데이터를 1 시간 이상 (또는 업데이트 간격마다) 얻지 마십시오.
Dean Harding

4
또한 "조치"테이블의 데이터는 "조회수"를 계산하는 것 이상으로 사용될 수 있습니다. 또한이를 사용하여 IP 블록을 구현할 수 있습니다 (예 : "동일한 IP에서 10 초마다 1 개의 댓글 이하"등). 또한 시간 경과에 따른 조회 수와 단순 num_views = num_views + 1하지 않은 다른 종류의 항목을 보여주는 그래프를 생성 할 수도 있습니다 .
Dean Harding

8

값이 길 어딘가에 캐시되어 오래된 데이터를 볼 수 있습니다. 이 데이터가 정확한 것은 중요하지 않기 때문에 개발자는 최신 데이터를 얻는 것보다 성능을 선호하기로 결정했습니다. 실제로 데이터베이스로 이동하고 사이트의 모든 조회수에 대해 행 수를 지정 하여이 수치를 업데이트하지 않기 위해 한 번만 캐시하지는 않을 것입니다.


4

대규모 사이트를 확장하려면 여러 단계에서 캐싱을 수행해야합니다. 페이지 캐싱, 하위 페이지 캐싱 및 / 또는 레코드 캐싱 일 수 있습니다. 당신은 그들 모두의 효과를 조합했을 수 있습니다. 예를 들어, 새로운 댓글이 추가 될 때까지 youtube 페이지가 캐시되면 누군가가 댓글을 게시 할 때까지 약간의 지연이 나타납니다.

페이지 조회수를 측정하는 방법에는 여러 가지가 있습니다.

  • 삽입하기 쉬운 레코드로 데이터베이스에 저장하십시오. 그러나 카운트 만 제공하는 레코드의 경우 유지 보수 오버 헤드가 높습니다.
  • 데이터베이스에 레코드로 저장하고 정기적으로 카운트를 롤업하십시오. 삽입하기 쉽고 일괄 처리하여 원하는 통계를 수집하고 자체적으로 정리합니다.
  • 데이터베이스에서 카운트 열을 업데이트합니다. 업데이트 비용이 많이 들고 (행 잠금 가정), 유지 보수 오버 헤드가없고, 동일한 페이지를 동시에 요청하는 여러 사람을 처리 할 때 성능이 저하됩니다.
  • 롤오버시 액세스 로그 파일 처리 : 데이터베이스에 추가 데이터가없고 모든 처리가 오프라인으로 일괄 처리되며 원하는 요약 통계가 시간에 맞춰 업데이트됩니다.

위의 항목 중 하나의 옵션을 제외한 모든 항목은 업데이트가 일괄 적으로 수행됨을 나타냅니다. 조회수는 실제로 시간 결정적인 속성이 아니므로 괜찮습니다. 그러나 백엔드 데이터베이스를 유지할 수 없기 때문에 사람들이 YouTube에서 비디오를 기다리도록하는 것은 시간이 매우 중요한 작업입니다. 즉, 데이터베이스의 열을 업데이트해도 YouTube만큼 큰 사이트에서는 작동하지 않습니다. 그들이 최종 옵션을 선택했다면 개인적으로 놀라지 않을 것입니다. 웹 서버는 사용중인 IP, 페이지 참조 방법 등을 포함하여 모든 방문에 대한 전체 정보를 기록합니다. 이러한 정보를 일괄 처리하고 필요에 따라 결과를 요약하는 것이 좋습니다.


마지막 해결책을 생각하지 마십시오-매우 영리합니다! 그것만으로도 +1의 가치가 있습니다.
Tom Tucker

1
우리는이 접근 방식을 사용하여 일 / 주 / 월 롤링 "가장 인기있는"페이지 목록을 처리했습니다. 일, 주 및 월 동안 간단한 속성 파일로 카운트를 롤업했습니다. 현재 날짜는 1 시간마다 재 처리되며 나머지 요약 파일은 할아버지 / 아버지 / 아들 백업 테이프처럼 취급되었습니다. 기본적으로 우리는 8 개 이상의 요약 파일 (주요 요약 및 현재 주별 각 요일에 대한 요약 파일)을 필요로하지 않았습니다.
Berin Loritsch

RRDTool은 매우 단순하면서도 솔루션보다 훨씬 복잡하지만 RRDTool의 작동 방식과 비슷합니다 .
Jörg W Mittag

0

여러 가지 이유가있을 수 있습니다. 모든 웹 사이트에서 사용하는 알고리즘으로 요약됩니다. 여기 누군가가 실제로 YouTube 개발자가 아니라면 여기에서 정확한 답변을 얻을 수 있을지 의심됩니다.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.