Marcus Chen, YuSMP Group
Marcus Chen Staff Engineer, Backend & Cloud, YuSMP Group · Multi-Tenant-SaaS, AWS/GCP, verteilte Systeme und Datenbanksharding

Horizontale vs. vertikale Skalierung: die grundlegende Entscheidung

Jedes Produktionsteam steht irgendwann vor dem Moment, in dem ein einzelner Server nicht mehr ausreicht. Die instinktive Reaktion ist oft, einen leistungsfähigeren Rechner zu kaufen — mehr Kerne, mehr RAM, schnellere SSDs. Das ist vertikale Skalierung (Scale-up), und sie ist ein vollkommen legitimer erster Schritt. Ein größerer Server erfordert keine Anwendungsänderungen, keine Infrastrukturkomplexität und kein Überdenken der Datenschicht. Für frühe Produkte trägt vertikale Skalierung Sie erstaunlich weit: Ein moderner 32-Kern-Server mit 128 GB RAM kann problemlos Zehntausende gleichzeitiger Nutzer bei einer gut optimierten monolithischen Webanwendung bedienen.

Das Problem ist die Obergrenze. Sobald Sie auf die größte verfügbare Instanz skaliert haben, gibt es keinen weiteren Spielraum — und zu diesem Zeitpunkt lassen Sie Ihre gesamte Produktionslast auf einem einzelnen Ausfallpunkt laufen. Ein Hardware-Defekt, ein Kernel-Panic oder ein Availability-Zone-Ausfall legt alles gleichzeitig lahm. Deshalb behandelt cloud-native Architektur vertikale Skalierung als vorübergehende Entlastung, nicht als Strategie.

Horizontale Skalierung (Scale-out) bedeutet, die Last auf mehrere identische Server-Instanzen zu verteilen. Sie hat keine theoretische Obergrenze: Sie fügen Instanzen hinzu, wenn die Last steigt, und entfernen sie, wenn der Traffic nachlässt. Diese Elastizität ist die Grundlage moderner Web-App-Skalierbarkeit. Horizontale Skalierung hat jedoch eine strenge Voraussetzung: Ihre Anwendung muss so gestaltet sein, dass sie gleichzeitig auf vielen Servern läuft, ohne den Zustand zu kennen, den ihre Geschwister halten. Dies führt uns zur architektonisch folgenreichsten Entscheidung bei der Skalierungsarbeit.

DimensionVertikale SkalierungHorizontale Skalierung
ObergrenzeHart (größte verfügbare Instanz)In der Praxis keine
Anwendungsänderungen erforderlichKeineStatelessness, gemeinsame Datenschicht
FehlertoleranzSingle Point of FailureRedundant — Instanzen fallen unabhängig aus
Kosteneffizienz im MaßstabGering — große Instanzen kosten vielHoch — Commodity-Instanzen, nur genutzte Kapazität
Deployment-KomplexitätGeringMittel (Load Balancer, Service Discovery)
UmsetzungszeitMinuten (Instanz-Resize)Tage bis Wochen (Architektur-Refactoring)

In der Praxis kombinieren die meisten Teams beides: Vertikale Skalierung kauft Zeit, während die horizontale Skalierung entwickelt wird. Der kritische Fehler besteht darin, vertikale Skalierung als dauerhafte Lösung zu behandeln. Ändern Sie die Instanzgröße, wenn Sie Luft brauchen; beginnen Sie gleichzeitig mit dem Stateless-Refactoring, damit Sie es nicht unter Produktionsdruck durchführen müssen.

Die Entscheidung zwischen horizontaler und vertikaler Skalierung gilt unabhängig davon, ob Sie einen Monolithen oder Microservices betreiben. Wie wir in unserem Leitfaden zur Monolith-vs-Microservices-Architektur erläutern, skaliert ein gut strukturierter Monolith horizontal genauso effektiv wie ein Service-Mesh — der Schlüssel ist Statelessness, nicht die Deployment-Topologie.

Stateless-Anwendungsdesign

Statelessness ist das wichtigste Designprinzip für horizontal skalierbare Webanwendungen. Eine Stateless-Anwendungsinstanz speichert zwischen Anfragen keine benutzerbezogenen, sitzungsbezogenen oder anfragebezogenen Daten im Speicher. Jede eingehende HTTP-Anfrage trägt den gesamten Kontext, der für ihre Verarbeitung benötigt wird — typischerweise über ein JWT oder Session-Token — und kann ohne Seiteneffekte an eine beliebige verfügbare Instanz weitergeleitet werden.

Im Gegensatz dazu steht eine Stateful-Anwendung, die Sitzungsdaten im Speicher eines bestimmten Servers hält. Sobald ein Nutzer sich anmeldet und seine Sitzung auf Server A liegt, muss jede folgende Anfrage an Server A weitergeleitet werden — ein Muster namens Sticky Sessions. Sticky Sessions begrenzen Ihre Skalierungsoptionen grundlegend: Sie können keine Instanz hinzufügen, ohne dass einige Nutzer ihre Sitzung nicht mehr erreichen können, und Sie können keine Instanz entfernen, ohne aktive Sitzungen zu beenden.

Der Weg zur Statelessness besteht darin, alle veränderbaren Zustände aus dem Anwendungsspeicher in gemeinsam genutzte externe Speicher zu verschieben:

  • Sitzungsdaten. Ersetzen Sie In-Memory-Sitzungsobjekte durch signierte JWTs oder einen verteilten Sitzungsspeicher wie Redis. JWTs sind eigenständig und benötigen keinen serverseitigen Speicher; Redis-Sitzungen sind zentralisiert und können serverseitig invalidiert werden — beide Muster erlauben es jeder Instanz, jede Anfrage zu verarbeiten.
  • Nutzer-Uploads und generierte Dateien. Schreiben Sie niemals Dateien auf die lokale Festplatte eines Anwendungsservers. Speichern Sie sie in Object Storage (AWS S3, Google Cloud Storage, Azure Blob) und referenzieren Sie sie per URL.
  • Anwendungsseitige Caches. In-Process-Caches (lokale HashMap, LRU-Cache) erzeugen divergenten Zustand über Instanzen hinweg. Heben Sie sie in einen gemeinsamen verteilten Cache (Redis, Memcached) an, damit alle Instanzen eine konsistente Sicht auf gecachte Daten haben.
  • WebSocket- und Echtzeit-Zustand. WebSocket-Verbindungen sind von Natur aus Stateful. Verwenden Sie eine Pub/Sub-Schicht (Redis Pub/Sub, socket.io Adapter, Ably), um Ereignisse über alle Instanzen zu verbreiten.

Load-Balancing-Strategien

Ein Load Balancer ist der Einstiegspunkt zu einem horizontal skalierten Cluster. Er nimmt eingehende Verbindungen entgegen und leitet sie gemäß einem gewählten Algorithmus an verfügbare Backend-Instanzen weiter. Die Wahl des Algorithmus, die Konfiguration von Health-Checks und die Connection-Draining-Policy beeinflussen sowohl die Leistung als auch die Zuverlässigkeit unter realen Lastmustern erheblich.

Die am häufigsten verwendeten Algorithmen in produktiven Webanwendungen:

  • Round Robin. Anfragen werden sequenziell über Instanzen verteilt. Statistisch gleiche Verteilung in der Theorie; in der Praxis können langsame Anfragen bei ungleichmäßigen Job-Dauern zu Ungleichgewicht führen. Funktioniert gut, wenn die Anfrageverarbeitungszeit annähernd gleichmäßig ist.
  • Least Connections. Jede neue Anfrage geht an die Instanz mit den wenigsten aktiven Verbindungen in diesem Moment. Deutlich besser als Round Robin, wenn die Anfragedauer stark variiert.
  • Gewichtetes Routing. Instanzen erhalten Gewichte basierend auf ihrer Kapazität. Nützlich bei Mixed-Instance-Deployments oder während Canary-Releases.
  • IP-Hash / Sticky Routing. Dieselbe Client-IP erreicht immer dieselbe Instanz. Nützlich für Stateful-Backends — als langfristige Strategie jedoch zu vermeiden.

Connection Draining ist ebenfalls wichtig: Wenn eine Instanz aus dem Load-Balancer-Pool entfernt wird (bei einem Deploy oder Scale-down), sollte der Load Balancer warten, bis In-Flight-Anfragen abgeschlossen sind — typischerweise 30–60 Sekunden. Ohne Draining erzeugen Ihre Deployments kurze Bursts von 502/503-Fehlern.

Caching-Schichten: vom In-Process bis zum CDN

Caching ist der hebelmäßig wirksamste Performance-Eingriff, der einem Web-Backend-Ingenieur zur Verfügung steht. Ein einzelner Cache-Hit vermeidet eine Datenbankabfrage, die 5–50 ms dauern könnte; im Maßstab ist die kumulative Einsparung enorm.

Betrachten Sie Caching als einen Stapel von Schichten, jede progressiv schneller und progressiv weniger dauerhaft:

  • CDN-Edge-Caching. Vollständig statische Assets (Bilder, JS-Bundles, CSS, Schriften) sollten am CDN-Edge gecacht und vom nächstgelegenen Point of Presence ausgeliefert werden. Ein gut konfiguriertes CDN absorbiert 60–95 % aller HTTP-Anfragen, bevor sie Ihren Origin erreichen.
  • Reverse Proxy / Gateway-Caching. Eine NGINX- oder Kong-Gateway-Schicht kann API-Antworten für kurze TTLs (1–60 s) cachen, wenn der Endpunkt sicher zu cachen ist.
  • Verteilter In-Memory-Cache (Redis / Memcached). Geteilt über alle Anwendungsinstanzen, verwendet für berechnete Aggregate, Datenbankabfrage-Ergebnisse, Drittanbieter-API-Antworten und Session-Tokens. Redis ist 2026 der Industriestandard — es unterstützt reichhaltigere Datenstrukturen als Memcached, enthält TTL-basiertes Ablaufen, Pub/Sub für Echtzeit-Ereignisse und optionale Persistenz.
  • Anwendungsseitiger In-Process-Cache. Ein kleiner In-Process-LRU-Cache für wirklich häufig genutzte, selten ändernde Daten — z. B. eine Lookup-Tabelle mit 200 Ländercodes, die beim Start geladen wird.
Mehrere Server in einem Rechenzentrum repräsentieren die horizontale Skalierung einer Webanwendung
Eine horizontal skalierte Web-Schicht mit einem Load Balancer, der den Traffic über mehrere Stateless-Instanzen verteilt. Jede Instanz liest aus einem gemeinsamen Redis-Cache und einer replizierten Datenbank, ohne instanzspezifischen Sitzungszustand.

Die Cache-Hit-Rate ist die zentrale Kennzahl. Für einen verteilten Cache streben Sie eine Hit-Rate von über 80 % bei Ihren meistgenutzten Endpunkten an. Unter 70 % deutet darauf hin, dass Ihre TTLs zu kurz sind, Ihre Cache-Schlüssel zu granular sind oder Ihr Datensatz echte lesedominante Hot Spots hat, die ein anderes Zugriffsmuster benötigen.

Async-Verarbeitung und Message Queues

HTTP ist ein synchrones Protokoll: Der Client wartet, während der Server die Anfrage verarbeitet. Für die meisten Nutzerinteraktionen ist das angemessen. Viele Backend-Operationen müssen jedoch nicht synchron abgeschlossen werden: E-Mails senden, hochgeladene Bilder verkleinern, PDF-Berichte generieren, einen neuen Datensatz in einer Suchmaschine indizieren oder einen langsamen Drittanbieter-Webhook aufrufen.

Das Muster ist unkompliziert: Ihr Webserver empfängt die Anfrage, speichert den minimal erforderlichen Zustand (einen Job-Datensatz in der Datenbank oder eine Nachricht in einer Queue), gibt sofort HTTP 202 Accepted zurück, und ein separater Worker-Prozess erledigt die schwere Arbeit asynchron.

Die meistgenutzten Queue-Optionen in produktiven Webanwendungen 2026:

  • Amazon SQS. Vollständig verwaltet, kein Betriebsaufwand, skaliert automatisch auf jeden Durchsatz. Der AWS-native Standard für Teams auf AWS-Infrastruktur.
  • RabbitMQ. Ausgereift, selbst gehostet oder verwaltet (CloudAMQP). Unterstützt ausgefeilte Routing-Topologien (Exchanges, Bindings, Dead-Letter-Queues). Bevorzugt bei Bedarf an feingranulares Message-Routing oder Prioritäts-Queues.
  • Apache Kafka. Log-basiert, Hochdurchsatz, für Event-Streaming bei Millionen Nachrichten pro Sekunde konzipiert. Die richtige Wahl für Event Sourcing, Analyse-Pipelines und Echtzeit-Datenverarbeitung.
  • Redis Streams / Bull Queue. Für Teams, die bereits Redis betreiben, bieten Bull (Node.js) oder RQ (Python) einfache Job-Queues mit minimalem Infrastruktur-Overhead.

Datenbankskalierung: Read Replicas und Sharding

Die Datenbank ist fast immer der erste Engpass in einer wachsenden Webanwendung. Anwendungsserver sind Stateless und skalieren horizontal mit minimaler Reibung; Datenbanken tragen Zustand und sind erheblich schwieriger zu skalieren. Glücklicherweise haben die meisten produktiven Webanwendungen deutlich mehr Lesezugriffe als Schreibzugriffe — ein Verhältnis von 80:20 oder 90:10 ist üblich — was bedeutet, dass Leseskalierung typischerweise das richtige Problem ist, das zuerst gelöst werden muss.

Read Replicas sind der übliche erste Schritt. Die meisten verwalteten Datenbankdienste (AWS RDS, Google Cloud SQL, PlanetScale) unterstützen eine oder mehrere Read Replicas: synchronisierte Kopien Ihrer primären Datenbank, die nur Leseanfragen akzeptieren. Ihre Anwendung leitet alle SELECT-Abfragen an Replicas und sendet alle Schreibvorgänge (INSERT, UPDATE, DELETE) an den Primary. Eine einzelne gut ausgestattete Read Replica kann 70–90 % Ihrer Abfragelast absorbieren.

Netzwerkdiagramm einer verteilten Web-App-Architektur mit Load Balancern und mehreren Datenbankknoten
Eine verteilte Webanwendungsarchitektur mit load-balancierten Stateless-Webservern, einer gemeinsamen Cache-Schicht, einer primären Datenbank mit Read Replicas und einer asynchronen Worker-Schicht, die eine Message Queue leert.

Datenbanksharding ist der nächste Schritt, wenn Schreibdurchsatz oder Datenmenge die Kapazität eines einzelnen Primary übersteigt. Sharding teilt Ihre Daten horizontal über mehrere Datenbankknoten (Shards) anhand eines Shard-Schlüssels auf. Sharding führt jedoch erhebliche Betriebs- und Abfragekomplexität ein: Cross-Shard-Abfragen erfordern Scatter-Gather-Fan-out oder de-normalisierte Datenredundanz. Die meisten Teams setzen zuerst auf Anwendungsseitiges Partitioning oder verwaltete verteilte Datenbanken (CockroachDB, Vitess, PlanetScale), bevor sie manuell eine Sharding-Schicht entwickeln.

TechnikLöstKomplexitätWann einsetzen
Query-OptimierungLangsame einzelne AbfragenGeringImmer zuerst
Connection PoolingVerbindungserschöpfungGeringBei Verbindungen > 100
Read ReplicasLesedurchsatzGering-MittelLese:Schreib-Verhältnis > 5:1
TabellenpartitionierungTabellengröße / Abfrage-PerformanceMittelTabellen > 50 Mio. Zeilen
ShardingSchreibdurchsatz / GesamtdatengrößeHochWenn Replicas nicht ausreichen
Verwaltete Distributed DBAlle oben genanntenMittel (Betrieb ausgelagert)Greenfield oder Migrationsbudget verfügbar

Autoscaling und Kapazitätsplanung

Autoscaling ist der Mechanismus, durch den Ihre Infrastruktur die Rechenkapazität automatisch als Reaktion auf die beobachtete Nachfrage anpasst — Instanzen bei Traffic-Spitzen hinzufügt und sie entfernt, wenn die Last nachlässt. In Cloud-Umgebungen (AWS Auto Scaling Groups, Google Cloud Managed Instance Groups, Kubernetes Horizontal Pod Autoscaler) ist Autoscaling der Standardansatz zur Aufrechterhaltung der Verfügbarkeit ohne Überprovisionierung.

Effektives Autoscaling erfordert drei Dinge: aussagekräftige Skalierungssignale, korrekt abgestimmte Schwellenwerte und Anwendungsinstanzen, die innerhalb des Reaktionsfensters des Autoscalers sauber starten und herunterfahren können.

Skalierungssignale. Das Standard-Signal für die meisten Autoscaler ist die CPU-Auslastung — Instanzen hinzufügen, wenn die durchschnittliche CPU einen Schwellenwert überschreitet (typischerweise 60–70 %), entfernen, wenn sie unter einen unteren Schwellenwert fällt (typischerweise 30–40 %). CPU ist ein vernünftiger Proxy für rechengebundene Workloads, aber irreführend für I/O-gebundene Apps. Für Web-APIs sind Anfrage-Latenz (p95 API-Antwortzeit) oder die Anzahl aktiver Verbindungen oft genauere Signale.

Kapazitätsplanung. Autoscaling eliminiert nicht die Notwendigkeit der Kapazitätsplanung — es verändert ihre Natur. Sie müssen kein Überbereitstellen für anhaltende Spitzenlast mehr, aber Sie müssen minimale und maximale Instanzzahlen angeben, die Ihren Verfügbarkeitsanforderungen und Ihrem Kostenbudget entsprechen. Ein Minimum von 2 Instanzen (eine pro Availability Zone) gewährleistet Redundanz; ein Maximum, das Ihre geschätzte Spitzenlast plus einen 30%-Puffer abdeckt, verhindert unkontrolliertes Skalieren.

SLOs und Graceful Degradation

Skalierbarkeit bedeutet nicht nur, mehr Last zu bewältigen — es bedeutet, akzeptable Performance aufrechtzuerhalten, wenn die Last steigt, und bei Komponentenausfällen geordnet zu degradieren. Service Level Objectives (SLOs) sind die formellen Verpflichtungen, die "akzeptabel" für Ihr System definieren.

Standardmäßige SLO-Ziele für produktive Webanwendungen:

  • Verfügbarkeit: 99,9 % (Drei Neunen) erlauben 8,7 Stunden Ausfallzeit pro Jahr. Dies ist die Mindesterwartung für jedes kommerzielle SaaS. 99,95 % (4,4 Std./Jahr) ist mit Multi-AZ-Deployment und automatischem Failover erreichbar.
  • API-Latenz: p50 < 150 ms, p95 < 500 ms, p99 < 1.000 ms für synchrone HTTP-APIs.
  • Fehlerrate: Weniger als 0,1 % aller Anfragen sollten im Normalbetrieb 5xx-Fehler zurückgeben.
  • Durchsatz: Definieren Sie Ihren erwarteten Peak-RPS und gestalten Sie Ihre Infrastruktur so, dass sie ihn bei den SLO-Latenzzielen mit 30–50 % Puffer aufrechterhalten kann.

Graceful Degradation ist das Designprinzip, das sicherstellt, dass Ihre Anwendung bei Überlast vorhersehbar degradiert statt vollständig ausfällt:

  • Circuit Breakers. Wenn Aufrufe an einen externen Dienst wiederholt fehlschlagen, öffnen Sie den Circuit — kurzschließen Sie nachfolgende Aufrufe mit einer gecachten Fallback-Antwort oder einer "Dienst vorübergehend nicht verfügbar"-Meldung.
  • Load Shedding. Wenn Request-Queues einen Schwellenwert überschreiten, lehnen Sie aktiv niederpriore Anfragen mit HTTP 429 ab, anstatt sie in eine Queue aufzunehmen, die sich nie leert.
  • Feature Flags für nicht-kritische Pfade. Nicht wesentliche Features können während eines Hochlast-Incidents auf Feature-Flag-Ebene deaktiviert werden.
  • Veraltete Daten statt keine Daten. Bei einem Cache-Miss und einer langsamen oder nicht verfügbaren Datenbank ist das Ausliefern einer leicht veralteten gecachten Antwort oft vorzuziehen gegenüber einem Fehler.

Die Web Application Development Services, die wir bei YuSMP Group anbieten, umfassen Architektur-Review und Skalierbarkeitsplanung als Teil jedes Engagements. Für Teams, die zwischen Architekturansätzen wählen, behandelt unser Begleitartikel über Monolith vs. Microservices, wie Dekompositionsentscheidungen mit der Skalierungsstrategie interagieren.

FAQ

Was ist der Unterschied zwischen horizontaler und vertikaler Skalierung?

Vertikale Skalierung (Scale-up) bedeutet das Hinzufügen von mehr CPU, RAM oder Speicher zu einem einzelnen Server. Sie ist schnell umzusetzen, hat aber eine harte Obergrenze und erzeugt einen Single Point of Failure. Horizontale Skalierung (Scale-out) bedeutet das Hinzufügen weiterer Server-Instanzen und die Verteilung der Last auf diese. Sie hat keine theoretische Obergrenze, eliminiert Single Points of Failure und ist die Grundlage cloud-nativer Web-App-Architektur.

Warum ist Statelessness für die Skalierbarkeit von Web-Apps wichtig?

Eine Stateless-Anwendung speichert keine sitzungsbezogenen Daten im Speicher einer einzelnen Server-Instanz. Jede Instanz kann jede eingehende Anfrage ohne Koordination verarbeiten. Das ermöglicht das sofortige Hinzufügen oder Entfernen von Instanzen — Voraussetzung für Autoscaling und Zero-Downtime-Deployments.

Wann sollte ich meiner Web-App eine Caching-Schicht hinzufügen?

Fügen Sie Caching hinzu, wenn der Lesebetrieb dominiert — in der Regel wenn die Datenbankauslastung 60 % überschreitet oder wenn dieselben Daten deutlich häufiger gelesen als geändert werden. Ein gut abgestimmter Redis-Cache kann 80–95 % der Leselast absorbieren und den Datenbankdruck proportional reduzieren.

Was ist Datenbanksharding und wann ist es notwendig?

Sharding teilt eine Datenbanktabelle horizontal auf mehrere Server (Shards) anhand eines Shard-Schlüssels auf. Es ist notwendig, wenn der Datensatz die Kapazität eines einzelnen Datenbankservers übersteigt oder wenn der Schreibdurchsatz die Leistung eines einzelnen Primary überfordert. Die meisten Teams setzen zuerst auf Read Replicas und führen Sharding erst bei erheblichem Wachstum ein.

Wie verbessern Message Queues die Skalierbarkeit von Web-Apps?

Message Queues (RabbitMQ, SQS, Kafka) entkoppeln langsame oder ressourcenintensive Aufgaben vom HTTP-Request-Zyklus. Anstatt den Nutzer warten zu lassen, wird die Aufgabe in eine Queue eingereiht und sofort HTTP 202 zurückgegeben. Worker-Prozesse leeren die Queue unabhängig und können separat von der Web-Schicht skaliert werden.

Welche SLOs sollte eine skalierbare Web-App anstreben?

Branchenübliche Ziele für produktive SaaS-Systeme: 99,9 % Verfügbarkeit (8,7 Std./Jahr Ausfallbudget), p50 API-Latenz unter 150 ms, p95 unter 500 ms, p99 unter 1.000 ms. Die Fehlerrate sollte unter 0,1 % aller Anfragen bleiben. Für verbraucherorientierte Apps p95 auf unter 300 ms straffen und Core Web Vitals (LCP unter 2,5 s, INP unter 200 ms) verfolgen.

Veröffentlicht 13. Juni 2026. Technische Empfehlungen basieren auf Produktionsmustern aus YuSMP Group Kundenprojekten 2023–2026 und aktueller Cloud-Provider-Dokumentation.