Graceful Degradation¶
Graceful Degradation, bir sistemin kısmi bir hata durumunda bile hizmet sunmaya devam etmesini sağlayan bir dayanıklılık stratejisidir. Bu strateji, kritik olmayan özelliklerin geçici olarak kapatılmasını veya azaltılmış bir hizmet sunulmasını içerir.
1. Graceful Degradation Nedir?¶
- Amaç: Kullanıcı deneyimini koruyarak, sistemin tamamen çökmesini önlemek.
- Kullanım Alanları: Yüksek trafiğe sahip web siteleri, mikroservis mimarileri, dağıtık sistemler.
Örneğin, bir e-ticaret sitesinde ödeme hizmeti geçici olarak kullanılamıyorsa, kullanıcıların ürün incelemesi yapmaya devam etmesi sağlanabilir.
2. Polly ile Graceful Degradation¶
Polly’nin Fallback politikası, Graceful Degradation stratejisini uygulamak için etkili bir araçtır.
✅ Örnek: Fallback ile Alternatif Yanıt Döndürme
var fallbackPolicy = Policy<string>
.Handle<Exception>()
.FallbackAsync(
fallbackValue: "Reduced functionality: Please try again later.",
onFallbackAsync: async (exception, context) =>
{
Console.WriteLine($"Fallback triggered: {exception.Message}");
await Task.CompletedTask;
});
var result = await fallbackPolicy.ExecuteAsync(async () =>
{
throw new Exception("Primary service unavailable!");
});
Console.WriteLine($"Response: {result}");
3. Özellik Azaltma (Feature Reduction)¶
Bir sistemin bazı özelliklerini geçici olarak kapatarak hizmet vermeye devam etmesi sağlanabilir.
✅ Örnek: Kritik Olmayan Özellikleri Devre Dışı Bırakma
if (!IsCriticalFeatureAvailable())
{
Console.WriteLine("Critical feature unavailable. Displaying limited functionality.");
DisplayBasicFeatures();
}
else
{
DisplayFullFeatures();
}
4. Graceful Degradation ile Cache Kullanımı¶
Geçici bir hata durumunda, önceden önbelleğe alınmış veriler kullanılabilir.
✅ Örnek: Cache ile Yedekleme
var fallbackPolicy = Policy<string>
.Handle<Exception>()
.FallbackAsync(
fallbackAction: async cancellationToken =>
{
Console.WriteLine("Using cached data due to failure.");
return "Cached Data";
});
var result = await fallbackPolicy.ExecuteAsync(async () =>
{
throw new Exception("Primary service failed!");
});
Console.WriteLine($"Result: {result}");
5. Graceful Degradation ve Retry Kombinasyonu¶
Hataları yönetmek için Retry ve Graceful Degradation stratejilerini birleştirebilirsiniz.
✅ Örnek: Retry ve Fallback Kombinasyonu
var retryPolicy = Policy
.Handle<Exception>()
.WaitAndRetryAsync(3, retryAttempt => TimeSpan.FromSeconds(retryAttempt));
var fallbackPolicy = Policy<string>
.Handle<Exception>()
.FallbackAsync(
fallbackValue: "Service is temporarily unavailable.");
var combinedPolicy = Policy.WrapAsync(fallbackPolicy, retryPolicy);
var result = await combinedPolicy.ExecuteAsync(async () =>
{
throw new Exception("Service failed!");
});
Console.WriteLine($"Response: {result}");
6. Performans ve İzleme¶
Graceful Degradation sırasında sistem performansını izlemek önemlidir:
- Metrikler: Azaltılmış hizmetlerin ne sıklıkta kullanıldığını izleyin.
- Loglama: Fallback ve diğer stratejilerin ne zaman devreye girdiğini takip edin.
✅ Örnek: Loglama ile İzleme
var fallbackPolicy = Policy<string>
.Handle<Exception>()
.FallbackAsync(
fallbackValue: "Limited functionality is active.",
onFallbackAsync: async (exception, context) =>
{
Console.WriteLine($"Fallback triggered due to: {exception.Message}");
await Task.CompletedTask;
});
await fallbackPolicy.ExecuteAsync(async () =>
{
throw new Exception("Simulated failure!");
});