Middle+
Hangi mikroservis desenlerini biliyorsunuz?
sobes.tech yapay zeka
AI'dan gelen yanıt
- Servis Keşfi: Servislerin birbirini bulmasını sağlar. Merkezi kayıt defteri aracılığıyla uygulanır (örneğin, ZooKeeper, Consul, etcd).
- API Gateway: Müşteriler için tek giriş noktasıdır, istekleri ilgili servislere yönlendirir. Kimlik doğrulama, yetkilendirme ve yük dengeleme sağlar.
- Circuit Breaker (Devre Kesici): Zincirleme arızaları önler, arızalı servislere yapılan çağrıları geçici olarak devre dışı bırakır.
- Bulkhead: Farklı servislerin kaynaklarını izole eder, arızalar sırasında karşılıklı etkilerini önler.
- Saga: Dağıtık işlemleri yönetir, birkaç servis arasındaki veri tutarlılığını yerel işlemler ve telafi edici eylemlerle sağlar.
- Event Sourcing (Olay Tabanlı Depolama): Tüm veri değişikliklerini olaylar dizisi olarak saklar, tam bir durum geçmişi sağlar.
- CQRS (Komut ve Sorgu Sorumluluğu Ayrımı): Okuma ve yazma mantığını farklı modellere ayırır, her biri için performansı optimize eder.
- Hizmet Başına Veritabanı: Her servise kendi veritabanı atanır, bağımsızlık ve merkeziyetsizlik sağlar.
- Strangler Fig: Monolitik uygulamayı mikroservislere kademeli olarak dönüştürür, trafik bölümlerini yönlendirir.
PHP'de Circuit Breaker örneği (sözde kod):
<?php
// Circuit Breaker Sınıfı
class CircuitBreaker
{
private $threshold; // Arıza eşiği
private $timeout; // Açık kalma süresi
private $failures = 0; // Mevcut arıza sayısı
private $lastFailureTime = 0; // Son arıza zamanı
private $state = 'CLOSED'; // Durum: 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':
// Halfin açık durumda işlem yukarıda zaten var
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';
}
}
// Kullanım
$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";
}