Sobes.tech
Middle+

Welke microservice-patronen kent u?

sobes.tech AI

Antwoord van AI

  • Service Discovery: Maakt het mogelijk voor services om elkaar te vinden. Wordt geïmplementeerd via een gecentraliseerd register (bijvoorbeeld ZooKeeper, Consul, etcd).
  • API Gateway: Eén toegangspunt voor clients, dat verzoeken doorstuurt naar de juiste services. Biedt authenticatie, autorisatie, load balancing.
  • Circuit Breaker (Automatische schakelaar): Voorkomt cascade-fouten door oproepen naar defecte services tijdelijk te onderbreken.
  • Bulkhead: Isolatie van resources tussen verschillende services, om onderlinge invloed bij fouten te voorkomen.
  • Saga: Beheert gedistribueerde transacties, zorgt voor gegevensconsistentie tussen meerdere services via een reeks lokale transacties en compensatie-acties.
  • Event Sourcing (Gebeurtenis-gedreven opslag): Slaat alle dataveranderingen op als een reeks gebeurtenissen, voor een volledige geschiedenis van toestanden.
  • CQRS (Command Query Responsibility Segregation): Scheidt lees- en schrijflogica in verschillende modellen, optimaliseert prestaties voor elk type operatie.
  • Database per Service: Elke service krijgt een eigen database voor onafhankelijkheid en decentralisatie.
  • Strangler Fig: Geleidelijke vervanging van monolithische applicaties door microservices, door delen van het verkeer te herleiden.

Voorbeeld van een Circuit Breaker-implementatie in PHP (pseudo-code):

<?php
// Circuit Breaker klasse
class CircuitBreaker
{
    private $threshold; // Drempel voor aantal fouten
    private $timeout; // Tijd dat de schakelaar open blijft
    private $failures = 0; // Huidig aantal fouten
    private $lastFailureTime = 0; // Tijd van laatste fout
    private $state = 'CLOSED'; // Huidige status: 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';
                    // Proberen uit te voeren in HALF_OPEN
                    try {
                        $result = $operation();
                        $this->reset(); // Succes, reset
                        return $result;
                    } catch (\Exception $e) {
                        $this->recordFailure(); // Fout in HALF_OPEN, terug naar OPEN
                        throw $e;
                    }
                } else {
                    throw new \Exception("Circuit breaker is open"); // Schakelaar is open
                }
                break;
            case 'HALF_OPEN':
                // Logica voor HALF_OPEN is hierboven
                break;
            case 'CLOSED':
            default:
                try {
                    $result = $operation();
                    $this->reset(); // Succes, reset
                    return $result;
                } catch (\Exception $e) {
                    $this->recordFailure(); // Fout, tel op
                    throw $e;
                }
                break;
        }
    }

    private function recordFailure(): void
    {
        $this->failures++;
        $this->lastFailureTime = time();
        if ($this->failures >= $this->threshold) {
            $this->state = 'OPEN'; // Ga naar OPEN bij drempel bereikt
        }
    }

    private function reset(): void
    {
        $this->failures = 0;
        $this->lastFailureTime = 0;
        $this->state = 'CLOSED'; // Ga naar CLOSED bij succes
    }
}

// Gebruik
$breaker = new CircuitBreaker(3, 60); // Drempel 3 fouten, timeout 60 sec

try {
    $data = $breaker->execute(function() {
        // Code voor externe service
        if (rand(0, 1) == 0) { // Simulatie van fout
             throw new \Exception("Service niet beschikbaar");
        }
        return ['status' => 'ok'];
    });
    echo "Success: " . json_encode($data) . "\n";
} catch (\Exception $e) {
    echo "Fout: " . $e->getMessage() . "\n";
}