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";
}