it-swarm-eu.dev

Was macht eine Anwendung skalierbar?

Ich sehe in Stellenausschreibungen immer wieder, dass der Bewerber Erfahrung im Schreiben von "skalierbaren" Bewerbungen haben muss. Was macht eine Anwendung skalierbar und woher weiß ich, dass mein Code auf Millionen von Benutzern skaliert werden kann?


Ich denke, eine bessere Art, diese Frage zu formulieren, ist: Wie kann ich meinen Code unter Berücksichtigung der Skalierbarkeit schreiben? Damit der Code von Anfang an skalierbar ist und nicht erst nachträglich. Gibt es bestimmte Entwurfsmethoden? Oder geht es einfach darum, die richtigen Algorithmen für den Job auszuwählen?

38
jnevelson

Es gibt zwei Richtungen der Skalierbarkeit:

  • vertikal (a.k.a. Skalierung): schnellere CPU, mehr RAM, mehr Speicherplatz;
  • horizontal (a.k.a. Skalierung): mehr Kerne in der CPU, mehr CPUs, mehr Server;

Für den ersten müssen Sie nur darauf achten, dass Sie keine willkürlichen Einschränkungen haben. Diese entweder wegen zu kleiner ganzzahliger Größen oder wegen Strukturen mit fester/begrenzter Länge. Diese Strukturen können mit dem zugrunde liegenden Betriebssystem zusammenhängen. Wenn Sie beispielsweise versuchen, mithilfe von mehr Threads oder Prozessen zu skalieren, werden Sie irgendwann an die Grenzen des Betriebssystems stoßen. Aus diesem Grund führen Server, die für eine hohe Skalierbarkeit erstellt wurden, derzeit Parallelität basierend auf asynchronen Ereignissen durch. Dieses Problem wird im berühmten Dokument C10K beschrieben.

Der zweite ist schwieriger. Die Programmierung muss unter zwei Gesichtspunkten erfolgen: Daten werden parallel verarbeitet und Daten können physisch verteilt werden. Die Kommunikation zwischen den Knoten sollte begrenzt sein. In der Praxis bedeutet dies normalerweise, einige Teile von ACID zu opfern (es ist erwiesen, dass Sie nicht über die vollständige ACID verfügen und gleichzeitig skalieren können). Die bekannteste Lösung für die Datenspeicherung in diesem Paradigma sind NoSQL Lösungen. Sie reichen von sehr einfachen Schlüsselwertspeichern bis hin zu RDBMS-ähnlichen Systemen, denen nur die Möglichkeit zur Durchführung von Verknüpfungen entzogen ist. Die Schlüsselwertspeicher sind ultra-skalierbar, aber das ist ein Preis. Sie können grundsätzlich nur nach Primärschlüssel abfragen. Es gibt jedoch eine Lösung dafür, es ist Map Reduce . Es mag sehr suboptimal erscheinen, wenn man die kumulative Komplexität betrachtet, aber man muss bedenken, dass es massiv parallel läuft.

Wenn Sie mehr über Skalierbarkeit anhand von Beispielen aus der Praxis erfahren möchten, lesen Sie HighScalability.com Blog .

24
vartec

Die Skalierbarkeit wird anhand des Durchsatzes basierend auf einer Variablen gemessen. Zum Beispiel Anzahl der Anfragen/Sekunde mit X Benutzern. Die einfachste Art, die Skalierbarkeit zu beschreiben, ist:

Ein Maß für Wirkungsgrad mit zunehmender Last.

Das erste, was Sie beim Entwerfen für Skalierbarkeit verstehen müssen, ist, welche Messung für Ihre Anwendung am wichtigsten ist. Es gibt verschiedene Möglichkeiten, Effizienz zu messen, was eine Schlüsselkomponente der Skalierbarkeit ist:

  • Gleichzeitige Anforderungen pro Sekunde
  • Durchschnittliche Antwortzeit pro Anfrage
  • Anzahl der pro Sekunde/Minute verarbeiteten Datensätze

Es gibt mehr Effizienzmessungen, die verwendet werden können, diese sind jedoch für webbasierte Systeme oder Stapelverarbeitungssysteme üblich.

Der nächste Aspekt der Skalierbarkeit besteht darin, zu messen, was mit Ihrer Effizienz passiert, wenn die Last erhöht wird. Übliche Möglichkeiten zur Erhöhung der Last sind:

  • Mehr Benutzer treffen den Server (d. H. Mehr Webverkehr)
  • Mehr Daten in der Datenbank (d. H. Abfragen dauern länger oder die Verarbeitung dauert länger)
  • Festplattenfehler in einem RAID (Speicherleistung/-zuverlässigkeit wird beeinträchtigt)
  • Netzwerksättigung

Das Ziel einer skalierbaren Anwendung besteht darin, die Effizienz bei der Lösung des Lastproblems entweder aufrechtzuerhalten oder zu verbessern. Kurz gesagt, wenn die Antwortzeit zu lang ist, können wir einen weiteren Server hinzufügen, um die Last gleichmäßig zu verteilen? Dieser Ansatz reduziert den Arbeitsaufwand für einen Server und sorgt dafür, dass die Server aus Effizienzgründen an diesem "Sweet Spot" arbeiten.

Ihre Anwendung muss speziell skaliert werden. Das bedeutet, dass Sie mit Sitzungsdaten vorsichtig sein müssen, Anforderungen an den richtigen Server weiterleiten und Engpässe reduzieren müssen, die die Skalierbarkeit der Anwendung einschränken.

14
Berin Loritsch

Grundsätzlich möchten Sie Leistungsengpässe vermeiden, wenn Sie die Anzahl der Benutzer erhöhen und/oder einen größeren Datensatz verarbeiten und/oder Ihre Benutzeroberfläche in mehr Sprachen usw. anbieten.

Sie werfen im Grunde einen Blick auf Ihr Datenbankschema, Ihre Algorithmen und Ihren Softwareentwicklungsprozess und versuchen, zukünftige Probleme vorherzusagen. Sie möchten auch die Leistungsüberwachung einrichten, um Probleme zu identifizieren, wenn sie sich aufbauen.

Ich habe diese Tipps beim Lesen von Erstellen skalierbarer Websites (Link zu Amazon) aufgegriffen.

Hoffe das hilft!

5
louisgab

Die einzige Möglichkeit, Anwendungen wirklich skalierbar zu machen, besteht darin, keine Einschränkungen zu haben, die nicht (oder nur sehr teuer) weitergegeben werden können.

Ein typisches Beispiel ist, was passiert, wenn Ihnen die verfügbaren CPU-Zyklen ausgehen? Wenn Ihr Programm mehrstufig ist, können Sie auf einer Box mit mehreren Kernen laufen. Was passiert jedoch, wenn Sie keine größere Box mehr kaufen können? Ihre Anwendung kann einfach nicht mehr wachsen und ist daher nicht skalierbar.

Jede wirklich skalierbare Anwendung muss in der Lage sein, sich transparent auf mehrere Computer zu verteilen, ohne dass es zu merklichen Unebenheiten kommt. Dies ist nicht einfach und einer der Gründe, warum Google so erfolgreich war.

3
user1249

Es gibt einzigartige Probleme bei der Unterstützung groß angelegter Anwendungen. Die Stellenanzeige sucht nach Bewerbern, die in diesem Umfeld gearbeitet haben und solche Probleme lösen mussten.

Anwendungen auf hoher Ebene werden skalierbar gemacht, indem ständig die Frage gestellt wird, was passieren würde, wenn dieser Code in sehr kurzer Zeit tausende Male ausgeführt werden müsste. Dies bedeutet, dass Sie Ihre Speicher-Footprints verwalten, Summen und Daten zwischenspeichern, Datenquellen verwenden, die selbst skalierbar sind usw.

1
jzd

Wenn Sie eine Suchfunktion erstellt haben, die eine gute Leistung erbracht hat, wenn 100 zu durchsuchende Zeilen in der Datenbank vorhanden sind und 10 Benutzer sie gleichzeitig verwenden. Wie gut würde es funktionieren, wenn 100 Benutzer es gleichzeitig verwenden und 100.000 Zeilen nachgeschlagen werden müssen?.

Wenn es das gleiche tut, egal was passiert, dann ist es sehr gut. Wenn die Leistung proportional zur Anzahl der Benutzer/Daten ist (dh 10x mehr Daten == 10x länger zu verarbeiten), ist dies gut. Wenn die Leistung umso geringer ist, je mehr Daten vorhanden sind (10x Modusdaten == 10x ^ 10 länger zu verarbeiten), ist die Skalierung nicht gut.

Meine Beispiele sollten eigentlich in Big O-Notation gezeigt werden, aber ich weiß es derzeit nicht gut genug, um die Beispiele in Big O zu schreiben.

Sie können mehr Daten simulieren, indem Sie Dummy-Daten in Ihre Datenbank kopieren. Es gibt Tools, mit denen Sie mehr Benutzer wie Apache AB simulieren können.

1
JD Isaacks