Middle+
Hansı mikroxidmət nümunələrini bilirsiniz?
sobes.tech Süni İntellekt
AI-dan cavab
- Xidmət Kəşfi: Xidmətlərin bir-birini tapmasına imkan verir. Mərkəzləşdirilmiş qeydiyyat vasitəsilə həyata keçirilir (məsələn, ZooKeeper, Consul, etcd).
- API Gateway: Müştərilər üçün vahid giriş nöqtəsi, sorğuları müvafiq xidmətlərə yönəldir. Doğrulama, icazə və yük balanslaşdırma təmin edir.
- Circuit Breaker (Avtomatik açar): Xəta halında xidmətlərə edilən çağırışları müvəqqəti dayandıraraq kaskad xətaların qarşısını alır.
- Bulkhead: Fərqli xidmətlərin resurslarını izolyasiya edir, uğursuzluqlar zamanı qarşılıqlı təsiri önləyir.
- Saga: Paylanmış əməliyyatları idarə edir, lokal əməliyyatlar və kompensasiya tədbirləri vasitəsilə məlumatların uyğunluğunu təmin edir.
- Event Sourcing (Hadisə əsaslı saxlama): Bütün məlumat dəyişikliklərini hadisələr şəklində saxlayır, tam tarixçəni təmin edir.
- CQRS (Əmr və Sorğu Məsuliyyətlərinin Ayrılması): Oxuma və yazma loqikasını fərqli modellərə ayırır, hər bir əməliyyat növü üçün performansı optimallaşdırır.
- Database per Service: Hər xidmət üçün müstəqil verilənlər bazası təyin edilir.
- Strangler Fig: Monolit tətbiqin mərhələli olaraq mikroservislərlə əvəz olunması, trafikin yönləndirilməsi.
PHP-də Circuit Breaker nümunəsi (pseudo-kod):
<?php
// Circuit Breaker sinfi
class CircuitBreaker
{
private $threshold; // Xəta limiti
private $timeout; // Açıq vəziyyətdə qalma müddəti
private $failures = 0; // Cari xəta sayı
private $lastFailureTime = 0; // Son xəta vaxtı
private $state = 'CLOSED'; // Mövcud vəziyyət: 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 vəziyyətində cəhd
try {
$result = $operation();
$this->reset(); // Uğur, sıfırla
return $result;
} catch (\Exception $e) {
$this->recordFailure(); // Uğursuz, OPEN-ə qayıt
throw $e;
}
} else {
throw new \Exception("Circuit breaker açıqdır");
}
break;
case 'HALF_OPEN':
// Yuxarıda HALF_OPEN üçün loqika var
break;
case 'CLOSED':
default:
try {
$result = $operation();
$this->reset(); // Uğur, sıfırla
return $result;
} catch (\Exception $e) {
$this->recordFailure(); // Xəta, say artır
throw $e;
}
break;
}
}
private function recordFailure(): void
{
$this->failures++;
$this->lastFailureTime = time();
if ($this->failures >= $this->threshold) {
$this->state = 'OPEN'; // OPEN-ə keç
}
}
private function reset(): void
{
$this->failures = 0;
$this->lastFailureTime = 0;
$this->state = 'CLOSED'; // CLOSED-ə keç
}
}
// İstifadə
$breaker = new CircuitBreaker(3, 60); // 3 xəta limiti, 60 saniyə timeout
try {
$data = $breaker->execute(function() {
// Xarici xidmət çağırış kodu
if (rand(0, 1) == 0) { // Yalandan xəta
throw new \Exception("Xidmət mövcud deyil");
}
return ['status' => 'ok'];
});
echo "Uğur: " . json_encode($data) . "\n";
} catch (\Exception $e) {
echo "Xəta: " . $e->getMessage() . "\n";
}