Frage

Ich sah nur die urkomisch "The Rise and Fall von Twitter " die mich denken:

Wenn Sie twitter neu implementiert, was würden Sie anders machen?

Welche Technologien würden Sie nutzen? Welche Sprachen?

Wie stellen Sie sicher, dass der Dienst skalierbar ist?

Was würden Sie ändern?

War es hilfreich?

Lösung

ich es auf GAE umgesetzt haben würde, etwa so:

Jeder Benutzer erhält eine Tabelle haben die die Tweets der Leute enthalten, sie folgen. Diese Tabelle wird durch (Benutzer, Zeitstempel absteigend) eingegeben werden.

Jeder Benutzer hat auch eine follower_ranges Tabelle, die einen Benutzer zu einer Reihe von zusammenhängenden Folger-ID Bereichen abbildet. Für die meisten Benutzer, die diese Tabelle nur ein paar tausend Anhänger haben einen einzigen Eintrag hat (-inf .. + inf); dies wird die implizite Verzug. Für Benutzer mit mehr Anhängern wird jeder Bereich in der Tabelle ein paar tausend Nutzer. Die Bereiche werden mit der Zeit ausgeglichen werden, die Anzahl der Benutzer in jedem innerhalb eines gewissen Intervalls zu halten, z.B. größer als 1000, kleiner als 10000. Die Vereinigung aller Bereiche werden alle Benutzer-IDs enthalten.

Jedes Mal, wenn ein Benutzer -> Folgeroperation erstellt wird, wird es als eine Aktion codiert und in eine Warteschlange. Jedes Element in der Warteschlange ist ein (Absender, Aktion, Payload, Folgers subrange) Tupels. Queue Arbeiter nehmen ein Element, alle Anhänger in dem gegebenen subrange finden, und die Aktion zu jedem von ihnen gelten. (Beachten Sie, dass die Aktion sein kann „add a tweet“, „löschen einen Tweet,“ „bearbeiten Sie einen Tweet,“ usw. Im Grunde alles, was für alle Anhänger angewendet werden müssen.)

Die Anwendung der Warteschlange Aktion zu jedem Folger beinhalten wird, die entsprechende schreibt die Ausgabe und löscht zu jedem Tweet Tabelle des Benutzers. Die Barriere der Warteschlange bedeutet, dass schreibt erscheint nicht sofort, aber es sollte möglich, die Verzögerung unter ein paar Sekunden zu halten.

Es wird die Benutzer ihrer Tweets werden ein billiger Betrieb sein: "SELECT * FROM Tweets WHERE user_id =: user_id ORDER BY (created_at DESC) LIMIT: max_per_page". Dies wird eine einzelne Tabelle scannen, und ein sehr schneller Vorgang sein. (Keeping Benutzer blockierenden Latenz nach unten ist gut!)

Ich denke, das Design recht gut anfangs skalieren würde. Jede Komponente des Systems kann nun leicht skaliert werden:

  • Die Warteschlange Speicher kann durch GAE, und skaliert nach jeder Datenspeicher-Tabelle
  • gesichert werden
  • kann die Frontends natürlich skaliert werden, und es besteht keine Notwendigkeit für Klebrigkeit
  • Mehr Warteschlange Prozessoren können jederzeit hinzugefügt werden
  • Die tatsächlichen Speichertabellen werden natürlich wachsen, und sollen in Ordnung auf Datenspeicher skaliert werden.

Das heißt, kann ich mich vorstellen ein paar zukünftigen Verbesserungen, die ich in sofort aussehen:

  • Reduzieren Speicherung von selten gezeigten Daten. Dieser Entwurf denormalisiert jeden tweet in eine pro-Folger-Kopie. Jedoch nur die neuesten Tweets sind in der Regel abgerufen. Durch das Löschen der pro-Benutzer-Kopie von Tweets, nachdem sie N Tage alt sind, können wir viel Stau erholen. Wenn ein Benutzer etwas aus dem alten Geschichte zu betrachten versucht, holen wir die Daten aus denormalized Tabellen. Dies wird langsamer sein, aber nicht zu oft passieren, und die Einsparungen erheblich sein. Storage-Einsparungen: (#avg_followers - 1) / #avg_followers
  • Die Schreibmuster sind nicht optimal. Über mehrere Warteschlangenelemente wird jeder Warteschlange Arbeiter Tweets Tabelle jeden Benutzers schreiben, damit der Ort der Schreibvorgänge nicht sehr gut sein wird. (Im schlimmsten Fall werden wir #processor * #Speicher Server-Verbindungen haben.) Das durch die Anwendung mehrere Updates für jeden Bereich der Nutzer festgelegt werden kann. Wenn zum Beispiel zwei Aktionen A und B wird auf einen Bereich angewandt [0, 10000), dann einen einzelne Warteschlange Prozessor gilt diese beiden Aktionen auf einmal.

Andere Tipps

Es ist bereits getan: Laconica

  1. Es ist bereits getan Teil II - Die Rache: identi.ca (die über die Oberseite des Laconica ist)
  2. Es ist schon wurde Teil III getan - von der dunklen Seite: yammer

VBG! (-:

Ich gehe von der Prämisse aus, zurückzugehen zu starten, es wieder zu tun über: Was würde ich anders machen, wurde bei twitter ich damals

?

Nicht eine Sache.

beibehalten Twitter Fokus auf das Wesentliche:. Erbringung einer Dienstleistung, die Menschen eigentlich wollen verwenden

Ich würde gerne auf einem Produkt zu arbeiten, die in so kurzer Zeit so populär geworden, dass seine größte Bedrohung seiner eigenen Skalierbarkeit wurde. Das bedeutet, dass Sie gewonnen haben. Mit Erfolg über die Ressourcen und Aufmerksamkeit kommt auf dem Erfolg zu nutzen.

Ich würde entwirft es höllisch skalierbar nur von Anfang an.

Meine Wahl wäre die Microsoft-Plattform, C #, IIS, SQL Server, Memcached (oder Geschwindigkeit sein, wenn es endgültig ist und läuft gut, wenn ich ;-) starten

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top