Zum Hauptinhalt springen

Blogs

Best Practices für die Entwicklung von Microservices

Best Practices für die Entwicklung von Microservices

Aus der Erfahrung vieler Projekte haben wir einen Leitfaden für die Entwicklung von Microservices zusammengestellt.

 

Besondere Merkmale von Kubernetes

Schreiben auf die Festplatte

Schreiben auf Root immer auf geschichtetem Dateisystem.
In Kubernetes gibt es einen speziellen Speicher für flüchtige Schreibvorgänge.
Das Root-Dateisystem sollte immer schreibgeschützt gemountet werden.

Lastausgleich

Skalierung in Kubernetes nur horizontal.
Dienste werden immer hinter Lastverteilern ausgeführt.
Standardantwort für HA und Selfhealing.

Lebendigkeitssonden/

Watchdog

Grundsätzlich sollten Fehlerzustände im Dienst nach Möglichkeit identifiziert werden. 
Health Checks sollten jedoch nicht dazu dienen, Fehler eindeutig zu identifizieren.
Aus Sicht von Kubernetes Standardreaktion zur Selbstheilung.

 

Skalierung der Anforderungen

Zustandslos

Dienste sollten nach Möglichkeit zustandlos sein.
Wenn ein Zustand nicht vermieden werden kann, muss er allen Instanzen bekannt gemacht werden. 
Kubernetes Service LBs unterstützen keine Sticky Sessions. Nur durch Tricks möglich.

Fehlertolerant

Fehler sind normal und kommen vor (Lebendigkeitsproben!).
Beispiel: Mindestens einmal vs. höchstens einmalige Benachrichtigung (Bestätige Benachrichtigung vs. Fire and forget).

Autonomie

Eigenständiges System, Verantwortungsübergänge.
Dienste entscheiden über alle Zustände vollständig und selbstständig.
Beispiel: Löschung, Konfiguration, Transaktionen

Konsistenz

Jeder Dienst ist für seine eigene Konsistenz verantwortlich.
Achtung! Beachten Sie die Abhängigkeiten zu anderen Diensten.

Warteschleife

Queueing hilft, Lastspitzen abzufangen, da die Verarbeitung verzögert werden kann.
Sehr geeignet für zeit- oder rechenintensive Aufgaben.
Aber Achtung! Die Asynchronität wird hier stark verstärkt. (Mehrere Anfragen gegen dieselbe Information können sich gegenseitig überholen. Race Conditions!) 

 

Sonstige Planungsunterstützung

Gemeinsame Nutzung von Ressourcen vermeiden

Microservices basieren auf maximaler Parallelisierung.
Sie agieren immer in einer seriellen Weise.

Konfiguration

Statistik-Konfiguration per Umgebungsvariable.
Bei großen Konfigurationsmengen auch über Config-Dateien.
Dynamische Konfiguration in der Anwendungsbank. 

Caching

Starke Mittel für Leistungen und zur Reduzierung der Rechenleistung
Wenn möglich, nur für Lesezugriffe verwenden
Cache nach Schreibzugriffen ungültig machen.
Bei großen Volumina und seltenen Schreibvorgängen sollte der Cache im Hintergrund angelegt werden. 

 

Herausforderungen bei Microservices

Microservices sind verteilte Systeme

Verteilte Systeme sind immer mit Kompromissen behaftet
CAP Theorem
Eventuelle Konsistenz
WICHTIG! Diese Entscheidung muss bewusst getroffen werden.

Probleme

Besondere Aufmerksamkeit bei Löschung, Sicherung usw.
Transaktionen nur bei überlappender ID möglich
Worst case freeze => widerspricht der Autonomie und skaliert daher nicht!​