Pourquoi le nombre de vues des messages est-il lent sur la plupart des sites Web?

10

Remarquez comment le nombre de vues des vidéos YouTube est toujours lent? Par exemple, une vidéo contient 1000 commentaires et contient toujours 500 hits, et 10000 hits après.

Youtube n'est pas le seul dans ce domaine. La plupart des babillards électroniques sont mis en œuvre de cette façon et le nombre de vues est mis à jour toutes les 10 minutes environ.

Quelqu'un connaît-il la raison derrière cela?

Merci.

Tom Tucker
la source

Réponses:

20

L'enregistrement des vues est très simple, il suffit d'ajouter une ligne à un tableau qui représente l'action "voir". C'est rapide car aucun verrouillage n'est requis dans la base de données, vous ajoutez simplement une ligne à la fin d'un tas.

L'agrégation dans le nombre total de vues nécessite quelque chose comme faire, SELECT COUNT(*) FROM ...ce qui signifie que vous devez verrouiller la table pendant que le calcul progresse. Sinon, UPDATE ... SET num_views = num_views + 1vous devez également verrouiller cette ligne particulière chaque fois que quelqu'un la consulte.

Donc, du point de vue de l'évolutivité, il est beaucoup plus efficace d'ajouter une ligne chaque fois que quelqu'un regarde la vidéo, puis de faire SELECT COUNT(*) FROM ...toutes les dix minutes environ.

Remarque Je ne sais pas vraiment l'architecture de YouTube, ou si elles utilisent même une base de données relationnelle pour stocker leurs données, mais tout ce qu'ils font usage, le principe est probablement le même: insertion de données ne coûte pas cher, l' agrégation des valeurs est (relativement) cher .

Dean Harding
la source
4
N'utilise-t-il pas BigTable avec le reste de Google?
TheLQ
@Dean Harding Merci, mais cela ne signifie-t-il pas que le tableau aurait des milliards, sinon des milliards d'enregistrements pour un site Web, même avec un trafic modéré, et encore moins YouTube? Avec des enregistrements aussi massifs, je soupçonne que SELECT COUNT (*) aurait un impact sur les performances de la base de données même si elle ne s'exécute que toutes les 10 minutes. Cela nécessiterait également plus d'espace disque pour la base de données et la sauvegarde. Je ne dis pas que verrouiller la table sur chaque page consultée est mieux, mais j'ai du mal à comprendre comment les gros sites Web géreraient de telles données.
Tom Tucker
Ce n'est pas la première fois que j'entends ça. Ce qui m'intrigue vraiment, c'est que l'incrémentation d'un compteur de manière sécurisée est plus difficile ou plus coûteuse que l'ajout à une liste. Si vous pouvez résoudre ce dernier, le premier devrait être vraiment facile.
back2dos
2
@Tom Tucker: oui, mais nous parlons de Google ici, rappelez-vous :-) Une façon dont j'ai résolu ce problème à plus petite échelle est qu'une fois que j'ai terminé l'agrégation, je tronquerais le tableau agrégé les données ont été calculées à partir de. Ainsi, vous n'obtenez jamais plus d'une heure (ou quel que soit l'intervalle de mise à jour) de données "brutes".
Dean Harding
4
Gardez également à l'esprit que les données de votre table "actions" peuvent être utilisées pour plus que simplement calculer le "nombre de vues". Vous pouvez également l'utiliser pour implémenter des blocs IP (c'est-à-dire "pas plus d'un commentaire toutes les 10 secondes à partir de la même IP", etc.). Vous pouvez également générer des graphiques montrant le nombre de vues au fil du temps et d'autres types de choses qu'un simple num_views = num_views + 1ne permet pas.
Dean Harding le
8

La valeur a probablement été mise en cache quelque part en cours de route, vous voyez donc des données périmées. Parce qu'il n'est pas essentiel que ces données soient exactes, les développeurs ont décidé de privilégier les performances à la mise à jour des données. Vous ne voudriez vraiment pas aller dans la base de données et faire un comptage de lignes pour chaque hit sur le site juste pour mettre à jour ce chiffre afin qu'ils ne le fassent pas, ils le mettent simplement en cache pendant un certain temps.

Steve
la source
4

Pour que les grands sites évoluent, ils doivent effectuer la mise en cache à plusieurs étapes. Cela peut être la mise en cache des pages, la mise en cache des sous-pages et / ou la mise en cache des enregistrements. Vous pouvez avoir une combinaison de tous ces éléments en vigueur. Par exemple, si la page YouTube est mise en cache jusqu'à ce qu'un nouveau commentaire soit ajouté, vous verrez un certain retard jusqu'à ce que quelqu'un publie un commentaire.

Il existe plusieurs façons de mesurer les pages vues:

  • Stockez-le dans la base de données en tant qu'enregistrement: facile à insérer, mais c'est un surcoût de maintenance majeur pour les enregistrements qui ne fournissent qu'un décompte.
  • Stockez-le dans la base de données en tant qu'enregistrement et augmentez périodiquement les décomptes: facile à insérer, traitement par lots pour recueillir les statistiques que vous souhaitez et nettoie après lui-même.
  • Mettre à jour une colonne de comptage dans la base de données: coûteuse à mettre à jour (en supposant le verrouillage des lignes), pas de surcharge de maintenance, performances négatives lors du traitement de plusieurs personnes demandant la même page en même temps.
  • Traitez le fichier journal d'accès lors de son basculement: aucune donnée supplémentaire dans la base de données, tout le traitement est effectué par lots hors ligne et les statistiques récapitulatives que vous souhaitez sont mises à jour au moment opportun.

Parmi les éléments ci-dessus, tous sauf une option suggèrent que les mises à jour seront effectuées par lots. Le nombre de vues n'est pas vraiment un attribut critique de temps, donc c'est OK. Cependant, faire attendre les gens pour voir une vidéo sur YouTube car la base de données principale ne peut pas suivre est une action critique en termes de temps. Cela signifie que la mise à jour d'une colonne dans la base de données ne fonctionnera pas pour un site aussi grand que YouTube. Personnellement, je ne serais pas surpris s'ils optaient pour l'option finale. Les serveurs Web enregistreront toute une série d'informations pour chaque visite, y compris l'adresse IP que vous utilisez, la façon dont vous avez été redirigé vers la page, etc. Il est logique de les traiter par lots et de résumer les résultats si nécessaire.

Berin Loritsch
la source
Je n'ai jamais pensé à la dernière solution - très intelligent! Cela vaut à lui seul +1.
Tom Tucker le
1
Nous avons utilisé cette approche pour gérer les listes de pages roulantes "les plus populaires" pour le jour / la semaine / le mois. Nous avons regroupé les chiffres dans un simple fichier de propriétés pour les jours, les semaines et les mois. Le jour en cours serait retraité toutes les heures, et les fichiers récapitulatifs restants étaient traités comme les bandes de sauvegarde de grand-père / père / fils. Essentiellement, nous n'avions pas besoin de plus de 8 fichiers de synthèse (résumés hebdomadaires et un fichier de synthèse pour chaque jour de la semaine en cours).
Berin Loritsch
C'est un peu similaire à la façon dont RRDTool fonctionne, bien que RRDTool soit beaucoup plus complexe que votre solution avec sa simplicité élégante.
Jörg W Mittag
0

Cela pourrait être dû à un certain nombre de raisons. Tout se résume aux algorithmes utilisés par chaque site Web respectif. À moins que quelqu'un ici ne soit en fait un développeur YouTube, je doute que vous obtiendrez une réponse exacte ici.

chrisw
la source