Middle+
Aké vzory mikroservisov poznáte?
sobes.tech AI
Odpoveď od AI
- Service Discovery: Umožňuje službám nájsť sa navzájom. Implementuje sa cez centralizovaný register (napríklad ZooKeeper, Consul, etcd).
- API Gateway: Jednotný vstupný bod pre klientov, ktorý smeruje požiadavky na príslušné služby. Zabezpečuje autentifikáciu, autorizáciu, vyvažovanie záťaže.
- Circuit Breaker (Automatický vypínač): Zabraňuje kaskádovým zlyhaniam dočasným vypnutím volaní na nefunkčné služby.
- Bulkhead: Izoluje zdroje rôznych služieb, čím zabraňuje ich vzájomnému ovplyvňovaniu pri zlyhaniach.
- Saga: Riadi distribuované transakcie, zabezpečuje konzistentnosť dát medzi viacerými službami pomocou sekvencie lokálnych transakcií a kompenzačných akcií.
- Event Sourcing (Ukladanie udalostí): Ukladá všetky zmeny dát vo forme udalostí, zabezpečuje úplnú históriu stavov.
- CQRS (Command Query Responsibility Segregation): Rozdeľuje logiku čítania a zápisu dát na rôzne modely, optimalizuje výkon pre každý typ operácie.
- Database per Service (Databáza na službu): Každej službe je pridelená vlastná databáza na zabezpečenie nezávislosti a decentralizácie.
- Strangler Fig: Postupné nahrádzanie monolitickej aplikácie mikroslužbami, presmerovaním častí prevádzky.
Príklad implementácie Circuit Breaker v PHP (pseudokód):
<?php
// Trieda Circuit Breaker
class CircuitBreaker
{
private $threshold; // Prah počtu zlyhaní
private $timeout; // Čas, počas ktorého zostáva vypínač otvorený
private $failures = 0; // Aktuálny počet zlyhaní
private $lastFailureTime = 0; // Čas posledného zlyhania
private $state = 'CLOSED'; // Aktuálny stav: 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';
// Pokus o vykonanie operácie v stave HALF-OPEN
try {
$result = $operation();
$this->reset(); // Úspech, reset
return $result;
} catch (\Exception $e) {
$this->recordFailure(); // Zlyhanie v HALF-OPEN, návrat do OPEN
throw $e;
}
} else {
throw new \Exception("Circuit breaker is open"); // Vypínač je otvorený
}
break;
case 'HALF_OPEN':
// Logika spracovania v HALF_OPEN je už vyššie
break;
case 'CLOSED':
default:
try {
$result = $operation();
$this->reset(); // Úspech, reset
return $result;
} catch (\Exception $e) {
$this->recordFailure(); // Zlyhanie, zvýšenie počítadla
throw $e;
}
break;
}
}
private function recordFailure(): void
{
$this->failures++;
$this->lastFailureTime = time();
if ($this->failures >= $this->threshold) {
$this->state = 'OPEN'; // Prechod do OPEN pri dosiahnutí prahu
}
}
private function reset(): void
{
$this->failures = 0;
$this->lastFailureTime = 0;
$this->state = 'CLOSED'; // Prechod do CLOSED pri úspechu
}
}
// Použitie
$breaker = new CircuitBreaker(3, 60); // Prah 3 zlyhaní, timeout 60 sekúnd
try {
$data = $breaker->execute(function() {
// Kód volania vonkajšieho servisu
if (rand(0, 1) == 0) { // Simulácia zlyhania
throw new \Exception("Service unavailable");
}
return ['status' => 'ok'];
});
echo "Success: " . json_encode($data) . "\n";
} catch (\Exception $e) {
echo "Failure: " . $e->getMessage() . "\n";
}