Mengapa tampilan pesan dianggap lamban di sebagian besar situs web?

10

Perhatikan bagaimana jumlah tayangan video youtube selalu lamban? Misalnya, sebuah video memiliki 1000 komentar dan masih memiliki 500 hit, dan akan memiliki 10.000 hit beberapa jam setelahnya.

Youtube tidak sendirian dalam hal ini. Sebagian besar papan pesan diimplementasikan dengan cara itu dan jumlah tayangan diperbarui seperti setiap 10 menit atau lebih.

Adakah yang tahu alasan di balik ini?

Terima kasih.

Tom Tucker
sumber

Jawaban:

20

Merekam tampilan sangat sederhana, cukup tambahkan baris ke tabel yang mewakili tindakan "tampilan". Ini cepat karena tidak diperlukan penguncian dalam basis data, Anda hanya menambahkan satu baris ke ujung tumpukan.

Menggabungkannya ke dalam jumlah total tampilan memerlukan sesuatu seperti melakukan SELECT COUNT(*) FROM ...yang berarti Anda harus mengunci tabel saat perhitungan sedang berlangsung. Atau, Anda UPDATE ... SET num_views = num_views + 1juga harus mengunci baris itu setiap kali seseorang melihatnya.

Jadi dari sudut pandang skalabilitas, jauh lebih efisien untuk menambahkan baris setiap kali seseorang melihat video dan kemudian melakukannya SELECT COUNT(*) FROM ...setiap sepuluh menit.

Catatan Saya tidak benar-benar tahu arsitektur YouTube, atau apakah mereka bahkan menggunakan database relasional untuk menyimpan data mereka, tapi apa pun yang mereka lakukan digunakan, prinsipnya adalah kemungkinan sama: Data memasukkan murah, menggabungkan nilai-nilai adalah (relatif) mahal .

Dean Harding
sumber
4
Bukankah itu menggunakan BigTable dengan Google lainnya?
TheLQ
@Dean Harding Terima kasih, tetapi bukankah itu berarti tabel akan memiliki miliaran, jika tidak triliunan, catatan untuk situs web bahkan dengan lalu lintas sedang, apalagi youtube? Dengan catatan besar seperti itu, saya menduga bahwa SELECT COUNT (*) akan memiliki dampak kinerja pada DB walaupun hanya berjalan setiap 10 menit. Ini juga akan membutuhkan lebih banyak ruang disk untuk database dan cadangan. Saya tidak mengatakan mengunci tabel pada setiap klik halaman adalah lebih baik, tetapi saya hanya merasa sulit untuk memahami bagaimana situs web besar akan menangani data sebesar itu.
Tom Tucker
Ini bukan pertama kalinya saya mendengar ini. Yang benar-benar membingungkan saya, adalah bahwa menambahkan penghitung dengan cara yang lebih aman lebih sulit atau lebih mahal daripada menambahkan ke daftar. Jika Anda bisa menyelesaikan yang terakhir, yang pertama harus sangat mudah.
back2dos
2
@ Tom Tucker: ya, tapi kita berbicara tentang Google di sini, ingat :-) Salah satu cara saya menyelesaikan masalah ini dalam skala yang lebih kecil adalah setelah saya menyelesaikan agregasi, saya akan memotong tabel yang diagregasi data dihitung dari. Jadi, Anda tidak pernah mendapatkan lebih dari satu jam (atau apa pun interval pembaruan Anda) dari data "mentah".
Dean Harding
4
Ingat juga bahwa data dalam tabel "tindakan" Anda dapat digunakan untuk lebih dari sekadar menghitung "jumlah tampilan". Anda juga dapat menggunakannya untuk mengimplementasikan blok IP (yaitu "tidak lebih dari 1 komentar setiap 10 detik dari IP yang sama" dll). Anda juga dapat membuat grafik yang menunjukkan jumlah penayangan dari waktu ke waktu, dan hal-hal lain yang num_views = num_views + 1tidak diizinkan oleh yang sederhana .
Dean Harding
8

Kemungkinan besar nilai telah di-cache di suatu tempat di sepanjang jalan sehingga Anda melihat data basi. Karena itu tidak penting untuk data ini menjadi akurat para pengembang telah memutuskan untuk mendukung kinerja daripada mendapatkan data terbaru. Anda benar-benar tidak ingin pergi ke database dan melakukan penghitungan baris untuk setiap klik di situs hanya untuk memperbarui angka ini sehingga mereka tidak, mereka hanya menyimpannya untuk sementara waktu.

Steve
sumber
4

Agar situs besar dapat berkembang, mereka harus melakukan caching pada beberapa tahap. Itu bisa berupa caching halaman, caching sub-halaman, dan / atau caching rekaman. Anda mungkin memiliki kombinasi dari semuanya. Misalnya, jika halaman youtube di-cache hingga komentar baru ditambahkan, Anda akan melihat beberapa keterlambatan hingga seseorang mengirim komentar.

Ada beberapa cara untuk mengukur tampilan halaman:

  • Menyimpannya dalam database sebagai catatan: mudah untuk dimasukkan, namun itu adalah overhead pemeliharaan utama untuk catatan yang hanya menyediakan hitungan.
  • Menyimpannya dalam database sebagai catatan dan menggulung penghitungan secara berkala: mudah dimasukkan, pemrosesan batch untuk mengumpulkan statistik yang Anda inginkan, dan membersihkan setelahnya.
  • Perbarui kolom hitungan dalam database: mahal untuk diperbarui (dengan asumsi penguncian baris), tanpa overhead pemeliharaan, kinerja negatif ketika berhadapan dengan banyak orang yang meminta halaman yang sama pada waktu yang sama.
  • Memproses file log akses ketika terguling: tidak ada data tambahan dalam database, semua pemrosesan dilakukan dalam batch secara off-line, dan statistik ringkasan yang Anda inginkan diperbarui ketika waktunya.

Dari semua item di atas, semua kecuali satu opsi menunjukkan bahwa pembaruan akan dilakukan dalam batch. Jumlah tampilan sebenarnya bukan atribut kritis waktu, jadi ini OK. Namun, membuat orang menunggu untuk melihat video di YouTube karena database backend tidak dapat mengikuti adalah tindakan kritis waktu. Itu berarti memperbarui kolom dalam basis data tidak akan berfungsi untuk situs sebesar YouTube. Saya pribadi tidak akan terkejut jika mereka memilih opsi terakhir. Server web akan merekam seluruh host informasi untuk setiap kunjungan termasuk IP apa yang Anda gunakan, bagaimana Anda dirujuk ke halaman, dll. Hanya masuk akal untuk memprosesnya dalam kumpulan dan merangkum hasilnya sesuai keperluan.

Berin Loritsch
sumber
Tidak pernah memikirkan solusi terakhir - sangat pintar! Itu saja bernilai +1.
Tom Tucker
1
Kami menggunakan pendekatan itu untuk menangani daftar halaman "paling populer" untuk hari / minggu / bulan. Kami menggulung penghitungan ke file properti sederhana selama berhari-hari, berminggu-minggu, dan berbulan-bulan. Hari ini akan diproses kembali setiap jam, dan file ringkasan lainnya diperlakukan seperti kaset cadangan kakek / ayah / anak. Intinya kami membutuhkan tidak lebih dari 8 file ringkasan (ringkasan mingguan, dan file ringkasan untuk setiap hari dalam minggu ini).
Berin Loritsch
Itu mirip dengan cara kerja RRDTool , meskipun RRDTool jauh lebih kompleks daripada solusi Anda dengan kesederhanaannya yang elegan.
Jörg W Mittag
0

Ini bisa disebabkan oleh beberapa alasan. Semuanya bermuara pada algoritma yang digunakan oleh masing-masing situs web masing-masing. Kecuali jika seseorang di sini adalah pengembang YouTube, saya ragu Anda akan mendapatkan jawaban yang tepat di sini.

chrisw
sumber