Dlaczego w większości witryn internetowych liczba wyświetleń wiadomości jest opóźniona?
10
Zauważ, że liczba wyświetleń filmów na YouTube jest zawsze opóźniona? Na przykład film ma 1000 komentarzy i nadal ma 500 wyświetleń, a po upływie 10000 wyświetleń.
YouTube nie jest w tym sam. Większość forów dyskusyjnych jest wdrażanych w ten sposób, a liczba wyświetleń jest aktualizowana co około 10 minut.
Nagrywanie widoków jest bardzo proste, wystarczy dodać wiersz do tabeli reprezentujący akcję „widok”. Jest to szybkie, ponieważ w bazie danych nie jest wymagane blokowanie, po prostu dodajesz wiersz na końcu stosu.
Łączenie tego w całkowitą liczbę widoków wymaga czegoś takiego jak robienie, SELECT COUNT(*) FROM ...co oznacza, że musisz zablokować tabelę podczas obliczeń. Alternatywnie UPDATE ... SET num_views = num_views + 1wymaga również zablokowania tego konkretnego wiersza za każdym razem, gdy ktoś go wyświetli.
Z punktu widzenia skalowalności o wiele bardziej efektywne jest dodawanie wiersza za każdym razem, gdy ktoś ogląda wideo, a następnie SELECT COUNT(*) FROM ...co dziesięć minut.
Uwaga: Tak naprawdę nie znam architektury YouTube ani tego, czy nawet używają relacyjnej bazy danych do przechowywania swoich danych, ale cokolwiek robią , zasada jest prawdopodobnie taka sama: wstawianie danych jest tanie, agregowanie wartości jest (względnie) drogie .
@Dean Harding Dzięki, ale czy to nie znaczy, że stół miałby miliardy, jeśli nie biliony, rekordów dla strony internetowej, nawet przy umiarkowanym ruchu, a tym bardziej na youtube? Przy tak ogromnych rekordach podejrzewam, że SELECT COUNT (*) miałby wpływ na wydajność DB, nawet jeśli działa tylko co 10 minut. Wymagałoby to również więcej miejsca na dysku dla bazy danych i kopii zapasowej. Nie twierdzę, że blokowanie tabeli przy każdym wyświetleniu strony jest lepsze, ale po prostu trudno mi zrozumieć, jak duże strony internetowe poradziłyby sobie z tak dużymi danymi.
Tom Tucker,
To nie pierwszy raz to słyszę. To, co naprawdę mnie dziwi, to fakt, że zwiększanie licznika w sposób bezpieczny dla wątków jest trudniejsze lub droższe niż dołączanie do listy. Jeśli potrafisz rozwiązać ten drugi, pierwszy powinien być naprawdę łatwy.
back2dos,
2
@Tom Tucker: tak, ale mówimy tutaj o Google, pamiętaj :-) Jednym ze sposobów rozwiązania tego problemu na mniejszą skalę jest to, że po zakończeniu agregacji obciąłbym tabelę dane zostały obliczone na podstawie. Dlatego nigdy nie dostajesz więcej niż godzinę (lub cokolwiek, co aktualizujesz) z „surowych” danych.
Dean Harding,
4
Należy również pamiętać, że dane w tabeli „działań” można wykorzystać nie tylko do obliczenia „liczby wyświetleń”. Możesz go również użyć do implementacji bloków IP (tzn. „Nie więcej niż 1 komentarz co 10 sekund od tego samego adresu IP” itp.). Możesz także generować wykresy pokazujące liczbę wyświetleń w czasie oraz inne rzeczy, na które proste num_views = num_views + 1nie pozwala.
Dean Harding
8
Najprawdopodobniej wartość została zbuforowana gdzieś po drodze, więc widać nieaktualne dane. Ponieważ dokładność tych danych nie jest krytyczna, programiści zdecydowali się na lepszą wydajność niż aktualizację danych. Naprawdę nie chciałbyś iść do bazy danych i zliczyć liczbę wierszy dla każdego trafienia w witrynie, aby zaktualizować tę liczbę, aby nie robili tego, po prostu przechowują ją w pamięci podręcznej przez pewien czas.
Aby duże witryny mogły się skalować, muszą wykonywać buforowanie na kilku etapach. Może to być buforowanie stron, buforowanie podstron i / lub buforowanie rekordów. Możesz mieć kombinację ich wszystkich. Na przykład jeśli strona youtube jest buforowana do momentu dodania nowego komentarza, pojawi się pewne opóźnienie, dopóki ktoś nie opublikuje komentarza.
Istnieje kilka sposobów pomiaru wyświetleń strony:
Przechowuj go w bazie danych jako rekord: łatwy do wstawienia, jednak jest to znaczny koszt utrzymania w przypadku rekordów, które tylko liczą.
Przechowuj go w bazie danych jako rekord i okresowo zwijaj liczniki: łatwe do wstawienia, przetwarzanie wsadowe w celu zebrania pożądanych statystyk i czyści się po sobie.
Zaktualizuj kolumnę zliczania w bazie danych: kosztowna aktualizacja (przy założeniu blokowania wierszy), brak kosztów utrzymania, negatywna wydajność w przypadku wielu osób żądających tej samej strony w tym samym czasie.
Przetwórz plik dziennika dostępu, gdy zostanie on przerzucony: brak dodatkowych danych w bazie danych, całe przetwarzanie odbywa się w partiach offline, a statystyki podsumowujące, które chcesz, są aktualizowane w odpowiednim czasie.
Spośród powyższych elementów wszystkie oprócz jednej opcji sugerują, że aktualizacje będą wykonywane partiami. Liczba wyświetleń nie jest tak naprawdę krytycznym atrybutem czasu, więc jest to w porządku. Jednak trzymanie ludzi czekających na obejrzenie filmu na YouTube, ponieważ baza danych zaplecza nie może nadążyć, jest działaniem krytycznym czasowo. Oznacza to, że aktualizacja kolumny w bazie danych nie będzie działać dla witryny tak dużej jak YouTube. Osobiście nie byłbym zaskoczony, gdyby wybrali ostateczną opcję. Serwery WWW będą rejestrować całą masę informacji dla każdej wizyty, w tym informacje o używanym adresie IP, sposobie odesłania do strony itp. Sensowne jest przetwarzanie tych partii w partiach i podsumowywanie wyników w razie potrzeby.
Nigdy nie myślałem o ostatnim rozwiązaniu - bardzo sprytnym! Samo jest warte +1.
Tom Tucker,
1
Zastosowaliśmy to podejście do obsługi przewijanych „najpopularniejszych” list stron na dzień / tydzień / miesiąc. Zebraliśmy liczby do prostego pliku właściwości dla dni, tygodni i miesięcy. Bieżący dzień będzie przetwarzany co godzinę, a pozostałe pliki podsumowań były traktowane jak taśmy kopii zapasowych dziadka / ojca / syna. Zasadniczo potrzebowaliśmy nie więcej niż 8 plików podsumowań (podsumowań tygodniowych i pliku podsumowań na każdy dzień bieżącego tygodnia).
Berin Loritsch,
Jest to trochę podobne do działania RRDTool , chociaż RRDTool jest znacznie bardziej złożony niż twoje rozwiązanie dzięki swojej eleganckiej prostocie.
Jörg W Mittag
0
Może to wynikać z wielu powodów. Wszystko sprowadza się do algorytmów używanych przez poszczególne strony internetowe. O ile ktoś tutaj nie jest programistą YouTube, wątpię, aby uzyskać tutaj dokładną odpowiedź.
num_views = num_views + 1
nie pozwala.Najprawdopodobniej wartość została zbuforowana gdzieś po drodze, więc widać nieaktualne dane. Ponieważ dokładność tych danych nie jest krytyczna, programiści zdecydowali się na lepszą wydajność niż aktualizację danych. Naprawdę nie chciałbyś iść do bazy danych i zliczyć liczbę wierszy dla każdego trafienia w witrynie, aby zaktualizować tę liczbę, aby nie robili tego, po prostu przechowują ją w pamięci podręcznej przez pewien czas.
źródło
Aby duże witryny mogły się skalować, muszą wykonywać buforowanie na kilku etapach. Może to być buforowanie stron, buforowanie podstron i / lub buforowanie rekordów. Możesz mieć kombinację ich wszystkich. Na przykład jeśli strona youtube jest buforowana do momentu dodania nowego komentarza, pojawi się pewne opóźnienie, dopóki ktoś nie opublikuje komentarza.
Istnieje kilka sposobów pomiaru wyświetleń strony:
Spośród powyższych elementów wszystkie oprócz jednej opcji sugerują, że aktualizacje będą wykonywane partiami. Liczba wyświetleń nie jest tak naprawdę krytycznym atrybutem czasu, więc jest to w porządku. Jednak trzymanie ludzi czekających na obejrzenie filmu na YouTube, ponieważ baza danych zaplecza nie może nadążyć, jest działaniem krytycznym czasowo. Oznacza to, że aktualizacja kolumny w bazie danych nie będzie działać dla witryny tak dużej jak YouTube. Osobiście nie byłbym zaskoczony, gdyby wybrali ostateczną opcję. Serwery WWW będą rejestrować całą masę informacji dla każdej wizyty, w tym informacje o używanym adresie IP, sposobie odesłania do strony itp. Sensowne jest przetwarzanie tych partii w partiach i podsumowywanie wyników w razie potrzeby.
źródło
Może to wynikać z wielu powodów. Wszystko sprowadza się do algorytmów używanych przez poszczególne strony internetowe. O ile ktoś tutaj nie jest programistą YouTube, wątpię, aby uzyskać tutaj dokładną odpowiedź.
źródło