Harici API Entegrasyonlarında Dayanıklılık: Retry, Timeout ve Circuit Breaker
Üçüncü parti API entegrasyonlarında ağ kesintileri ve geçici hatalara karşı sistemi koruyan Retry, Timeout ve Circuit Breaker desenlerini .NET örnekleriyle anlatıyorum.
- .NET
- API Entegrasyonu
- Polly
- Yazılım Mimarisi
- Backend
Geliştirdiğimiz uygulamalar çoğu zaman tek başına çalışmaz; ödeme geçitleri, kargo servisleri, CRM sistemleri veya harici veri sağlayıcılarıyla sürekli HTTP üzerinden haberleşir. Kendi kodumuz ne kadar hatasız olursa olsun, konuştuğumuz harici bir API'nin o an yanıt vermemesi veya yavaşlaması tüm sistemimizi kilitleyebilir. Bu yazıda, harici API entegrasyonlarını dayanıklı (resilient) hale getirmek için uyguladığım temel desenleri paylaşıyorum.
1. Asla Sınırsız Timeout Kullanmamak
Bir HttpClient çağrısında açıkça zaman aşımı (timeout) belirlemezseniz, karşı servis yanıt vermediğinde uygulamanızın thread/bağlantı havuzu uzun süre bekleyen isteklerle dolar. Her harici servis için işin doğasına uygun, makul bir timeout süresi tanımlamak ilk güvenlik adımıdır.
2. Geçici Hatalar İçin Üstel Geri Çekilme (Exponential Backoff ile Retry)
Ağ dünyasında anlık paket kayıpları veya karşı sunucudaki 1-2 saniyelik yoğunluklar nedeniyle 503 Service Unavailable gibi geçici (transient) hatalar alınabilir. Hemen hata fırlatmak yerine, kısa ve artan aralıklarla (örneğin 1 sn, 2 sn, 4 sn) isteği yeniden denemek çoğu zaman sorunu kullanıcının ruhu bile duymadan çözer. .NET ekosisteminde Microsoft.Extensions.Http.Resilience (ve Polly) ile bunu merkezi olarak tanımlamak oldukça temizdir:
builder.Services
.AddHttpClient<IPaymentGatewayClient, PaymentGatewayClient>(client =>
{
client.BaseAddress = new Uri("https://api.ornek-odeme.com");
client.Timeout = TimeSpan.FromSeconds(10);
})
.AddStandardResilienceHandler();
3. Devre Kesici (Circuit Breaker) ile Sistemi Korumak
Eğer karşı servis tamamen çöktüyse, her gelen istekte 3 kez retry yapmak hem karşı sistemi daha da boğar hem de kendi sisteminizi yavaşlatır. Circuit Breaker deseni, ardışık hata sayısı belirli bir eşiği aştığında devreyi açar ve belirli bir süre boyunca (örneğin 30 saniye) karşı servise hiç istek göndermeden anında kontrollü bir hata döner. Süre dolduğunda tek bir test isteği göndererek servisin düzelip düzelmediğini kontrol eder.
Sonuç
Harici API entegrasyonu yazarken "karşı servis her zaman 200 dönecek" varsayımıyla değil, "karşı servis kesildiğinde benim uygulamam nasıl ayakta kalacak?" sorusuyla tasarım yapmak, kurumsal kalitede yazılımın en belirgin farkıdır.
Bu yazıyı faydalı buldunuz mu? LinkedIn'de takip ederek yeni yazılardan haberdar olabilirsiniz.Found this article helpful? Follow me on LinkedIn to stay updated on new posts.
LinkedIn'de Takip EtFollow on LinkedIn