Perché i conteggi delle visualizzazioni dei messaggi sono in ritardo sulla maggior parte dei siti Web?


10

Notate come i conteggi delle visualizzazioni dei video di YouTube sono sempre in ritardo? Ad esempio, un video ha circa 1000 commenti e ha ancora 500 hit e avrà 10000 hit ore dopo.

Youtube non è solo in questo. La maggior parte delle bacheche vengono implementate in questo modo e il conteggio delle visualizzazioni viene aggiornato ogni 10 minuti circa.

Qualcuno sa il motivo dietro questo?

Grazie.

Risposte:


20

La registrazione delle viste è molto semplice, è sufficiente aggiungere una riga a una tabella che rappresenti l'azione "vista". Questo è veloce perché non è richiesto alcun blocco nel database, stai solo aggiungendo una riga alla fine di un heap.

Aggregarlo nel numero totale di visualizzazioni richiede qualcosa come fare, il SELECT COUNT(*) FROM ...che significa che devi bloccare la tabella mentre il calcolo sta procedendo. In alternativa, UPDATE ... SET num_views = num_views + 1richiede anche di bloccare quella particolare riga ogni volta che qualcuno la visualizza.

Quindi, dal punto di vista della scalabilità, è molto più efficiente aggiungere una riga ogni volta che qualcuno guarda il video e poi fare SELECT COUNT(*) FROM ...ogni dieci minuti circa.

Nota In realtà non conosco l'architettura di YouTube, o se usano persino un database relazionale per archiviare i loro dati, ma qualunque cosa utilizzino, il principio è probabilmente lo stesso: l'inserimento di dati è economico, l'aggregazione dei valori è (relativamente) costosa .


4
Non usa BigTable con il resto di Google?
TheLQ

@Dean Harding Grazie, ma non significa che la tabella avrebbe miliardi, se non trilioni, di record per un sito Web anche con traffico moderato, e tanto meno youtube? Con record così grandi, sospetto che SELECT COUNT (*) avrebbe un impatto sulle prestazioni sul DB anche se viene eseguito solo ogni 10 minuti. Ciò richiederebbe anche più spazio su disco per il database e il backup. Non sto dicendo che bloccare la tabella su ogni hit della pagina sia migliore, ma trovo solo difficile capire come i grandi siti web gestiscano dati così enormi.
Tom Tucker,

Non è la prima volta che lo sento. Ciò che mi ha davvero sconcertato è che incrementare un contatore in modo sicuro è più difficile o più costoso che aggiungere a un elenco. Se riesci a risolvere il secondo, il primo dovrebbe essere davvero facile.
back2dos

2
@ Tom Tucker: sì, ma stiamo parlando di Google qui, ricorda :-) Un modo in cui ho risolto questo problema su scala minore è che una volta terminata l'aggregazione, troncerei la tabella che l'aggregato i dati sono stati calcolati da. Quindi non ottieni mai più di un'ora (o qualunque sia l'intervallo di aggiornamento) di dati "non elaborati".
Dean Harding,

4
Inoltre, tieni presente che i dati nella tabella "azioni" possono essere utilizzati solo per il calcolo del "numero di visualizzazioni". È inoltre possibile utilizzarlo per implementare blocchi IP (ovvero "non più di 1 commento ogni 10 secondi dallo stesso IP" ecc.). Potresti anche generare grafici che mostrano il numero di visualizzazioni nel tempo e altri tipi di cose che un semplice num_views = num_views + 1non consente.
Dean Harding,

8

Molto probabilmente il valore è stato memorizzato nella cache da qualche parte lungo la strada in modo da visualizzare dati non aggiornati. Poiché non è fondamentale che questi dati siano accurati, gli sviluppatori hanno deciso di favorire le prestazioni rispetto all'aggiornamento dei dati. Non vorrai davvero andare al database e fare un conteggio delle righe per ogni hit sul sito solo per aggiornare questa cifra in modo che non lo facciano, lo memorizzano nella cache solo per un po '.


4

Per consentire il ridimensionamento di siti di grandi dimensioni, è necessario eseguire la memorizzazione nella cache in più fasi. Può essere la memorizzazione nella cache delle pagine, la memorizzazione nella cache delle pagine secondarie e / o la memorizzazione nella cache dei record. Potresti avere una combinazione di tutti in effetti. Ad esempio, se la pagina di YouTube viene memorizzata nella cache fino a quando non viene aggiunto un nuovo commento, vedrai un certo ritardo fino a quando qualcuno non pubblica un commento.

Esistono diversi modi per misurare le visualizzazioni di pagina:

  • Archiviarlo nel database come un record: facile da inserire, tuttavia è un grave sovraccarico di manutenzione per i record che forniscono solo un conteggio.
  • Archiviarlo nel database come un record e raggruppare periodicamente i conteggi: facile da inserire, elaborazione in batch per raccogliere le statistiche desiderate e ripulire dopo se stesso.
  • Aggiorna una colonna di conteggio nel database: costosa da aggiornare (presupponendo il blocco delle righe), nessun sovraccarico di manutenzione, prestazioni negative quando si ha a che fare con più persone che richiedono la stessa pagina contemporaneamente.
  • Elabora il file di registro degli accessi quando viene eseguito il roll over: nessun dato aggiuntivo nel database, tutta l'elaborazione viene eseguita in batch off-line e le statistiche di riepilogo desiderate vengono aggiornate quando è il momento.

Tra gli articoli sopra, tutti tranne un'opzione suggeriscono che gli aggiornamenti verranno eseguiti in batch. Il numero di visualizzazioni non è in realtà un attributo critico nel tempo, quindi va bene. Tuttavia, tenere le persone in attesa di vedere un video su YouTube perché il database back-end non è in grado di tenere il passo è un'azione che richiede tempo. Ciò significa che l'aggiornamento di una colonna nel database non funzionerà per un sito grande come YouTube. Personalmente non sarei sorpreso se avessero optato per l'opzione finale. I server web registreranno tutta una serie di informazioni per ogni visita, incluso quale IP stai usando, come sei stato indirizzato alla pagina, ecc. Ha senso elaborare quelli in batch e riassumere i risultati se necessario.


Non ho mai pensato all'ultima soluzione: molto intelligente! Solo questo vale +1.
Tom Tucker,

1
Abbiamo utilizzato questo approccio per gestire gli elenchi di pagine più popolari "più popolari" per il giorno / settimana / mese. Abbiamo raggruppato i conteggi in un semplice file delle proprietà per giorni, settimane e mesi. Il giorno corrente verrebbe rielaborato ogni ora e i restanti file di riepilogo verranno trattati come i nastri di backup di nonno / padre / figlio. In sostanza, non avevamo bisogno di più di 8 file di riepilogo (riepiloghi settimanali e un file di riepilogo per ogni giorno della settimana corrente).
Berin Loritsch,

È un po 'simile a come funziona RRDTool , sebbene RRDTool sia molto più complesso della tua soluzione con la sua elegante semplicità.
Jörg W Mittag,

0

Ciò potrebbe essere dovuto a una serie di motivi. Tutto si riduce agli algoritmi utilizzati da ciascun rispettivo sito Web. A meno che qualcuno qui non sia effettivamente uno sviluppatore di YouTube, dubito che otterrai una risposta esatta qui.

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.