เหตุใดการดูข้อความจึงมีความล่าช้าในเว็บไซต์ส่วนใหญ่


10

โปรดสังเกตว่าจำนวนการดูวิดีโอของ youtube มีความล่าช้าหรือไม่ ตัวอย่างเช่นวิดีโอมีความคิดเห็น 1,000 รายการและยังมีการเข้าชม 500 ครั้งและจะมีการเข้าชม 10,000 ครั้งหลังจากนั้น

Youtube ไม่ได้อยู่คนเดียวในเรื่องนี้ กระดานข้อความส่วนใหญ่มีการใช้งานด้วยวิธีดังกล่าวและจำนวนการดูจะได้รับการอัปเดตทุก ๆ 10 นาที

ไม่มีใครรู้เหตุผลที่อยู่เบื้องหลังสิ่งนี้?

ขอบคุณ

คำตอบ:


20

มุมมองการบันทึกนั้นง่ายมากเพียงเพิ่มแถวในตารางที่แสดงถึงการกระทำ "มุมมอง" สิ่งนี้รวดเร็วเพราะไม่จำเป็นต้องล็อคในฐานข้อมูลคุณเพียงแค่เพิ่มแถวไปยังส่วนท้ายของฮีป

การรวมที่เป็นจำนวนการดูทั้งหมดต้องมีสิ่งที่ต้องการทำSELECT COUNT(*) FROM ...ซึ่งหมายความว่าคุณต้องล็อคตารางในขณะที่การคำนวณกำลังดำเนินอยู่ อีกวิธีหนึ่งคือUPDATE ... SET num_views = num_views + 1ต้องให้คุณล็อกแถวนั้นทุกครั้งที่มีคนดู

ดังนั้นจากมุมมองที่ปรับขนาดได้จะมีประสิทธิภาพมากกว่าในการเพิ่มแถวทุกครั้งที่มีคนดูวิดีโอแล้วทำSELECT COUNT(*) FROM ...ทุก ๆ สิบนาที

หมายเหตุฉันไม่รู้สถาปัตยกรรมของ YouTube จริง ๆ หรือไม่ว่าพวกเขาจะใช้ฐานข้อมูลเชิงสัมพันธ์เพื่อจัดเก็บข้อมูลของพวกเขา แต่ไม่ว่าพวกเขาจะใช้อะไรหลักการก็น่าจะเหมือนกัน: การแทรกข้อมูลราคาถูกค่ารวมค่อนข้างแพง .


4
ไม่ใช้ BigTable กับส่วนที่เหลือของ Google ใช่ไหม
TheLQ

@Dean Harding ขอบคุณ แต่ไม่ได้หมายความว่าตารางจะมีพันล้านถ้าไม่ใช่ trillions เป็นระเบียนสำหรับเว็บไซต์แม้ว่าจะมีปริมาณการเข้าชมปานกลาง youtube น้อยลงหรือไม่ ด้วยระเบียนที่มีขนาดใหญ่เช่นนี้ฉันสงสัยว่า SELECT COUNT (*) จะมีผลกระทบต่อประสิทธิภาพการทำงานของฐานข้อมูลแม้ว่าจะทำงานทุก 10 นาทีก็ตาม สิ่งนี้จะต้องการพื้นที่ดิสก์เพิ่มเติมสำหรับฐานข้อมูลและการสำรองข้อมูล ฉันไม่ได้บอกว่าการล็อคตารางในการเข้าชมทุกหน้านั้นดีกว่านี้ แต่ฉันแค่พบว่ามันยากที่จะเข้าใจว่าเว็บไซต์ขนาดใหญ่จะจัดการกับข้อมูลขนาดใหญ่เช่นนี้ได้อย่างไร
Tom Tucker

ไม่ใช่ครั้งแรกที่ฉันได้ยินสิ่งนี้ สิ่งที่ทำให้ฉันนึกถึงจริงๆคือการเพิ่มตัวนับในลักษณะเธรดที่ปลอดภัยนั้นยากกว่าหรือแพงกว่าการผนวกเข้าไปในรายการ หากคุณสามารถแก้ปัญหาหลังอดีตควรจะง่ายจริงๆ
back2dos

2
@ Tom Tucker: ใช่ แต่เรากำลังพูดถึง Google ที่นี่โปรดจำไว้ว่า :-) วิธีหนึ่งที่ฉันได้แก้ปัญหานี้ในระดับที่เล็กลงก็คือเมื่อฉันเสร็จสิ้นการรวมฉันจะตัดตารางที่รวมแล้ว คำนวณข้อมูลจาก ดังนั้นคุณจะไม่ได้รับมากกว่าหนึ่งชั่วโมง (หรือช่วงเวลาที่คุณอัปเดตใด ๆ ) ของข้อมูล "ดิบ"
Dean Harding

4
โปรดทราบว่าข้อมูลในตาราง "การกระทำ" ของคุณสามารถใช้งานได้มากกว่าการคำนวณ "จำนวนการดู" นอกจากนี้คุณยังสามารถใช้เพื่อใช้บล็อก IP (เช่น "ไม่เกิน 1 ความคิดเห็นทุก ๆ 10 วินาทีจาก IP เดียวกัน" ฯลฯ ) คุณสามารถสร้างกราฟที่แสดงจำนวนการดูเมื่อเวลาผ่านไปและสิ่งอื่น ๆ ที่num_views = num_views + 1ไม่อนุญาต
Dean Harding

8

ส่วนใหญ่มีการเก็บค่าไว้ที่ใดที่หนึ่งเพื่อให้คุณเห็นข้อมูลเก่า เนื่องจากมันไม่สำคัญว่าข้อมูลนี้จะถูกต้องนักพัฒนาจึงตัดสินใจที่จะสนับสนุนประสิทธิภาพมากกว่าการรับข้อมูลที่ทันสมัย คุณไม่ต้องการไปที่ฐานข้อมูลและทำการนับจำนวนแถวสำหรับการเข้าชมทุกครั้งบนไซต์เพียงเพื่ออัปเดตตัวเลขนี้เพื่อที่จะไม่ทำเช่นนั้นพวกเขาเพียงแค่ทำการแคชสักครู่


4

เพื่อให้ไซต์ขนาดใหญ่มีขนาดใหญ่ขึ้นพวกเขาต้องทำการแคชหลายขั้นตอน ซึ่งอาจเป็นการแคชเพจการแคชเพจย่อยและ / หรือการบันทึกแคช คุณอาจมีการรวมกันของพวกเขาทั้งหมดในผล ตัวอย่างเช่นหากหน้า YouTube ถูกแคชจนกว่าจะมีการเพิ่มความคิดเห็นใหม่คุณจะเห็นความล่าช้าจนกว่าจะมีคนโพสต์ความคิดเห็น

มีหลายวิธีในการวัดจำนวนการดูหน้าเว็บ:

  • เก็บไว้ในฐานข้อมูลเป็นเรคคอร์ด: ง่ายต่อการแทรกอย่างไรก็ตามเป็นค่าใช้จ่ายในการบำรุงรักษาที่สำคัญสำหรับเรคคอร์ดที่ให้การนับเท่านั้น
  • เก็บไว้ในฐานข้อมูลเป็นระเบียนและสะสมจำนวนเป็นระยะ ๆ : ง่ายต่อการแทรกการประมวลผลแบบกลุ่มเพื่อรวบรวมสถิติที่คุณต้องการและล้างข้อมูลหลังจากนั้น
  • อัปเดตคอลัมน์จำนวนในฐานข้อมูล: แพงกว่าที่จะอัปเดต (สมมติว่าการล็อกแถว) ไม่มีค่าใช้จ่ายในการบำรุงรักษาประสิทธิภาพเชิงลบเมื่อจัดการกับหลาย ๆ คนที่ร้องขอหน้าเดียวกันในเวลาเดียวกัน
  • ประมวลผลไฟล์บันทึกการเข้าถึงเมื่อเลื่อนไปมา: ไม่มีข้อมูลเพิ่มเติมในฐานข้อมูลการประมวลผลทั้งหมดจะทำในรูปแบบออฟไลน์และสถิติสรุปที่คุณต้องการจะอัปเดตเมื่อถึงเวลา

ออกจากรายการข้างต้นทั้งหมดยกเว้นตัวเลือกเดียวแสดงให้เห็นว่าการปรับปรุงจะทำในชุด จำนวนการดูไม่ใช่แอตทริบิวต์ที่สำคัญสำหรับเวลาดังนั้นนี่คือตกลง อย่างไรก็ตามการทำให้ผู้คนรอดูวิดีโอบน YouTube เพราะฐานข้อมูลเบื้องหลังไม่สามารถติดตามได้เป็นเวลาที่มีความสำคัญ ซึ่งหมายความว่าการอัปเดตคอลัมน์ในฐานข้อมูลจะไม่สามารถทำงานกับไซต์ที่มีขนาดใหญ่เท่ากับ YouTube ฉันจะไม่แปลกใจหากพวกเขาเลือกตัวเลือกสุดท้าย เว็บเซิร์ฟเวอร์จะทำการบันทึกโฮสต์ข้อมูลทั้งหมดสำหรับการเยี่ยมชมทุกครั้งรวมถึง IP ที่คุณใช้วิธีที่คุณอ้างถึงหน้าเว็บ ฯลฯ มันเหมาะสมที่จะประมวลผลข้อมูลเหล่านั้นเป็นชุดและสรุปผลลัพธ์ตามความจำเป็น


ไม่เคยนึกถึงทางออกสุดท้าย - ฉลาดมาก! เพียงอย่างเดียวนั้นมีค่า +1
Tom Tucker

1
เราใช้วิธีการนั้นในการจัดการรายการหน้า "ที่นิยมที่สุด" สำหรับวัน / สัปดาห์ / เดือน เรารีดการนับถึงไฟล์คุณสมบัติอย่างง่ายสำหรับวันสัปดาห์และเดือน วันปัจจุบันจะได้รับการประมวลผลใหม่ทุกชั่วโมงและไฟล์สรุปที่เหลือจะได้รับการปฏิบัติเหมือนกับเทปสำรองข้อมูลของปู่ / พ่อ / ลูก โดยพื้นฐานแล้วเราต้องการไฟล์สรุปไม่เกิน 8 ไฟล์ (สรุปรายสัปดาห์และไฟล์สรุปสำหรับแต่ละวันของสัปดาห์ปัจจุบัน)
Berin Loritsch

มันคล้ายกับวิธีการทำงานของRRDToolแม้ว่า RRDTool นั้นซับซ้อนกว่าโซลูชันของคุณมากด้วยความเรียบง่ายสง่างาม
Jörg W Mittag

0

นี่อาจเป็นเพราะสาเหตุหลายประการ ทุกอย่างจะไปถึงอัลกอริทึมที่ใช้โดยเว็บไซต์แต่ละแห่ง จริง ๆ แล้วถ้าไม่มีใครบางคนที่นี่เป็นนักพัฒนาของ YouTube ฉันสงสัยว่าคุณจะได้รับคำตอบที่แน่นอนที่นี่

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.