Sobes.tech
Middle+

Qaysi mikroxizmat naqshlarini bilasiz?

sobes.tech AI

AIdan javob

  • Xizmatlarni aniqlash: Xizmatlar bir-birini topish imkonini beradi. Markazlashtirilgan ro'yxatga olish orqali amalga oshiriladi (masalan, ZooKeeper, Consul, etcd).
  • API Gateway: Mijozlar uchun yagona kirish nuqtasi bo'lib, so'rovlarni mos xizmatlarga yo'naltiradi. Autentifikatsiya, ruxsat berish va yukni taqsimlashni ta'minlaydi.
  • Circuit Breaker (Tarmoq uzgich): Kaskadli nosozliklarni oldini oladi, nosoz xizmatlarga chaqiruvlarni vaqtincha o'chiradi.
  • Bulkhead: Turli xizmatlarning resurslarini izolyatsiya qiladi, nosozliklar paytida ularning o'zaro ta'sirini oldini oladi.
  • Saga: Tarqoq tranzaktsiyalarni boshqaradi, ma'lumotlarning bir xil bo'lishini ta'minlash uchun mahalliy tranzaktsiyalar va kompensatsiya harakatlari ketma-ketligini qo'llaydi.
  • Event Sourcing (Voqealar asosidagi saqlash): Barcha ma'lumot o'zgarishlarini voqealar ketma-ketligi sifatida saqlaydi, to'liq holat tarixini ta'minlaydi.
  • CQRS (Buyruq va so'rov mas'uliyatining ajralishi): O'qish va yozish logikasini turli modellarga bo'linadi, har bir operatsiya turi uchun unumdorlikni optimallashtiradi.
  • Xizmatga oid ma'lumotlar bazasi: Har bir xizmat uchun o'zining ma'lumotlar bazasi ajratiladi, mustaqillik va markazlashuvni ta'minlash uchun.
  • Strangler Fig: Monolitik ilovani mikroservislarga asta-sekin almashtirish, trafik qismlarini yo'naltirish.

PHPda Circuit Breaker ni amalga oshirish misoli (psevdokod):

<?php
// Circuit Breaker sinfi
class CircuitBreaker
{
    private $threshold; // Xato chegarasi
    private $timeout; // Ochiq qolish vaqti
    private $failures = 0; // Hozirgi xato soni
    private $lastFailureTime = 0; // Oxirgi xato vaqti
    private $state = 'CLOSED'; // Holat: 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';
                    try {
                        $result = $operation();
                        $this->reset();
                        return $result;
                    } catch (\Exception $e) {
                        $this->recordFailure();
                        throw $e;
                    }
                } else {
                    throw new \Exception("Circuit breaker is open");
                }
                break;
            case 'HALF_OPEN':
                // HALF-OPEN holatda logika yuqorida
                break;
            case 'CLOSED':
            default:
                try {
                    $result = $operation();
                    $this->reset();
                    return $result;
                } catch (\Exception $e) {
                    $this->recordFailure();
                    throw $e;
                }
                break;
        }
    }

    private function recordFailure(): void
    {
        $this->failures++;
        $this->lastFailureTime = time();
        if ($this->failures >= $this->threshold) {
            $this->state = 'OPEN';
        }
    }

    private function reset(): void
    {
        $this->failures = 0;
        $this->lastFailureTime = 0;
        $this->state = 'CLOSED';
    }
}

// Foydalanish
$breaker = new CircuitBreaker(3, 60);
try {
    $data = $breaker->execute(function() {
        if (rand(0, 1) == 0) {
             throw new \Exception("Service unavailable");
        }
        return ['status' => 'ok'];
    });
    echo "Success: " . json_encode($data) . "\n";
} catch (\Exception $e) {
    echo "Failure: " . $e->getMessage() . "\n";
}