Was macht eine Anwendung skalierbar?

37

In Stellenausschreibungen sehe ich immer wieder, dass der Bewerber Erfahrung mit dem 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 Möglichkeit, diese Frage zu formulieren, ist: Wie kann ich meinen Code mit Blick auf die Skalierbarkeit schreiben? Damit der Code von Anfang an skalierbar ist, im Gegensatz zu einem nachträglichen Gedanken. Gibt es bestimmte Entwurfsmethoden? Oder geht es einfach darum, die richtigen Algorithmen für den Job auszuwählen?

jnevelson
quelle

Antworten:

24

Es gibt zwei Richtungen der Skalierbarkeit:

  • vertikal (auch bekannt als Scaling Up): schnellere CPU, mehr RAM, mehr Festplattenspeicher;
  • horizontal (auch bekannt als Scaling-Out): mehr Kerne in der CPU, mehr CPUs, mehr Server;

Beim ersten müssen Sie nur darauf achten, dass Sie keine willkürlichen Einschränkungen haben. Dies 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, mit mehr Threads oder Prozessen zu skalieren, stoßen Sie irgendwann an die Grenzen des Betriebssystems. Das ist der Grund, warum Server, die für eine hohe Skalierbarkeit entwickelt wurden, derzeit auf asynchronen Ereignissen basieren. Dieses Problem ist im bekannten C10K- Dokument beschrieben .

Der zweite ist schwieriger. Die Programmierung muss unter zwei Gesichtspunkten erfolgen: Die Daten werden parallel verarbeitet und können physisch verteilt werden. Die Kommunikation zwischen den Knoten sollte begrenzt sein. In der Praxis bedeutet dies in der Regel, dass einige Teile von ACID geopfert werden (es ist erwiesen, dass Sie nicht über die volle 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, bei denen die Join-Fähigkeit nur eingeschränkt ist. Die Key-Value-Stores 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 eine Kartenreduzierung. Es mag unter dem Gesichtspunkt der kumulativen Komplexität sehr suboptimal erscheinen, aber Sie müssen bedenken, dass es massiv parallel läuft.

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

vartec
quelle
+1 für die Erwähnung der Skalierung. Das Hinzufügen weiterer Ressourcen ist für Entscheidungsträger sehr schnell und attraktiv (kaufen Sie einige Hex-Cores und verdoppeln Sie den Speicher!). Aber wenn die Anwendung keinen Druck auf sie ausüben kann, haben Sie ein größeres Problem.
JQA
14

Die Skalierbarkeit wird in Bezug auf den Durchsatz basierend auf einer Variablen gemessen. Zum Beispiel die Anzahl der Anfragen pro Sekunde bei X Benutzern. Der einfachste Weg, die Skalierbarkeit zu beschreiben, ist:

Ein Maß für die Effizienz bei steigender 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, die Effizienz zu messen, die eine Schlüsselkomponente der Skalierbarkeit darstellt:

  • Gleichzeitige Anfragen 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 zunimmt. Übliche Möglichkeiten zur Erhöhung der Last sind:

  • Mehr Benutzer treffen den Server (dh mehr Web-Verkehr)
  • Mehr Daten in der Datenbank (dh 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 ist es, 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 hält die Server aus Gründen der Effizienz an diesem "Sweet Spot" in Betrieb.

Ihre Anwendung muss speziell für die Skalierung entwickelt 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.

Berin Loritsch
quelle
5

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 sehen sich im Grunde genommen Ihr Datenbankschema, Ihre Algorithmen und Ihren Softwareentwicklungsprozess an und versuchen, zukünftige Probleme vorherzusagen. Sie möchten auch die Leistungsüberwachung einrichten, um Probleme zu identifizieren, wenn sie auftreten.

Diese Tipps habe ich beim Lesen von Building Scalable Web Sites (Link zu amazon) aufgegriffen .

Hoffe das hilft!

louisgab
quelle
3

Die einzige Möglichkeit, Anwendungen wirklich zu skalieren, 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 mehrere Kerne umfasst, können Sie es auf einer Box mit mehreren Kernen ausführen. 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 auf transparente Weise auf mehrere Computer zu verteilen, und dies ohne spürbare Beeinträchtigungen. Dies ist nicht einfach und einer der Gründe, warum Google so erfolgreich war.


quelle
1

Es gibt einzigartige Probleme bei der Unterstützung von Anwendungen mit großem Maßstab. Die Stellenanzeige sucht Bewerber, die in diesem Umfeld gearbeitet haben und solche Probleme lösen mussten.

Von einer High-Level-Anwendung aus werden Anwendungen skalierbar gemacht, indem ständig die Frage gestellt wird, was passieren würde, wenn dieser Code in einem sehr kurzen Zeitraum Tausende Male ausgeführt werden soll. Dies bedeutet, dass Sie Ihren Speicherbedarf verwalten, Summen und Daten zwischenspeichern und Datenquellen verwenden, die selbst skalierbar sind, usw.

jzd
quelle
1

Wenn Sie eine Suchfunktion erstellt haben, die bei 100 zu durchsuchenden Zeilen in der Datenbank und 10 gleichzeitig verwendeten Benutzern eine gute Leistung erbracht hat. Wie gut würde es funktionieren, wenn 100 Benutzer es gleichzeitig verwenden und 100.000 Zeilen nachschlagen müssten?

Wenn es das Gleiche tut, egal was passiert, dann ist es sehr gut. Es ist gut, wenn die Leistung proportional zur Anzahl der Benutzer / Daten ist (was bedeutet, dass 10x mehr Daten == 10x länger verarbeitet werden müssen). 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 kenne sie 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. Außerdem gibt es Tools, mit denen Sie mehr Benutzer wie Apache AB simulieren können.

JD Isaacks
quelle