Multi-Server-Architektur: Trennung der Zuständigkeiten
Dieser Artikel erklärt, wie unsere Infrastruktur spezialisierte Server nutzt, um Skalierbarkeit, Zuverlässigkeit und Leistung durch Trennung der Zuständigkeiten zu erreichen.
Das Problem: Einschränkungen monolithischer Server
Wenn alles auf einem Server läuft, führt das zu:
-
Ressourcenkonkurrenz: Webserver konkurriert mit Suchdienst um CPU/Arbeitsspeicher
-
Skalierungsschwierigkeiten: Komponenten können nicht unabhängig skaliert werden
-
Single Point of Failure: Ein Server fällt aus = gesamtes System fällt aus
-
Kostenineffizienz: Instanztypen können nicht pro Workload optimiert werden
-
Deployment-Risiko: Bereitstellung einer Komponente betrifft alle anderen
Wir brauchen eine Trennung der Zuständigkeiten über mehrere Server hinweg.
Die Lösung: Spezialisierte Server-Rollen
Wir betreiben spezialisierte Server, die jeweils für ihre Workload optimiert sind:
graph TB
subgraph prod[Production ERP Server]
erp[Internal Management
HR, Finance, Manufacturing
24/7 uptime
Shared storage & email]
end
subgraph web[Public Website Server]
www[Public Website
Product catalog, blog
24/7 uptime
Behind CDN]
end
subgraph dev[Development/Staging Server]
devenv[Dev & Staging
Email campaigns
Powers off nights/weekends]
end
subgraph search[Search Service Server]
searchsvc[Vector Search
Filter extraction
Related searches
24/7 uptime]
end
subgraph cache[Cache Server - Valkey]
valkey[RediSearch indexes
Query embeddings
Autocomplete
24/7 uptime]
end
www --> searchsvc
searchsvc --> valkeyWarum separate Server?
1. Ressourcen-Isolierung
Jeder Server führt einen Workload-Typ aus:
Webserver: Optimiert für HTTP-Anfragebehandlung
-
Hohe Netzwerkbandbreite
-
Moderate CPU
-
Moderater Arbeitsspeicher
-
Schnelle Festplatte für Caching
Suchdienst: Optimiert für Vektoroperationen
-
Hohe CPU (Kosinusähnlichkeit)
-
Hoher Arbeitsspeicher (Embedding-Cache)
-
Geringe Festplatten-E/A
Cache-Server: Optimiert für Speicherzugriff
-
Sehr hoher Arbeitsspeicher
-
Geringe CPU
-
Schnelles Netzwerk
Vorteil: Keine Ressourcenkonkurrenz zwischen Workloads.
2. Unabhängige Skalierung
Wir können jede Komponente unabhängig skalieren:
-
Hoher Traffic? Mehr Webserver hinter Load Balancer hinzufügen.
-
Langsame Suche? CPU des Suchservers aufrüsten oder Replikate hinzufügen.
-
Cache-Misses? Arbeitsspeicher des Cache-Servers erhöhen.
-
Vorteil: Nur das skalieren, was skaliert werden muss, nicht alles.
3. Fehlerisolierung
Fehler bleiben begrenzt:
Suchdienst ausgefallen? Website bedient weiterhin zwischengespeicherte Ergebnisse.
Cache-Server ausgefallen? Suchdienst rechnet ohne Cache (langsamer, aber funktional).
Webserver ausgefallen? Internes ERP nicht betroffen.
Vorteil: Teilausfälle breiten sich nicht auf das gesamte System aus.
4. Deployment-Sicherheit
Wir deployen über Umgebungen:
Entwicklung → Änderungen mit Debug-Tools testen
Staging → In produktionsähnlicher Umgebung testen
Produktion → Mit Vertrauen deployen
Vorteil: Probleme erkennen, bevor sie Nutzer erreichen.
5. Kostenoptimierung
Wir optimieren Kosten pro Server:
-
Entwicklungsserver: Schaltet nachts/weekends ab (50% Kostenreduktion)
-
IPv6-only-Server: Keine Elastic-IP-Kosten ($5/Monat Ersparnis pro Instanz)
-
Richtig dimensionierte Instanzen: Nur für benötigte Ressourcen pro Workload bezahlen
-
Vorteil: Niedrigere Infrastrukturkosten ohne Leistungseinbußen.
Datenfluss zwischen Servern
Das Verständnis des Datenflusses hilft zu erklären, warum die Trennung wichtig ist:
Benutzeranfrage-Fluss
Produktseiten-Anfrage:
sequenceDiagram
participant User
participant CDN
participant Web as Web Server
participant Search as Search Service
participant Cache as Cache Server
User->>CDN: Request product page
CDN->>CDN: Check cache
alt Cache hit
CDN->>User: Serve cached page
else Cache miss
CDN->>Web: Forward request
Web->>Search: Get related products
Search->>Cache: Query embeddings
Cache->>Search: Return results
Search->>Web: Related products
Web->>CDN: Rendered page
CDN->>CDN: Cache response
CDN->>User: Serve page
endSuchanfrage-Fluss:
sequenceDiagram
participant User
participant Web as Web Server
participant Search as Search Service
participant Cache as Cache Server
User->>Web: Submit search query
Web->>Search: Forward query
Search->>Search: Extract filters
Search->>Search: Compute embedding
Search->>Cache: Vector search
Cache->>Search: Ranked results
Search->>Web: Product matches
Web->>User: Render resultsVorteil: Jeder Server macht das, wofür er optimiert ist.
Speicherstrategie pro Server
Verschiedene Server nutzen verschiedene Speicherstrategien:
Webserver
S3-basierte statische Dateien: Bilder, CSS, JS werden von S3 bereitgestellt
-
Hohe Verfügbarkeit
-
Keine lokale Festplattennutzung
-
CDN-freundlich
Lokaler Cache: Nginx cacht gerenderte Seiten
-
Schneller wiederholter Zugriff
-
Automatische Entwertung
Suchdienst
NumPy-Arrays: Produkt-Embeddings als binäre Arrays gespeichert
-
Schnelle Vektoroperationen
-
Speichergemappt für Effizienz
-
65K Produkte × 768 Dimensionen = ~190 MB
JSON-Dateien: Filter-Mappings, Phrasentabellen
-
Menschenlesbar
-
Einfach zu aktualisieren
-
Kleine Größe (<10 MB)
Cache-Server
Valkey (Redis): Query-Embeddings, beliebte Suchanfragen, Autovervollständigung
-
Im Speicher für Geschwindigkeit
-
RediSearch für Vektor-Indizes
-
Persistenz für Dauerhaftigkeit
Warum unterschiedliche Speicher?
-
NumPy: Optimiert für Vektormathematik (Kosinusähnlichkeit)
-
JSON: Optimiert für menschliche Bearbeitung (Filterregeln)
-
Valkey: Optimiert für Key-Value-Lookups (Query-Cache)
CDN-Architektur
Die öffentliche Website liegt hinter einem Content Delivery Network:
Was wird gecacht
Statische Assets (lange TTL):
-
Bilder, CSS, JavaScript
-
Schriftarten, Icons
-
1 Jahr gecacht
Produktseiten (mittlere TTL):
-
Produktbeschreibungen
-
Spezifikationen
-
1 Stunde gecacht
Suchseiten (kurze TTL):
-
Suchergebnisse
-
Filterkombinationen
-
5 Minuten gecacht
Nicht gecacht:
-
Benutzerspezifischer Inhalt
-
API-Endpunkte
-
Dynamische Suche
Warum ein CDN wichtig ist
-
Globale Latenz: Edge-Standorte bedienen Inhalte näher an den Nutzern
-
Origin-Schutz: CDN absorbiert Traffic-Spitzen, schützt Origin-Server
-
DDoS-Abwehr: CDN filtert bösartigen Traffic, bevor er den Origin erreicht
-
Kostenreduktion: Weniger Origin-Anfragen = niedrigere Compute-Kosten
Deployment-Pipeline
Wir deployen über Umgebungen, um Probleme früh zu erkennen:
Entwicklungsumgebung
Zweck: Schnelle Iteration mit Debug-Tools Merkmale:
-
Automatisches Neuladen bei Codeänderungen
-
Detaillierte Fehlerseiten
-
Debug-Toolbar
-
Kein Caching
Vorteil: Schnelle Feedback-Schleife für Entwickler.
Staging-Umgebung
Zweck: Produktionsähnliches Testen Merkmale:
-
Gleiche Konfiguration wie Produktion
-
Gleiche Server-Einrichtung (Gunicorn, Nginx)
-
Gleiches Caching-Verhalten
-
Isoliert von Produktionsdaten
Vorteil: Produktionsspezifische Probleme vor dem Deployment erkennen.
Produktionsumgebung
Zweck: Echte Nutzer bedienen Merkmale:
-
Für Leistung optimiert
-
Volles Caching aktiviert
-
Monitoring und Alerting
-
Automatischer Neustart bei Crashes
Vorteil: Stabiler, zuverlässiger Service.
Referenzen
Technische Konzepte
-
Separation of Concerns - Wikipedia
-
Content Delivery Network (CDN) - Wikipedia
-
Horizontal Scaling - Wikipedia
-
Cosine Similarity - Wikipedia
AWS-Dienste
-
CloudFront - AWS CDN-Dokumentation
-
S3 - AWS Objektspeicher-Dokumentation
-
DynamoDB - AWS NoSQL-Datenbank-Dokumentation
Verwandte Artikel
-
Search Service Architecture - Details zum eigenständigen Suchdienst
-
SEO Embedding Strategy - Warum wir all-mpnet-base-v2 verwenden
-
SEO Product Matching - Wie Vektorsuche funktioniert
-
Translation System - Architektur für Mehrsprachigkeit
Zusammenfassung
Unsere Multi-Server-Architektur trennt Zuständigkeiten über spezialisierte Server:
Produktions-ERP-Server:
-
Internes Managementsystem
-
24/7 Betriebszeit
-
Gemeinsamer Speicher und E-Mail
Öffentlicher Website-Server:
-
Kundenorientierte Website
-
24/7 Betriebszeit
-
Hinter CDN mit S3-basierten statischen Dateien
Entwicklungs-/Staging-Server:
-
Sichere Testumgebungen
-
E-Mail-Kampagnenverarbeitung
-
Kostenoptimiert (schaltet nachts/weekends ab)
Suchdienst-Server:
-
Vektor-Ähnlichkeitssuche
-
Filterextraktion
-
NumPy-basierte Embeddings
Cache-Server (Valkey):
-
Query-Embedding-Cache
-
RediSearch-Vektor-Indizes
-
Ranking beliebter Suchanfragen
Wesentliche Vorteile:
-
✅ Ressourcenisolierung: Keine Konkurrenz zwischen Workloads
-
✅ Unabhängige Skalierung: Nur das skalieren, was skaliert werden muss
-
✅ Fehlerisolierung: Ausfälle breiten sich nicht aus
-
✅ Deployment-Sicherheit: Vor Produktion testen
-
✅ Kostenoptimierung: Richtig dimensionierte Instanzen, Zeitpläne für Abschaltung
-
✅ Leistung: CDN-Caching, spezialisierte Speicherstrategien
Diese Architektur ermöglicht es uns, Millionen von Anfragen zu bedienen und dabei hohe Verfügbarkeit, niedrige Latenz und überschaubare Kosten zu gewährleisten.