Inhaltsverzeichnis[Ausblenden][Zeigen]
Umfangreiche Online-Anwendungen haben in den vergangenen zwei Jahrzehnten einen langen Weg zurückgelegt. Diese Innovationen haben unsere Wahrnehmung der Softwareentwicklung verändert. Facebook, Instagram und Twitter sind zum Beispiel alle skalierbare Plattformen.
Diese Systeme müssen so aufgebaut sein, dass sie riesige Verkehrs- und Datenmengen bewältigen können, da sie von Milliarden von Menschen auf der ganzen Welt gleichzeitig genutzt werden. Das ist wenn System-Design tritt das Bild ein.
Der Prozess der Erstellung der Architektur, Schnittstellen und Daten für ein System, das bestimmte Kriterien erfüllt, wird als Systemdesign bezeichnet. Durch kohärente und effiziente Systeme erfüllt das Systemdesign die Anforderungen Ihres Unternehmens oder Ihrer Organisation.
Sobald Ihr Unternehmen oder Ihre Organisation seine Kriterien festgelegt hat, können Sie damit beginnen, sie in ein physisches Systemdesign zu integrieren, das die Anforderungen Ihrer Verbraucher erfüllt.
Ob Sie sich für eine maßgeschneiderte Entwicklung, kommerzielle Lösungen oder eine Kombination aus beidem entscheiden, das Design Ihres Systems bestimmt, wie Sie es bauen.
In diesem Beitrag werfen wir einen detaillierten Blick auf das Systemdesign der Twitter-Timeline, komplett mit einem Tutorial. Lass uns anfangen.
Schritt 1: Skizzieren Sie den Anwendungsfall und die Einschränkungen
Anwendungsfall
- Ein Benutzer lädt einen Tweet hoch.
- Der Dienst sendet Push-Benachrichtigungen und E-Mails an Follower von Tweets.
- Die Chronik des Benutzers wird angezeigt (Aktivität des Benutzers)
- Der Benutzer sieht sich die Home-Timeline an (Aktivitäten von Personen, denen der Benutzer folgt)
- Schlüsselwörter werden vom Benutzer gesucht.
- Der Service ist wirklich zugänglich.
Außer Reichweite
- Tweets werden über diesen Dienst an Twitter Firehose und andere Streams gesendet.
- Der Dienst entfernt Tweets basierend auf den Sichtbarkeitseinstellungen des Benutzers.
- Wenn der Benutzer der Person, der geantwortet wird, nicht auch folgt, blenden Sie die Antwort aus.
- Beachten Sie die Option „Retweets ausblenden“.
- Analyse
Einschränkungen und Annahmen
Staatliche Annahmen
- Der Verkehr ist nicht gleichmäßig verteilt.
- Es sollte einfach sein, einen Tweet zu senden.
- Wenn Sie nicht Millionen von Followern haben, sollte das Senden eines Tweets an alle Ihre Follower schnell gehen.
- Es gibt 100 Millionen aktive Benutzer.
- 15 Milliarden Tweets jeden Monat oder 500 Millionen Tweets jeden Tag
- Jeder Tweet hat im Durchschnitt einen Fanout von 10 Zustellungen.
- Jeden Tag liefert Fanout 5 Milliarden Tweets.
- Fanout liefert jeden Monat 150 Milliarden Tweets.
- 250 Milliarden monatliche Leseanfragen
- 10 Milliarden monatliche Suchanfragen
Timeline
- Die Zeitleiste sollte einfach zu navigieren sein.
- Bei Twitter geht es mehr ums Lesen als ums Schreiben.
- Für schnelles Lesen von Tweets optimieren
- Der Tweet-Konsum ist zeitaufwändig.
Suche
- Der Suchvorgang sollte schnell sein.
- Die Suche ist zeitaufwändig.
Verbrauch berechnen
Größe jedes Tweets:
- 8 Bytes Tweet-ID
- 32 Bytes Benutzer-ID
- 140 Byte Text
- Medien – durchschnittlich 10 KB
- Gesamt: ~10 KB
Jeden Monat werden 150 TB frischer Tweet-Content generiert.
- * 500 Millionen Tweets jeden Tag * 30 Tage pro Monat * 10 KB pro Tweet
- In drei Jahren gab es 5.4 PB an frischen Tweet-Inhalten.
Es gibt 100,000 Leseanforderungen pro Sekunde.
- * (400 Anfragen pro Sekunde / 1 Milliarde Anfragen pro Monat) 250 Milliarden Leseanfragen pro Monat
Es gibt 6,000 Tweets pro Sekunde.
- * (400 Anfragen pro Sekunde / 1 Milliarde Anfragen pro Monat) 15 Milliarden Tweets jeden Monat
Auf Fanout werden jede Sekunde 60 Tweets gesendet.
- Fanout liefert jeden Monat 150 Milliarden Tweets* (400 Anfragen pro Sekunde / 1 Milliarde Anfragen pro Monat).
4,000 Informationsanfragen pro Sekunde
- * (400 Anfragen pro Sekunde / 1 Milliarde Anfragen pro Monat) 10 Milliarden Suchanfragen pro Monat
Einige nützliche Konvertierung
- Jeden Monat vergehen 2.5 Millionen Sekunden.
- 2.5 Millionen Anfragen pro Monat bei 1 Anfrage pro Sekunde
- 100 Millionen Anfragen pro Monat x 40 Anfragen pro Sekunde
- 1 Milliarde Anfragen pro Monat = 400 Anfragen pro Sekunde
Schritt 2: Diagramm auf hoher Ebene
Schritt 3: Kernkomponenten erklären
Wir könnten die eigenen Tweets des Benutzers speichern, um die Benutzerzeitleiste (Aktivität des Benutzers) in einer relationalen Datenbank zu füllen, wenn er einen Tweet einreicht. Es ist schwieriger, Tweets zu liefern und die Home-Timeline zu entwickeln (Aktivitäten von Personen, denen der Benutzer folgt).
Eine typische relationale Datenbank wäre durch das Auffächern von Tweets an alle Follower überfordert (60 Tweets, die jede Sekunde zugestellt werden). Wir werden wahrscheinlich einen schnell schreibenden Datenspeicher wie eine NoSQL-Datenbank oder einen Memory Cache wählen wollen.
Das sequentielle Lesen von 1 MB aus dem Speicher dauert ungefähr 250 Mikrosekunden, aber das Lesen von SSD dauert viermal so lange und das Lesen von der Festplatte dauert 4-mal so lange.
Ein Objektspeicher kann verwendet werden, um Daten wie Bilder und Videos zu speichern.
- Der Webserver, der als Reverse-Proxy fungiert, empfängt einen Tweet vom Client.
- Die Anforderung wird vom Webserver an den Write-API-Server gesendet.
- Die Write-API speichert den Tweet in einer SQL-Datenbank in der Timeline des Benutzers.
Der Fan-Out-Dienst wird von der Schreib-API kontaktiert und führt die folgenden Aufgaben aus.
- Findet die Follower des Benutzers im Memory Cache, indem der User Graph Service abgefragt wird.
- Auf einem Memory Cache wird der Tweet in der Home-Timeline der Follower des Benutzers gespeichert.
- 1,000 Follower = 1,000 Suchen und Einfügen = O(n)-Operation.
- Der Tweet wird zur schnellen Suche im Search Index Service gespeichert.
- Der Objektspeicher dient zum Speichern von Medien.
- Sendet Push-Benachrichtigungen über den Benachrichtigungsdienst an Follower.
- Zum asynchronen Versenden von Warnungen wird eine Warteschlange verwendet.
Wir können eine native Redis-Liste mit der folgenden Struktur verwenden, wenn unser Memory Cache Redis ist:
Die Home-Timeline des Benutzers würde mit dem neuen Tweet aktualisiert, der im Memory Cache gespeichert würde. Wir verwenden die folgende öffentliche REST-API:
Die Benutzer-Timeline wird vom Benutzer angezeigt.
- Der Webserver empfängt eine Benutzer-Timeline-Anfrage vom Client.
- Die Anforderung wird vom Webserver an den Read-API-Server gesendet.
- Die Lese-API fragt die SQL-Datenbank nach dem Benutzerzeitrahmen ab.
Die REST-API würde ähnlich wie die Home-Timeline funktionieren, mit der Ausnahme, dass alle Tweets vom Benutzer stammen würden und nicht von den Personen, denen sie folgen.
Ein Benutzer sucht nach Schlüsselwörtern:
- Der Webserver erhält eine Suchanfrage vom Client.
- Die Anforderung wird vom Webserver an den Such-API-Server gesendet.
Schritt 4: Twitter-Timeline
Die Erstellung einer Zeitleiste ist eine schwierige Aufgabe. Es ist ein Zeitleisten-Generierungsserver erforderlich, der eine Verbindung zu den Web- oder Anwendungsservern herstellt.
Jedes Mal, wenn sich ein Benutzer anmeldet, verfolgt der Timeline-Dienst die neuesten Tweets von den Benutzern in der Follower-Tabelle und aktualisiert oder aktualisiert die Timeline des Benutzers.
Wir implementieren hier kein Ranking-System; Stattdessen gehen wir davon aus, dass die Top-5-Tweets der Follower des Benutzers in der Zeitleiste in der Reihenfolge der Erstellungszeit angezeigt werden. Wir können eine Aktualisierungsgrenze von 50 Tweets beibehalten. Wir beenden weiterhin die Aktualisierung oder Erstellung einer Zeitachse, nachdem dieser Schwellenwert erreicht ist, bis der Benutzer die Seite aktualisiert.
Hohe Latenz- und Leistungsprobleme ergeben sich aus der Live-Benutzer-Feed-Erstellung. Stattdessen ist die Erstellung eines Offline-Streams, der sofort präsentiert werden kann, die beste Möglichkeit, die Leistung zu verbessern. Führen Sie dedizierte Timeline-Server aus, die den Anwendungsserver regelmäßig anpingen, um den Feed basierend auf der Erstellungszeit zu aktualisieren.
Der Rangordnungsalgorithmus sollte entscheidende Signale berücksichtigen und gewichten, um sicherzustellen, dass die Timeline eines Benutzers nicht von Material von einem oder mehreren der Konten dominiert wird, denen er folgt.
Genauer gesagt können wir Funktionen auswählen, die sich auf die Relevanz eines beliebigen Feed-Elements beziehen, z. B. die Anzahl der Likes, Kommentare, Freigaben und die Aktualisierungszeit. Jedes dieser Kriterien sollte verwendet werden, um den Tweet zu bewerten, und dann sollte dieser Rang verwendet werden, um Tweets auf der Timeline anzuzeigen.
Sollten wir Benutzer ständig benachrichtigen, wenn neue Inhalte für ihren Newsfeed verfügbar werden? Benutzer können es als vorteilhaft empfinden, benachrichtigt zu werden, wenn neue Daten verfügbar werden. Auf Mobilgeräten jedoch, wenn die Datennutzung ziemlich kostspielig ist, kann dies Bandbreite verschwenden.
Infolgedessen können wir uns dafür entscheiden, Daten nicht auf mobile Geräte zu übertragen und stattdessen den Benutzern zu ermöglichen, für neue Postings „Zum Aktualisieren zu ziehen“.
Schritt 5: Skalieren des Designs
Ein potenzieller Engpass ist der Fanout-Dienst. Twitter-Nutzer mit Millionen von Followern müssen einige Minuten warten, bis ihre Tweets veröffentlicht werden. Dies könnte zu einem Rennen mit Antworten auf den Tweet führen, was wir vermeiden könnten, indem wir die Tweets zur Aufschlagzeit neu ordnen.
Wir könnten auch verhindern, dass Tweets von Personen mit einer großen Anzahl von Followern verbreitet werden. Stattdessen können wir eine Suche nach Tweets von Personen mit vielen Followern durchführen, die Suchergebnisse in die Ergebnisse der Home-Timeline des Benutzers integrieren und die Tweets dann zur Bereitstellungszeit neu anordnen.
Zu den weiteren Verbesserungen gehören:
- Bewahren Sie nur ein paar hundert Tweets im Memory Cache für jede Home-Timeline auf.
- Im Speicher-Cache werden nur die Home-Timeline-Informationen aktiver Benutzer gespeichert.
- Wir können die Chronologie aus der SQL-Datenbank rekonstruieren, wenn ein Benutzer in den vorangegangenen 30 Tagen nicht aktiv war.
- Um herauszufinden, wer der Benutzer ist, verwenden Sie den User Graph Service.
- Fügen Sie die Tweets dem Memory Cache hinzu, indem Sie sie aus der SQL-Datenbank abrufen.
- Der Tweet-Infodienst kann nur die Tweets eines Monats speichern.
- Im User Info Service werden nur aktive Benutzer gespeichert.
- Um die Latenz niedrig zu halten, müsste der Suchcluster höchstwahrscheinlich die Tweets im Speicher halten.
Zusammenfassung
Obwohl Twitter eine große Organisation ist, hat es eine bessere Verständnis für Systemdesign. Ich habe mein Bestes getan, um Ihnen einen allgemeinen Überblick über die Twitter-Timeline zu geben.
Ich hoffe, Sie haben nützliche Informationen daraus gewonnen und können sie gut gebrauchen.
Hinterlassen Sie uns einen Kommentar