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 Möglichkeit, diese Frage zu formulieren, ist: Wie kann ich meinen Code skalierbar schreiben? im Sinn? 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?

Antwort

Es gibt zwei Richtungen der Skalierbarkeit:

  • vertikal (auch bekannt als Skalierung): schnellere CPU, mehr RAM, mehr Speicherplatz;
  • horizontal (auch bekannt als Skalierung): 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. Diese entweder aufgrund zu kleiner ganzzahliger Größen oder 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, werden Sie irgendwann die Grenzen des Betriebssystems erreichen. 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 C10K beschrieben Dokument .

Das zweite ist schwieriger. Es erfordert zwei Programmierungen: Daten werden parallel verarbeitet, und Daten können physisch verteilt sein. 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 vollständige ACID verfügen und gleichzeitig skalieren können). Die bekannteste Lösung für Daten Speicher in diesem Paradigma sind NoSQL -Lösungen. Sie reichen von sehr einfachen Schlüsselwertspeichern bis zu Systemen, die RDBMS-ähnlich sind und nur keine Joins ausführen können div id = „73fab16cf2“>

Schlüsselwertspeicher sind ultra-skalierbar, aber das ist ein Preis. Sie können grundsätzlich nur den Primärschlüssel abfragen. Es gibt jedoch eine Lösung für das, es ist map redu . Es mag sehr suboptimal erscheinen, wenn Sie die kumulative Komplexität betrachten, aber Sie müssen bedenken, dass es massiv parallel läuft.

Wenn Sie mehr über Skalierbarkeit anhand von Beispielen aus der Praxis lesen möchten Schauen Sie sich das Blog HighScalability.com an.

Kommentare

  • +1 für die Erwähnung von Scale-Out. Das Hinzufügen weiterer Ressourcen ist für Entscheidungsträger sehr schnell und attraktiv (kaufen Sie einige Hex-Kerne und verdoppeln Sie den Speicher! ). Aber wenn die Anwendung ‚ keinen Druck auf sie ausüben kann, haben Sie ein größeres Problem.

Antwort

Die Skalierbarkeit wird anhand des Durchsatzes basierend auf einer Variablen gemessen. Beispielsweise die Anzahl der Anforderungen pro Sekunde bei X Benutzern. Die einfachste Methode zur Beschreibung der Skalierbarkeit ist:

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

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

Es können mehr Effizienzmessungen verwendet werden, 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 auf den Server (dh mehr Webdatenverkehr)
  • 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 für eine skalierbare Anwendung ist um die Effizienz entweder aufrechtzuerhalten oder zu verbessern, während wir uns mit dem Lastproblem befassen. 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 auf die Skalierung ausgelegt sein. Das bedeutet, dass Sie Sie müssen mit Sitzungsdaten vorsichtig sein, Anforderungen an den richtigen Server weiterleiten und Engpässe reduzieren, die die Skalierbarkeit der Anwendung einschränken.

Antwort

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 bieten Sie Ihre Benutzeroberfläche in mehr Sprachen usw. an.

Sie sehen sich im Grunde 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 aufgebaut werden.

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

Hoffe, das hilft!

Antwort

Nur so können Anwendungen kann wirklich skalierbar sein, besteht darin, dass es keine Einschränkungen gibt, 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 auf transparente Weise auf mehrere Computer zu verteilen, und dies ohne erkennbare Probleme. Dies ist nicht einfach und einer der Gründe, warum Google so erfolgreich war.

Antwort

Es gibt einzigartige Probleme das kommt mit der Unterstützung von großskalierten Anwendungen. Die Stellenanzeige sucht nach Bewerbern, 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 sehr kurzer Zeit tausende Male ausgeführt werden müsste. Dies bedeutet, dass Sie Ihre Speicher-Footprints verwalten Verwenden Sie das Caching von Summen und Daten, verwenden Sie Datenquellen, die selbst skalierbar sind usw.

Antwort

Wenn Sie es wären Erstellen einer Suchfunktion, die eine gute Leistung erbringt, wenn 100 Zeilen in der Datenbank durchsucht werden müssen und 10 Benutzer sie gleichzeitig verwenden. Wie gut würde sie funktionieren, wenn 100 Benutzer sie gleichzeitig verwenden und 100.000 Zeilen nachgeschlagen werden müssen.

Wenn es die gleiche Leistung erbringt, egal was passiert, ist es sehr gut. Wenn es proportional zur Anzahl der Benutzer / Daten ist (dh 10x mehr Daten == 10x länger zu verarbeiten), ist das gut. Wenn es viel leistet Je mehr Daten es hat (10x Modusdaten == 10x ^ 10 länger zu verarbeiten), desto niedriger skaliert es nicht.

Meine Beispiele sollten wirklich in Big O-Notation gezeigt werden, aber ich cu Derzeit wissen Sie es 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, und es gibt Tools, mit denen Sie mehr Benutzer wie Apache AB simulieren können.

Schreibe einen Kommentar

Deine E-Mail-Adresse wird nicht veröffentlicht. Erforderliche Felder sind mit * markiert.