Warum ist die Anzahl der Nachrichtenansichten auf den meisten Websites verzögert?

10

Beachten Sie, dass die Anzahl der Aufrufe von YouTube-Videos immer verzögert ist. Zum Beispiel hat ein Video 1000 Kommentare und hat immer noch 500 Treffer und wird 10000 Treffer Stunden später haben.

Youtube ist damit nicht allein. Die meisten Message Boards werden auf diese Weise implementiert und die Anzahl der Ansichten wird etwa alle 10 Minuten aktualisiert.

Kennt jemand den Grund dafür?

Vielen Dank.

Tom Tucker
quelle

Antworten:

20

Das Aufzeichnen von Ansichten ist sehr einfach. Fügen Sie einfach eine Zeile zu einer Tabelle hinzu, die die Aktion "Ansicht" darstellt. Dies ist schnell, da in der Datenbank keine Sperrung erforderlich ist. Sie fügen lediglich eine Zeile am Ende eines Heaps hinzu.

Um dies in die Gesamtzahl der Ansichten zu aggregieren, müssen SELECT COUNT(*) FROM ...Sie beispielsweise die Tabelle sperren, während die Berechnung fortschreitet. Alternativ UPDATE ... SET num_views = num_views + 1müssen Sie diese bestimmte Zeile auch jedes Mal sperren, wenn jemand sie anzeigt.

Unter dem Gesichtspunkt der Skalierbarkeit ist es also viel effizienter, jedes Mal eine Zeile hinzuzufügen, wenn jemand das Video ansieht, und dies dann etwa SELECT COUNT(*) FROM ...alle zehn Minuten.

Hinweis weiß ich nicht wirklich die Architektur von YouTube, oder ob sie auch eine relationalen Datenbank verwenden , um ihre Daten zu speichern, aber was auch immer sie tun Gebrauch, ist das Prinzip wahrscheinlich die gleichen: Einfügen von Daten ist billig, Aggregieren Werte ist (relativ) teuer .

Dean Harding
quelle
4
Verwendet es BigTable nicht mit dem Rest von Google?
TheLQ
@ Dean Harding Danke, aber heißt das nicht, dass die Tabelle Milliarden, wenn nicht Billionen Datensätze für eine Website enthalten würde, selbst bei mäßigem Verkehr, geschweige denn bei YouTube? Bei solch massiven Datensätzen vermute ich, dass SELECT COUNT (*) die Leistung der Datenbank beeinträchtigen würde, selbst wenn sie nur alle 10 Minuten ausgeführt wird. Dies würde auch mehr Speicherplatz für die Datenbank und die Sicherung erfordern. Ich sage nicht, dass es besser ist, die Tabelle bei jedem Seitenaufruf zu sperren, aber ich finde es nur schwer zu verstehen, wie große Websites mit so großen Datenmengen umgehen würden.
Tom Tucker
Es ist nicht das erste Mal, dass ich das höre. Was mich wirklich verwundert, ist, dass das Inkrementieren eines Zählers auf threadsichere Weise schwieriger oder teurer ist als das Anhängen an eine Liste. Wenn Sie Letzteres lösen können, sollte Ersteres wirklich einfach sein.
back2dos
2
@ Tom Tucker: Ja, aber wir sprechen hier über Google. Denken Sie daran :-) Eine Möglichkeit, dieses Problem in kleinerem Maßstab zu lösen, besteht darin, dass ich nach Abschluss der Aggregation die Tabelle abschneiden würde, die aggregiert wurde Daten wurden berechnet aus. Sie erhalten also nie mehr als eine Stunde (oder was auch immer Sie aktualisieren) "Rohdaten".
Dean Harding
4
Beachten Sie auch, dass die Daten in Ihrer Tabelle "Aktionen" nicht nur zur Berechnung der "Anzahl der Ansichten" verwendet werden können. Sie können es auch verwenden, um IP-Blöcke zu implementieren (dh "nicht mehr als 1 Kommentar alle 10 Sekunden von derselben IP" usw.). Sie können auch Diagramme erstellen, die die Anzahl der Ansichten im Zeitverlauf und andere Arten von Dingen anzeigen, die ein einfaches num_views = num_views + 1nicht zulässt.
Dean Harding
8

Höchstwahrscheinlich wurde der Wert irgendwo auf dem Weg zwischengespeichert, sodass veraltete Daten angezeigt werden. Da es nicht entscheidend ist, dass diese Daten korrekt sind, haben die Entwickler beschlossen, die Leistung der Aktualisierung der Daten vorzuziehen. Sie möchten wirklich nicht in die Datenbank gehen und für jeden Treffer auf der Site eine Zeilenzählung durchführen, um diese Zahl zu aktualisieren, damit dies nicht der Fall ist. Sie werden nur für eine Weile zwischengespeichert.

Steve
quelle
4

Damit große Sites skaliert werden können, müssen sie das Caching in mehreren Phasen durchführen. Dies kann Seiten-Caching, Unterseiten-Caching und / oder Datensatz-Caching sein. Möglicherweise haben Sie eine Kombination von allen in Kraft. Wenn die YouTube-Seite beispielsweise zwischengespeichert wird, bis ein neuer Kommentar hinzugefügt wird, tritt eine gewisse Verzögerung auf, bis jemand einen Kommentar veröffentlicht.

Es gibt verschiedene Möglichkeiten, Seitenaufrufe zu messen:

  • Speichern Sie es in der Datenbank als Datensatz: einfach einzufügen, es ist jedoch ein großer Wartungsaufwand für Datensätze, die nur eine Zählung liefern.
  • Speichern Sie es als Datensatz in der Datenbank und erhöhen Sie die Anzahl regelmäßig: einfach einzufügen, Stapelverarbeitung, um die gewünschten Statistiken zu sammeln, und Bereinigung nach sich selbst.
  • Aktualisieren einer Zählspalte in der Datenbank: teuer in der Aktualisierung (unter der Annahme einer Zeilensperrung), kein Wartungsaufwand, negative Leistung, wenn mehrere Personen gleichzeitig dieselbe Seite anfordern.
  • Verarbeiten Sie die Zugriffsprotokolldatei beim Rollover: Keine zusätzlichen Daten in der Datenbank, die gesamte Verarbeitung erfolgt in Stapeln offline, und die gewünschten Zusammenfassungsstatistiken werden zu gegebener Zeit aktualisiert.

Von den oben genannten Elementen deuten alle bis auf eine Option darauf hin, dass die Aktualisierungen in Stapeln durchgeführt werden. Die Anzahl der Ansichten ist nicht wirklich ein zeitkritisches Attribut, daher ist dies in Ordnung. Es ist jedoch eine zeitkritische Aktion , die Leute darauf warten zu lassen, ein Video auf YouTube anzusehen, da die Backend-Datenbank nicht mithalten kann . Das bedeutet, dass das Aktualisieren einer Spalte in der Datenbank für eine Website, die so groß wie YouTube ist, nicht funktioniert. Ich persönlich wäre nicht überrascht, wenn sie sich für die endgültige Option entscheiden würden. Die Webserver zeichnen bei jedem Besuch eine ganze Reihe von Informationen auf, einschließlich der von Ihnen verwendeten IP-Adresse, der Art und Weise, wie Sie auf die Seite verwiesen wurden usw. Es ist nur sinnvoll, diese in Stapeln zu verarbeiten und die Ergebnisse nach Bedarf zusammenzufassen.

Berin Loritsch
quelle
Ich habe nie an die letzte Lösung gedacht - sehr clever! Das allein ist +1 wert.
Tom Tucker
1
Wir haben diesen Ansatz verwendet, um die fortlaufenden "beliebtesten" Seitenlisten für Tag / Woche / Monat zu verarbeiten. Wir haben die Anzahl für Tage, Wochen und Monate auf eine einfache Eigenschaftendatei erhöht. Der aktuelle Tag wurde stündlich erneut verarbeitet, und die verbleibenden Zusammenfassungsdateien wurden wie die Sicherungsbänder für Großvater / Vater / Sohn behandelt. Im Wesentlichen benötigten wir nicht mehr als 8 Zusammenfassungsdateien (wöchentliche Zusammenfassungen und eine Zusammenfassungsdatei für jeden Tag der aktuellen Woche).
Berin Loritsch
Das ähnelt der Funktionsweise von RRDTool , obwohl RRDTool aufgrund seiner eleganten Einfachheit viel komplexer ist als Ihre Lösung.
Jörg W Mittag
0

Dies kann verschiedene Gründe haben. Alles läuft auf die Algorithmen hinaus, die von der jeweiligen Website verwendet werden. Sofern hier nicht jemand ein YouTube-Entwickler ist, bezweifle ich, dass du hier eine genaue Antwort bekommst.

chrisw
quelle