Rozmowa o projektowaniu systemów: Zaprojektuj Twitter
„Zaprojektuj Twitter" to klasyczny problem generowania kanału. Wygląda prosto — opublikuj tweet, przeczytaj osi czasu — ale ciekawa część to generowanie osi czasu głównej każdego użytkownika na dużą skalę, gdzie właściwą odpowiedzią jest hybrydowa strategia fan-out. Rekruter chce zobaczyć, jak odkrywasz, że obie naiwne podejścia zawodzą, i rozumujesz aż do dojścia do mieszanki.
Pracuj z rozmysłem: wyjaśnij wymagania, oszacuj proporcję odczytów do zapisów, zaprojektuj przechowywanie tweetów, a potem osi czasu — porównując fan-out-on-write z fan-out-on-read i dochodząc do hybrydy, która radzi sobie z problemem celebrytów. Poniższy przewodnik trzyma się tej ścieżki.
1. Wyjaśnienie wymagań
Ogranicz się do podstawowego problemu kanału. Użytkownicy publikują tweety, śledzą innych i czytają oś czasu główną, która łączy tweety wszystkich obserwowanych, od najnowszych.
- Funkcjonalne: opublikowanie tweeta, obserwowanie/przestanie obserwować, oś czasu główna (osoby, które obserwujesz), oś czasu użytkownika (jeden autor); podstawowe wyszukiwanie poza zakresem, o ile nie zostanie poproszone.
- Niefunkcjonalne: bardzo zorientowane na odczyt, odczyty osi czasu o niskim opóźnieniu, wysoka dostępność; ostateczna spójność dla osi czasu jest akceptowalna.
- Do wyjaśnienia: multimedia, odpowiedzi/wątki i ranking — uznaj je, i ograniczony do chronologicznego kanału na tę rozmowę.
2. Oszacowanie skali i proporcji odczytów do zapisów
Ta proporcja kieruje całym projektem. Odczyty znacznie przewyższają zapisy — użytkownicy przewijają swoją oś czasu dużo częściej, niż publikują. Przy setkach milionów użytkowników system musi uczynić odczyty osi czasu tanimi, nawet jeśli to podraża zapisy. Ta jedna obserwacja wskazuje na prekomputowanie osi czasu.
3. Przechowywanie tweetów
Same tweety to proste dane, zdominowane przez dopisywanie. Przechowuj je w magazynie podzielonym horyzontalnie, z kluczem według ID tweeta (z ID sortowalnym czasowo, takim jak Snowflake ID, dzięki czemu kolejność jest wbudowana). Osobny magazyn grafu społecznego przechowuje relacje obserwujących/obserwowanych.
- Tweety: rozproszony magazyn, dzielony według ID tweeta; ID sortowalne czasowo dają tanie sortowanie chronologiczne.
- Graf społeczny: kto-kogo-obserwuje, zoptymalizowany dla 'pobierz wszystkich obserwujących X' i 'pobierz wszystkich, których obserwuje X'.
- Cache (Redis) przechowuje dane gorące — ostatnie tweety i prekomputowane osi czasu.
4. Generowanie osi czasu: fan-out przy zapisie kontra przy odczycie
To jest serce problemu. Fan-out-on-write (push) wstawia każdy nowy tweet do prekomputowanej listy osi czasu każdego obserwującego w momencie publikacji — odczyty osi czasu stają się tanim zapytaniem do cache'a, ale post od kogoś z milionami obserwujących wywołuje miliony zapisów. Fan-out-on-read (pull) buduje oś czasu w momencie odczytu, łącząc ostatnie tweety wszystkich obserwowanych — tanie zapisy, ale kosztowne, wolne odczyty dla użytkowników obserwujących wiele kont.
- Fan-out-on-write: szybkie odczyty, kosztowne zapisy; świetne dla zwykłych użytkowników.
- Fan-out-on-read: tanie zapisy, kosztowne odczyty; potrzebne dla kont z ogromną liczbą obserwujących.
5. Problem celebrytów i hybryda
Żadne czyste podejście nie wygrywa, więc je połącz. Użyj fan-out-on-write dla ogromnej większości użytkowników, ale dla kont 'celebrytów' z bardzo dużą liczbą obserwujących NIE wykonuj fan-out ich tweetów przy zapisie. Zamiast tego, w momencie odczytu, połącz prekomputowaną oś czasu obserwującego z bieżącym odczytem nielicznych celebrytów, których obserwuje. To ogranicza amplifikację zapisów, zachowując szybkie odczyty — odpowiedź, której słuchają rekruterzy.
6. Kompromisy, które warto wypowiedzieć
Zakończ napięciami: amplifikacja zapisów kontra opóźnienie odczytu (cała decyzja fan-out), koszt przechowywania prekomputowanych osi czasu kontra ich ponowne obliczanie, oraz spójność — kilka sekund zwłoki przed pojawieniem się tweeta na osiach czasu obserwujących jest akceptowalne, więc ostateczna spójność pozwala skalować. Wyraźne podanie progu hybrydy (jak klasyfikujesz 'celebrytę') pokazuje dojrzały osąd.
Poćwicz projektowanie systemu Twitter 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.
