Sobes.tech
Middle+

Welche Microservice-Muster kennen Sie?

sobes.tech KI

Antwort von AI

  • Service Discovery: Erlaubt es Diensten, einander zu finden. Wird durch eine zentrale Registrierung realisiert (z.B. ZooKeeper, Consul, etcd).
  • API Gateway: Ein einziger Einstiegspunkt für Clients, der Anfragen an die entsprechenden Dienste weiterleitet. Bietet Authentifizierung, Autorisierung und Lastverteilung.
  • Circuit Breaker (Schutzschalter): Verhindert Kaskadenausfälle, indem er temporär Aufrufe an fehlerhafte Dienste deaktiviert.
  • Bulkhead: Isoliert Ressourcen verschiedener Dienste, um gegenseitige Beeinflussung bei Fehlern zu vermeiden.
  • Saga: Verwalten verteilte Transaktionen, um die Datenkonsistenz zwischen mehreren Diensten durch eine Sequenz lokaler Transaktionen und ausgleichender Aktionen zu gewährleisten.
  • Event Sourcing (Ereignisorientierte Speicherung): Speichert alle Datenänderungen als Ereignisse, um eine vollständige Historie der Zustände bereitzustellen.
  • CQRS (Command Query Responsibility Segregation): Trennt Lese- und Schreiblogik in unterschiedliche Modelle, um die Leistung für jeden Operationstyp zu optimieren.
  • Datenbank pro Dienst: Jeder Dienst erhält eine eigene Datenbank, um Unabhängigkeit und Dezentralisierung zu gewährleisten.
  • Strangler Fig: Schrittweise Ablösung einer monolithischen Anwendung durch Microservices, indem Teile des Traffics umgeleitet werden.

Beispiel für die Implementierung eines Circuit Breakers in PHP (Pseudocode):

<?php
// Circuit Breaker Klasse
class CircuitBreaker
{
    private $threshold; // Schwelle der Fehler
    private $timeout; // Zeit, in der der Schalter offen bleibt
    private $failures = 0; // Aktuelle Fehleranzahl
    private $lastFailureTime = 0; // Zeit des letzten Fehlers
    private $state = 'CLOSED'; // Aktueller Zustand: CLOSED, OPEN, HALF_OPEN

    public function __construct(int $threshold, int $timeout)
    {
        $this->threshold = $threshold;
        $this->timeout = $timeout;
    }

    public function execute(callable $operation)
    {
        switch ($this->state) {
            case 'OPEN':
                if (time() - $this->lastFailureTime > $this->timeout) {
                    $this->state = 'HALF_OPEN';
                    // Versuch, im HALF-OPEN Zustand auszuführen
                    try {
                        $result = $operation();
                        $this->reset(); // Erfolg, Reset
                        return $result;
                    } catch (\Exception $e) {
                        $this->recordFailure(); // Fehler im HALF-OPEN, zurück zu OPEN
                        throw $e;
                    }
                } else {
                    throw new \Exception("Circuit breaker is open"); // Schalter offen
                }
                break;
            case 'HALF_OPEN':
                // Logik für HALF-OPEN bereits oben
                break;
            case 'CLOSED':
            default:
                try {
                    $result = $operation();
                    $this->reset(); // Erfolg, Reset
                    return $result;
                } catch (\Exception $e) {
                    $this->recordFailure(); // Fehler, Zähler erhöhen
                    throw $e;
                }
                break;
        }
    }

    private function recordFailure(): void
    {
        $this->failures++;
        $this->lastFailureTime = time();
        if ($this->failures >= $this->threshold) {
            $this->state = 'OPEN'; // Wechsel zu OPEN bei Erreichen des Schwellenwerts
        }
    }

    private function reset(): void
    {
        $this->failures = 0;
        $this->lastFailureTime = 0;
        $this->state = 'CLOSED'; // Wechsel zu CLOSED bei Erfolg
    }
}

// Verwendung
$breaker = new CircuitBreaker(3, 60); // Schwelle 3 Fehler, Timeout 60 Sekunden

try {
    $data = $breaker->execute(function() {
        // Code zum Aufruf eines externen Dienstes
        if (rand(0, 1) == 0) { // Fehler simulieren
             throw new \Exception("Service unavailable");
        }
        return ['status' => 'ok'];
    });
    echo "Success: " . json_encode($data) . "\n";
} catch (\Exception $e) {
    echo "Failure: " . $e->getMessage() . "\n";
}