Çoğu web sitesinde ileti görüntüleme sayısı neden gecikmeli?


10

YouTube videolarının görüntüleme sayılarının her zaman ne kadar gecikmeli olduğuna dikkat edin? Örneğin, bir videonun 1000 yorumu vardır ve yine de 500 hit vardır ve saat sonra 10000 hit olur.

Youtube bu konuda yalnız değil. Çoğu mesaj panosu bu şekilde uygulanır ve görüntüleme sayıları her 10 dakikada bir güncellenir.

Bunun nedenini bilen var mı?

Teşekkürler.

Yanıtlar:


20

Görünümleri kaydetmek çok basittir, "görünüm" eylemini temsil eden bir tabloya satır eklemeniz yeterlidir. Bu hızlıdır çünkü veritabanında kilitleme gerekmez, sadece bir yığının sonuna satır eklersiniz.

Bunu toplam görüntüleme sayısına toplamak SELECT COUNT(*) FROM ...için hesaplama gibi bir şey gerekir , bu da hesaplama ilerlerken tabloyu kilitlemeniz gerektiği anlamına gelir. Alternatif olarak, UPDATE ... SET num_views = num_views + 1birisi her görüntülediğinde söz konusu satırı kilitlemenizi de gerektirir.

Dolayısıyla, ölçeklenebilirlik açısından, bir kişi videoyu her görüntülediğinde bir satır eklemek ve ardından SELECT COUNT(*) FROM ...her on dakikada bir yapmak çok daha etkilidir .

Not Aslında YouTube'un mimarisini veya verilerini saklamak için ilişkisel bir veritabanı kullanıp kullanmadıklarını bilmiyorum , ancak her ne kullanırlarsa kullansınlar ilke muhtemelen aynıdır: veri eklemek ucuzdur, değerleri toplamak nispeten (nispeten) pahalıdır .


4
BigTable'ı Google'ın geri kalanıyla kullanmıyor mu?
TheLQ

@Dean Harding Teşekkürler, ancak tablonun trilyonlarca olmasa bile milyarlarca trafiğe sahip olacağı anlamına gelmez, orta yoğunluklu trafikte bile çok daha az youtube var mı? Bu kadar büyük kayıtlarla, SELECT COUNT (*) öğesinin yalnızca 10 dakikada bir çalışsa bile DB üzerinde bir performans etkisi olacağını tahmin ediyorum. Bu ayrıca veritabanı ve yedekleme için daha fazla disk alanı gerektirir. Her sayfa isabetinde tabloyu kilitlemenin daha iyi olduğunu söylemiyorum, ama sadece büyük web sitelerinin bu kadar büyük verileri nasıl ele alacağını anlamakta zorlanıyorum.
Tom Tucker

Bunu ilk kez duymuyorum. Beni gerçekten şaşırtan şey, bir sayacı threadsafe tarzında arttırmanın bir listeye eklenmesinden daha zor veya daha pahalı olmasıdır. İkincisini çözebilirseniz, eskisi gerçekten kolay olmalıdır.
back2dos

2
@Tom Tucker: evet, ancak burada Google'dan bahsediyoruz, unutmayın :-) Bu sorunu daha küçük ölçekte çözebilmemin bir yolu, toplama işlemini bitirdikten sonra, toplanan tabloyu kısaltacağım verileri hesaplandı. Böylece hiçbir zaman bir saatten fazla (ya da güncelleme aralığı ne olursa olsun) "ham" veri elde edemezsiniz.
Dean Harding

4
Ayrıca, "işlemler" tablonuzdaki verilerin yalnızca "görüntüleme sayısını" hesaplamaktan daha fazlası için kullanılabileceğini unutmayın. IP bloklarını uygulamak için de kullanabilirsiniz (örn. "Aynı IP'den her 10 saniyede en fazla 1 yorum" vb.). Ayrıca zaman içindeki görüntüleme sayısını ve bir basit num_views = num_views + 1öğenin izin vermediği diğer şeyleri gösteren grafikler de oluşturabilirsiniz .
Dean Harding

8

Büyük olasılıkla değer yol boyunca bir yerde önbelleğe alındı, böylece eski verileri görüyorsunuz. Bu verilerin doğru olması kritik olmadığından, geliştiriciler güncel verileri elde etmede performansı tercih etmeye karar verdiler. Gerçekten veritabanına gitmek ve sitedeki her isabet için sadece bu rakamı güncellemek için bir satır sayısı yapmak istemezsiniz, böylece yapmazlar, sadece bir süre önbelleğe alırlar.


4

Büyük sitelerin ölçeklendirilmesi için, birkaç aşamada önbellekleme gerçekleştirmeleri gerekir. Bu sayfa önbellekleme, alt sayfa önbellekleme ve / veya kayıt önbellekleme olabilir. Bunların hepsinin bir kombinasyonu olabilir. Örneğin, youtube sayfası yeni bir yorum eklenene kadar önbelleğe alınırsa, birisi yorum gönderene kadar biraz gecikme görürsünüz.

Sayfa görüntülemelerini ölçmenin birkaç yolu vardır:

  • Veritabanında bir kayıt olarak saklayın: eklemek kolaydır, ancak yalnızca bir sayı sağlayan kayıtlar için büyük bir bakım yüküdür.
  • Veritabanında bir kayıt olarak saklayın ve sayıları periyodik olarak toplayın: eklemek kolay, istediğiniz istatistikleri toplamak için toplu işleme ve kendiliğinden temizler.
  • Veritabanındaki bir sayım sütununu güncelleyin: güncellenmesi pahalı (satır kilitleme varsayarak), bakım yükü yok, aynı sayfayı aynı anda isteyen birden fazla kişi ile uğraşırken olumsuz performans.
  • Erişim günlüğü dosyasını kullanıma sunulduğunda işleyin: veritabanında fazladan veri yok, tüm işlemler çevrim dışı gruplar halinde yapılır ve istediğiniz özet istatistikler zaman geldiğinde güncellenir.

Yukarıdaki öğelerin dışında, bir seçenek hariç tümü güncellemelerin toplu olarak yapılacağını önerir. Görüntüleme sayısı gerçekten zaman açısından kritik bir özellik değildir, bu yüzden sorun değil. Ancak, arka uç veritabanı takip edemiyorum çünkü YouTube'da bir video görüntülemek için bekleyen insanları tutmak olduğunu bir zaman kritik eylem. Bu, veritabanındaki bir sütunun güncellenmesinin YouTube kadar büyük bir site için çalışmayacağı anlamına gelir. Son seçeneği tercih ettiysem şahsen şaşırmazdım. Web sunucuları, kullandığınız IP'yi, sayfaya nasıl yönlendirildiğinizi vb. İçeren her ziyaret için bir dizi bilgi kaydedecektir. Bunları toplu olarak işlemek ve sonuçları gerektiği gibi özetlemek sadece mantıklıdır.


Son çözümü hiç düşünmemiştim - çok zekice! Bu tek başına +1 değerinde.
Tom Tucker

1
Bu yaklaşımı gün / hafta / ay için "en popüler" sayfa listelerini ele almak için kullandık. Sayıları günler, haftalar ve aylar için basit bir özellikler dosyasına yuvarladık. Geçerli gün her saat yeniden işlenir ve geri kalan özet dosyaları büyükbaba / baba / oğul yedek bantları gibi işlenir. Esasen 8'den fazla özet dosyasına ihtiyacımız yoktu (haftalık özetler ve geçerli haftanın her günü için bir özet dosyası).
Berin Loritsch

RRDTool, zarif sadeliği ile çözümünüzden çok daha karmaşık olmasına rağmen, RRDTool'un çalışma şekline benzer .
Jörg W Mittag

0

Bunun birkaç nedeni olabilir. Her şey ilgili web siteleri tarafından kullanılan algoritmalara dayanır. Buradaki biri aslında bir YouTube geliştiricisi değilse, burada kesin bir cevap alacağınızdan şüpheliyim.

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.