Rozmowa o projektowaniu systemów: Zaprojektuj Netflix
„Zaprojektuj Netflix" to problem zdominowany przez odczyt, zarządzany przez jeden fakt: serwowanie wideo na globalną skalę jest w znacznie większym stopniu problemem dystrybucji treści i przechowywania niż problemem obliczeniowym. Rekruter chce zobaczyć, jak oddzielasz warstwę kontrolną (przeglądanie, wyszukiwanie, rekomendacje) od warstwy danych (faktyczne strumieniowanie bajtów) i rozumujesz o dostarczaniu petabajtów blisko użytkowników.
Pracuj w porządku: wyjaśnij wymagania, oszacuj skalę, zaprojektuj pipeline uploadu/transkodowania, następnie ścieżkę odtwarzania przez CDN, a zakończ adaptacyjnym bitrate'em i kompromisami. Poniższy przewodnik trzyma się tej struktury, byś ćwiczył rozumowanie, a nie zapamiętywał architekturę.
1. Wyjaśnienie wymagań
Oddziel funkcjonalne od niefunkcjonalnych i precyzyjnie ustal zakres. Jądrem jest: użytkownicy przeglądają katalog i płynnie odtwarzają wideo na różnych urządzeniach i w różnych warunkach sieciowych.
- Funkcjonalne: przeglądanie/wyszukiwanie katalogu, rozpoczęcie odtwarzania, adaptacyjna jakość, kontynuacja od miejsca przerwania, wiele urządzeń.
- Niefunkcjonalne: bardzo wysoka dostępność, niskie opóźnienie startu, płynne odtwarzanie (bez buforowania), globalny zasięg.
- Poza zakresem (powiedz to wprost): wewnętrzne szczegóły ML rekomendacji, rozliczenia, szczegóły DRM — wspomnij o nich, a potem odłóż na później.
2. Oszacowanie skali
Liczby uzasadniają projekt stawiający CDN na pierwszym miejscu. Przyjmijmy setki milionów subskrybentów i wiele milionów równoczesnych strumieni w szczycie. Pojedynczy strumień zużywa kilka Mb/s, więc łączne wyjście sięga dziesiątek terabitów na sekundę — niemożliwe do obsłużenia z kilku centralnych centrów danych, co od razu motywuje cachowanie na brzegu sieci.
3. Pipeline pozyskiwania i transkodowania
Przesłane mastery są przetwarzane offline, a nie na ścieżce odtwarzania. Każdy tytuł jest transkodowany do wielu renderów (rendition) — kilku rozdzielczości i bitrate'ów — i segmentowany na małe fragmenty (po kilka sekund każdy) dla strumieniowania adaptacyjnego.
- Farma transkodowania: konwertuje master na rendery H.264/H.265/AV1 przy kilku bitrate'ach; to praca wsadowa, którą łatwo zrównoleglić.
- Segmentacja i pakowanie: dzieli każdy render na krótkie segmenty wraz z manifestem (HLS/DASH), który je opisuje.
- Zapisuje wyniki w magazynie obiektów (typu S3) jako źródło prawdy, a następnie przesyła popularną treść na brzeg sieci.
4. CDN i ścieżka odtwarzania
Odtwarzanie jest obsługiwane z brzegu sieci, nie z origin. Segmenty wideo są cache'owane na węzłach CDN fizycznie bliskich użytkownikom (Netflix prowadzi własne urządzenia Open Connect wewnątrz dostawców internetu). Klient pobiera manifest, a potem ściąga segmenty z najbliższego zdrowego węzła brzegowego.
Warstwa kontrolna (katalog, wyszukiwanie, profile użytkowników, „kontynuuj oglądanie") to odrębny zestaw bezstanowych usług API wspartych własnymi bazami danych i cache'ami — zwraca metadane i URL manifestu, i jest całkowicie oddzielona od ciężkiego dostarczania bajtów.
- Cache brzegowy (CDN/Open Connect): obsługuje ogromną większość bajtów; wstępnie umieszcza popularne tytuły według regionu, zanim pojawi się popyt.
- Magazyn origin: magazyn obiektów wspierający cache miss.
- API warstwy kontrolnej: katalog, autoryzacja odtwarzania, zakładki — małe payloady, skalowane horyzontalnie, z cache z przodu.
5. Strumieniowanie z adaptacyjnym bitrate'em
Płynne odtwarzanie przy zmiennych sieciach pochodzi od klienta, nie od serwera. Odtwarzacz monitoruje przepustowość i poziom bufora, i przełącza jakość segmentu w górę lub w dół między segmentami, korzystając z listy renderów w manifeście — wyższy bitrate na szybkich połączeniach, niższy, aby uniknąć buforowania na wolnych.
6. Kompromisy, które warto wypowiedzieć
Zakończ napięciami, które słyszy rekruter: koszt przechowywania wszystkich prekalkulowanych renderów kontra opóźnienie transkodowania na żywo (Netflix prekalkuluje — przechowywanie jest tańsze niż opóźnienie startu); cache'owanie wszystkiego kontra cache'owanie popularnej treści na brzegu (katalog z długim ogonem nie może w pełni mieścić się na każdym brzegu); oraz silna spójność kontra ostateczna dla danych warstwy kontrolnej, takich jak „kontynuuj oglądanie" (ostateczna jest w porządku). Nazwanie tego to różnica, która czyni odpowiedź dojrzałą.
Poćwicz projektowanie systemu Netflix z pomocą w czasie rzeczywistym
Asystent rozmów o projektowaniu systemów od Natively może utrzymać cię w uporządkowanej strukturze podczas rozmowy na żywo — proponując następny wymiar do omówienia i pokazując kompromisy w czasie rzeczywistym, wszystko na twoim własnym urządzeniu.
