Sobes.tech
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";
}