Arquitetura
Escalabilidade
Backend
Microsserviços
Cloud

Skalierbare Softwarearchitektur – Best Practices für die Skalierung

„Aufsteigen“ ist das Zauberwort. Jeder möchte das nächste Facebook oder WhatsApp aufbauen. Aber wenn der Verkehr wirklich zunimmt, brechen die meisten Systeme zusammen.

Skalierbare Softwarearchitektur – Best Practices für die Skalierung

„Aufsteigen“ ist das Zauberwort. Jeder möchte das nächste Facebook oder WhatsApp aufbauen. Aber wenn der Verkehr wirklich zunimmt, brechen die meisten Systeme zusammen.

Bei der Entwicklung skalierbarer Software geht es nicht darum, die neuesten Tools zu verwenden; Es geht darum, ein System zu entwerfen, das wachsen kann, ohne dass es bei jedem 10-fachen Anstieg der Benutzerzahl von Grund auf neu geschrieben werden muss.

In diesem Leitfaden untersuchen wir architektonische Best Practices für Systeme, die einiges aushalten müssen.

1. Lose Kupplung

Stellen Sie sich einen Zug vor, in dem alle Waggons zusammengeschweißt sind. Wenn ein Waggon entgleist, stürzt der gesamte Zug um. Es handelt sich hierbei um ein gekoppeltes System (Rigid Monolith).

Zum Skalieren ist eine Entkopplung erforderlich.

  • Asynchrone Kommunikation: Anstatt dass „Dienst A“ „Dienst B“ aufruft und auf eine Antwort wartet (den Thread sperrt), sendet er eine Nachricht an eine Warteschlange (RabbitMQ, Kafka). „Dienst B“ verarbeitet es, wenn es möglich ist.
  • Vorteil: Wenn Dienst B ausfällt oder langsamer wird, arbeitet Dienst A weiter und stellt Nachrichten in die Warteschlange. Das System ist nicht kaskadierbar.

2. Datenbank: Der große Engpass

In 90 % der Fälle skaliert das System nicht, weil die Datenbank abgestürzt ist.

  • Sharding: Teilen Sie Ihre Daten auf mehrere Server auf. Benutzer A-M sind auf Server 1, N-Z auf Server 2. Instagram macht das.
  • CQRS (Command Query Responsibility Segregation): Trennen Sie das Lesemodell vom Schreibmodell.
    • Zum Schreiben (INSERT) verwenden Sie eine robuste relationale Datenbank (PostgreSQL).
    • Zum Lesen (SELECT) verwenden Sie eine denormalisierte und schnelle Version (Elasticsearch oder Mongo).

3. Staatenlosigkeit

Wenn Sie über 100 Server verfügen, sollte jeder von ihnen in der Lage sein, jeden Benutzer zu bedienen.

  • Regel: Speichern Sie die „Sitzung“ niemals im RAM-Speicher des Servers.
  • Lösung: Speichern Sie den Status auf dem Client (JWT-Token) oder in einer externen Cache-Bank (Redis).
  • Ergebnis: Sie können 50 Server ausschalten und 50 neue einschalten, ohne die Verbindung zu Benutzern zu trennen. Dies ermöglicht Auto-Scaling (automatische Skalierung in der Cloud).

4. Layered Cache

Die schnellste Anfrage ist die, die nicht einmal Datenbank erreicht.

  • Browser-Cache: Der Browser des Benutzers speichert Bilder und CSS.
  • CDN (Cloudflare): Speichert statische Inhalte am Rand.
  • Anwendungscache (Redis): Speichert Ergebnisse häufiger Abfragen.

Eine aggressive Caching-Strategie ist das Geheimnis von Websites wie Reddit und Twitter.

5. Anmutige Erniedrigung

Im großen Maßstab werden die Dinge kaputt gehen. Festplatten brennen, Kabel werden durchtrennt. Ihr System muss auf einen teilweisen Ausfall vorbereitet sein.

  • Netflix-Beispiel: Wenn der Dienst „Personalisierte Empfehlungen“ ausfällt, wird Netflix nicht ausfallen. Es zeigt eine statische Liste der „Beliebten Filme“. Der Benutzer merkt nicht einmal, dass im Backend ein kritischer Fehler aufgetreten ist.

Fazit

Skalierbarkeit ist kein „Knopf“, den Sie drücken. Es ist eine Designdisziplin. Es erfordert, vom ersten Tag an über Warteschlangen, Caches, Fehler und Partitionierung nachzudenken. Wenn Sie Ihre Software unter der Annahme erstellen, dass sie kaputt geht, wird sie wahrscheinlich viel besser skalieren, als wenn Sie davon ausgehen, dass alles perfekt funktioniert.

Lesen Sie auch