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


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.