Knowledge-Hub

Ein wesentlicher Bestandteil unserer Initiative ist es, Wissen zu teilen.

Mit vereinten Kräften schaffen wir es ein Nachschlagewerk zu erstellen von dem die Gemeinschaft profitieren wird.
Schickt uns doch gerne auch eure Erfahrungswerte zu, dann lernen wir gemeinsam von einander.

Best Practices für die Entwicklung von Microservices

Aus der Erfahrung aus vielen Projekten haben wir einen Leitfaden für die Entwicklung von Microservices erstellt:

Besonderheiten Kubernetes

  • Schreiben auf die Festplatte:
    Schreiben auf Root immer auf Layered Filesystem
    In Kubernetes gibt es einen speziellen Storage für flüchtiges Schreiben.
    Root Filesystem sollte immer Read Only gemountet werden.
  • Loadbalancing:
    Skalierung in Kubernetes nur Horizontal
    Services werden immer hinter Loadbalancern betrieben.
    Standardantwort für HA und Selfhealing
  • Liveliness probes/Watchdog:
    Grundsätzlich sollten Fehlerzustände möglichst im Service identifiziert werden.
    Healthchecks sollten aber nicht funktionieren eindeutig identifizieren
    Aus Kubernetes Sicht Standardantwort für Selbstheilung

Scale Out Anforderungen

  • Zustandslos:
    Dienst sollte möglichst zustandslos sein.
    Ist ein Zustand nicht zu vermeiden, muss dieser allen Instanzen bekannt gemacht werden.
    Kubernetes Service LBs unterstützen keine Sticky Sessions. Nur durch Tricks möglich!
  • Fehler tolerant:
    Fehler sind normal und passieren (Liveliness Probes!)
    Beispiel: At least once vs. at most once messaging (Acknowledged messaging vs Fire and forget).
  • Autonomie:
    In sich geschlossenes System, Verantwortungsübergänge
    Dienste entscheiden über alle Zustände vollständig und selbstständig.
    Beispiel: Löschen, Config, Transaktionen
  • Konsistenz:
    Jeder Dienst ist für seine eigene Konsistenz selbst verantwortlich
    ACHTUNG! Abhängigkeiten zu anderen Diensten beachten.
  • Queueing:
    Queueing hilft Lastspitzen zu glätten, da die Verarbeitung zeitlich verzögert stattfinden kann.
    Sehr gut geeignet für zeit- oder rechenintensive Aufgaben
    ACHTUNG! Asynchronität wird hier sehr verstärkt.
    (Mehrere Requests gegen gleiche Information können sich überholen. Race Conditions!)

Sonstige Planungsunterstützungen

  • Shared Resourcen vermeiden:
    Microservices basieren auf maximaler Parallelisierung
    Sie wirken immer serialisieren
  • Konfiguration:
    Statische Konfiguration durch Umgebungsvariable
    Bei großen Konfigurationsmengen auch über Config-Dateien
    Dynamische Konfiguration in Applikationsdatenbank​
  • Caching:
    Starkes Mittel für Performance und zur Reduzierung von Rechenleistung
    Möglichst nur für lesende Zugriffe verwenden
    Cache unvalidieren nach Schreibvorgängen
    Bei großen Mengen und seltenen Writes sollte Cache im Hintergrund erstellt werden

Herausforderungen bei Microservices

  • Microservices sind Verteilte Systeme:
    Verteilte Systeme unterliegen immer Kompromissen
    CAP Theorem
    Eventual Consistency​
    WICHTIG! Ist diese Entscheidung bewusst zu treffen
  • Problemstellungen:
    Besondere Beachtung bei Löschen, Backup, usw.
    Transaktionen nur durch übergreifende ID Möglich
    Worst Case Freeze => Widerspricht Autonomie und skaliert somit nicht!​
Kubernative GmbH
Bahnhofstr. 22
72336 Balingen
Telefon: +49 7433 2781296
Mail: Diese E-Mail-Adresse ist vor Spambots geschützt! Zur Anzeige muss JavaScript eingeschaltet sein!
Internet: www.kubernative.net