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