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";
}