System-Design-Interview: Entwerfe Twitter
„Entwerfe Twitter" ist das klassische Feed-Generierungs-Problem. Es wirkt einfach — einen Tweet posten, eine Timeline lesen — aber der interessante Teil ist, die Home-Timeline jedes Nutzers im großen Maßstab zu generieren, wobei die richtige Antwort eine hybride Fan-out-Strategie ist. Der Interviewer will sehen, wie du entdeckst, dass beide naiven Ansätze versagen, und dich zur Mischung durchdenkst.
Gehe bewusst vor: Anforderungen klären, das Lese-/Schreibverhältnis abschätzen, die Tweet-Speicherung entwerfen, dann die Timeline — vergleiche Fan-out-on-Write mit Fan-out-on-Read und komme zum Hybrid, der das Promi-Problem löst. Der folgende Leitfaden folgt diesem Pfad.
1. Anforderungen klären
Grenze auf das Kern-Feed-Problem ein. Nutzer posten Tweets, folgen anderen und lesen eine Home-Timeline, die Tweets aller, denen sie folgen, zusammenführt, neueste zuerst.
- Funktional: einen Tweet posten, folgen/entfolgen, Home-Timeline (Leute, denen man folgt), Nutzer-Timeline (ein Autor); grundlegende Suche außerhalb des Umfangs, sofern nicht gefragt.
- Nicht-funktional: sehr leselastig, Timeline-Lesevorgänge mit niedriger Latenz, hohe Verfügbarkeit; eventuelle Konsistenz für die Timeline ist akzeptabel.
- Klären: Medien, Antworten/Threads und Ranking — erwähnen, und einen chronologischen Feed für diese Runde festlegen.
2. Skalierung und das Lese-/Schreibverhältnis abschätzen
Das Verhältnis treibt das gesamte Design an. Lesevorgänge übertreffen Schreibvorgänge bei weitem — Nutzer scrollen ihre Timeline weit häufiger, als sie posten. Bei Hunderten von Millionen Nutzern muss das System Timeline-Lesevorgänge günstig machen, auch wenn das Schreibvorgänge teurer macht. Diese eine Beobachtung weist auf das Vorausberechnen von Timelines hin.
3. Tweet-Speicherung
Tweets selbst sind einfache, append-lastige Daten. Speichere sie in einem horizontal partitionierten Speicher, geschlüsselt nach Tweet-ID (mit einer zeitlich sortierbaren ID wie einer Snowflake-ID, sodass die Reihenfolge eingebettet ist). Ein separater Social-Graph-Speicher hält Follower-/Following-Beziehungen.
- Tweets: verteilter Speicher, nach Tweet-ID gesplittet; zeitlich sortierbare IDs ergeben eine günstige chronologische Reihenfolge.
- Social Graph: wer-folgt-wem, optimiert für 'alle Follower von X abrufen' und 'alle, denen X folgt, abrufen'.
- Ein Cache (Redis) hält heiße Daten — aktuelle Tweets und vorausberechnete Timelines.
4. Timeline-Generierung: Fan-out beim Schreiben vs. Lesen
Das ist der Kern des Problems. Fan-out-on-Write (Push) fügt jeden neuen Tweet zum Zeitpunkt des Postens in die vorausberechnete Timeline-Liste jedes Followers ein — Timeline-Lesevorgänge werden zu einer günstigen Cache-Abfrage, aber ein Post von jemandem mit Millionen von Followern löst Millionen von Schreibvorgängen aus. Fan-out-on-Read (Pull) baut die Timeline zum Zeitpunkt des Lesens auf, indem aktuelle Tweets aller, denen du folgst, zusammengeführt werden — günstige Schreibvorgänge, aber teure, langsame Lesevorgänge für Nutzer, die vielen Accounts folgen.
- Fan-out-on-Write: schnelle Lesevorgänge, teure Schreibvorgänge; ideal für normale Nutzer.
- Fan-out-on-Read: günstige Schreibvorgänge, teure Lesevorgänge; nötig für Accounts mit riesigen Follower-Zahlen.
5. Das Promi-Problem und der Hybrid
Kein reiner Ansatz gewinnt, also kombiniere sie. Nutze Fan-out-on-Write für die große Mehrheit der Nutzer, aber für 'Promi'-Accounts mit sehr großen Follower-Zahlen fan-outest du ihre Tweets beim Schreiben NICHT. Stattdessen führst du zum Zeitpunkt des Lesens die vorausberechnete Timeline eines Followers mit einem Live-Pull der wenigen Promis zusammen, denen er folgt. Das begrenzt die Schreibverstärkung, während Lesevorgänge schnell bleiben — die Antwort, auf die Interviewer hören.
6. Trade-offs, die man ansprechen sollte
Schließe mit den Spannungen: Schreibverstärkung vs. Lese-Latenz (die gesamte Fan-out-Entscheidung), die Speicherkosten vorausberechneter Timelines vs. deren Neuberechnung, und Konsistenz — eine Verzögerung von wenigen Sekunden, bevor ein Tweet in den Timelines der Follower erscheint, ist akzeptabel, sodass eventuelle Konsistenz dir erlaubt zu skalieren. Den Schwellenwert des Hybrids explizit zu benennen (wie du einen 'Promi' klassifizierst), zeigt seniores Urteilsvermögen.
Übe Twitters Systemdesign mit Echtzeit-Hilfe
Der System-Design-Interview-Assistent von Natively kann dich während einer Live-Runde strukturiert halten — er schlägt die nächste zu behandelnde Dimension vor und zeigt Trade-offs in Echtzeit, alles auf deinem eigenen Gerät.
