การสัมภาษณ์การออกแบบระบบ: ออกแบบ Netflix

"ออกแบบ Netflix" เป็นปัญหาที่เน้นการอ่านเป็นหลัก และถูกครอบงำด้วยข้อเท็จจริงเดียว: การให้บริการวิดีโอในระดับทั่วโลกเป็นปัญหาด้านการส่งมอบเนื้อหาและการจัดเก็บมากกว่าที่จะเป็นปัญหาด้านการประมวลผล ผู้สัมภาษณ์ต้องการเห็นคุณแยก control plane (การเรียกดู การค้นหา การแนะนำ) ออกจาก data plane (การส่งไบต์จริง) และให้เหตุผลเกี่ยวกับการส่งข้อมูลระดับเพตะไบต์ให้ใกล้ผู้ใช้มากที่สุด

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

1. ชี้แจงความต้องการ

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

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

2. ประมาณสเกล

ตัวเลขเหล่านี้สนับสนุนการออกแบบที่เน้น CDN เป็นหลัก สมมติว่ามีสมาชิกหลายร้อยล้านคนและมีสตรีมที่เกิดขึ้นพร้อมกันหลายล้านรายการในช่วงพีค สตรีมเดียวใช้แบนด์วิดท์หลาย Mbps ดังนั้นปริมาณขาออกทั้งหมดจึงสูงถึงหลายสิบเทราบิตต่อวินาที — เป็นไปไม่ได้ที่จะให้บริการจากศูนย์ข้อมูลกลางเพียงไม่กี่แห่ง ซึ่งเป็นเหตุผลที่ต้องใช้การแคชที่ edge ทันที

3. ไปป์ไลน์การนำเข้าและการแปลงรหัส

มาสเตอร์ที่อัปโหลดจะถูกประมวลผลแบบออฟไลน์ ไม่ใช่บนเส้นทางการเล่น แต่ละรายการจะถูกแปลงรหัสเป็น rendition จำนวนมาก — ความละเอียดและบิตเรตหลายระดับ — และถูกแบ่งเป็นส่วนย่อยขนาดเล็ก (สองสามวินาทีต่อส่วน) สำหรับการสตรีมแบบปรับตัว

  • ฟาร์มการแปลงรหัส: แปลงมาสเตอร์เป็น rendition แบบ H.264/H.265/AV1 ที่บิตเรตหลายระดับ นี่เป็นงานแบบแบตช์ที่ทำให้ขนานกันได้ง่ายมาก
  • การแบ่งส่วนและการแพ็กเกจ: แบ่งแต่ละ rendition เป็นส่วนสั้นๆ พร้อมแมนิเฟสต์ (HLS/DASH) ที่อธิบายส่วนเหล่านั้น
  • เก็บผลลัพธ์ไว้ใน object storage (ประเภท S3) เป็นแหล่งข้อมูลจริง แล้วจึงผลักเนื้อหาที่ได้รับความนิยมไปยัง edge

4. CDN และเส้นทางการเล่น

การเล่นจะได้รับการให้บริการจาก edge ไม่ใช่จาก origin ส่วนย่อยของวิดีโอจะถูกแคชไว้ที่โหนด CDN ที่อยู่ใกล้กับผู้ใช้ในทางกายภาพ (Netflix เดินเครื่องอุปกรณ์ Open Connect ของตัวเองภายใน ISP) ไคลเอนต์จะดึงแมนิเฟสต์ จากนั้นดึงส่วนย่อยจากโหนด edge ที่แข็งแรงที่สุดที่ใกล้ที่สุด

Control plane (แคตตาล็อก การค้นหา โปรไฟล์ผู้ใช้ 'ดูต่อ') เป็นชุดบริการ API แบบไร้สถานะที่แยกออกมา โดยมีฐานข้อมูลและแคชของตัวเอง — มันส่งคืนเพียงเมทาดาต้าและ URL ของแมนิเฟสต์ และแยกออกจากการส่งไบต์ขนาดใหญ่โดยสิ้นเชิง

  • แคช edge (CDN/Open Connect): ให้บริการไบต์ส่วนใหญ่ จัดวางรายการที่ได้รับความนิยมไว้ล่วงหน้าตามภูมิภาคก่อนที่จะมีความต้องการเกิดขึ้น
  • การจัดเก็บ origin: object store ที่รองรับกรณี cache miss
  • API ของ control plane: แคตตาล็อก การอนุญาตการเล่น บุ๊กมาร์ก — payload ขนาดเล็ก ขยายตามแนวนอน พร้อมแคชอยู่ด้านหน้า

5. การสตรีมแบบบิตเรตปรับตัว

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

6. ข้อแลกเปลี่ยนที่ควรพูดออกมา

ปิดท้ายด้วยการระบุความตึงที่ผู้สัมภาษณ์รับฟัง: ต้นทุนการจัดเก็บจากการคำนวณ rendition ทั้งหมดไว้ล่วงหน้า เทียบกับความหน่วงของการแปลงรหัสแบบทันที (Netflix เลือกคำนวณไว้ล่วงหน้า — การจัดเก็บถูกกว่าความล่าช้าในการเริ่มต้น) การแคชทุกอย่าง เทียบกับการแคชเฉพาะเนื้อหาที่ได้รับความนิยมที่ edge (แคตตาล็อกแบบ long-tail ไม่สามารถอยู่ครบถ้วนในทุก edge ได้) และความสอดคล้องแบบเข้มงวดเทียบกับแบบ eventual สำหรับข้อมูล control plane เช่น 'ดูต่อ' (eventual ก็เพียงพอ) การระบุสิ่งเหล่านี้อย่างชัดเจนคือสิ่งที่ทำให้คำตอบดูมีระดับ

ฝึกการออกแบบระบบของ Netflix พร้อมความช่วยเหลือแบบเรียลไทม์

ผู้ช่วยสัมภาษณ์การออกแบบระบบของ Nativelyสามารถช่วยให้คุณมีโครงสร้างที่ชัดเจนระหว่างรอบสัมภาษณ์แบบสด — เสนอมิติต่อไปที่ควรครอบคลุมและแสดงข้อแลกเปลี่ยนแบบเรียลไทม์ ทั้งหมดบนอุปกรณ์ของคุณเอง