Middle+
Milyen mikroszerviz mintákat ismersz?
sobes.tech MI
Válasz az MI-től
- Szolgáltatás felfedezése: Lehetővé teszi a szolgáltatások számára, hogy egymást megtalálják. Központosított nyilvántartón keresztül valósul meg (pl. ZooKeeper, Consul, etcd).
- API Gateway: Egységes belépési pont az ügyfelek számára, amely átirányítja a kéréseket a megfelelő szolgáltatásokhoz. Hitelesítést, jogosultságkezelést, terheléselosztást biztosít.
- Circuit Breaker (Automatikus kapcsoló): Megakadályozza a láncban terjedő hibákat, ideiglenesen kikapcsolva a hibás szolgáltatások hívásait.
- Bulkhead: Elkülöníti a különböző szolgáltatások erőforrásait, megelőzve a kölcsönös befolyásolást hibák esetén.
- Saga: Kezeli a disztribúciós tranzakciókat, biztosítva az adatok konzisztenciáját több szolgáltatás között helyi tranzakciók és kompenzáló műveletek segítségével.
- Event Sourcing (Esemény-vezérelt tárolás): Minden adatváltozást eseményként tárol, teljes történelmet biztosítva.
- CQRS (Parancs és lekérdezés felelősségének szétválasztása): Elkülöníti az olvasási és írási logikát külön modellekben, optimalizálva a teljesítményt.
- Database per Service: Minden szolgáltatás saját adatbázissal rendelkezik a függetlenség érdekében.
- Strangler Fig: Folyamatosan helyettesíti a monolitikus alkalmazást mikroservice-ekkel, a forgalom átirányításával.
PHP-ben Circuit Breaker példakód (pseudo-kód):
<?php
// Circuit Breaker osztály
class CircuitBreaker
{
private $threshold; // Hibahatár
private $timeout; // Nyitva tartási idő
private $failures = 0; // Aktuális hibaszám
private $lastFailureTime = 0; // Utolsó hiba ideje
private $state = 'CLOSED'; // Állapot: 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';
// HALF_OPEN állapot próbálkozás
try {
$result = $operation();
$this->reset(); // Siker, reset
return $result;
} catch (\Exception $e) {
$this->recordFailure(); // Sikeretlenség a HALF_OPEN-ben, vissza OPEN-be
throw $e;
}
} else {
throw new \Exception("Circuit breaker nyitva");
}
break;
case 'HALF_OPEN':
// HALF_OPEN logika fentebb
break;
case 'CLOSED':
default:
try {
$result = $operation();
$this->reset(); // Siker, reset
return $result;
} catch (\Exception $e) {
$this->recordFailure(); // Hiba, növeljük a hibaszámot
throw $e;
}
break;
}
}
private function recordFailure(): void
{
$this->failures++;
$this->lastFailureTime = time();
if ($this->failures >= $this->threshold) {
$this->state = 'OPEN'; // Átváltás OPEN-be
}
}
private function reset(): void
{
$this->failures = 0;
$this->lastFailureTime = 0;
$this->state = 'CLOSED'; // Átváltás CLOSED-be
}
}
// Használat
$breaker = new CircuitBreaker(3, 60); // 3 hiba, 60 mp timeout
try {
$data = $breaker->execute(function() {
// Külső szolgáltatás hívás kódja
if (rand(0, 1) == 0) { // Szimulált hiba
throw new \Exception("Szolgáltatás nem elérhető");
}
return ['status' => 'ok'];
});
echo "Siker: " . json_encode($data) . "\n";
} catch (\Exception $e) {
echo "Hiba: " . $e->getMessage() . "\n";
}