Dayanıklılık ve gözlem
Hız sınırı, zaman aşımı, retry ve devre kesici
Kötüye kullanıma ve yavaş bağımlılıklara karşı sistemi korumak.
Kavramı anlayalım
Hız sınırı, bir istemcinin belirli sürede yapabileceği istek sayısını kısıtlar. Parola deneme, form spam’i ve maliyetli uç noktaların kötüye kullanımına karşı ilk savunmadır. ASP.NET Core’un yerleşik hız sınırlayıcısı sabit pencere, kayan pencere, token kovası ve eşzamanlılık algoritmaları sunar. Sınır aşıldığında 429 Too Many Requests ve mümkünse Retry-After döner. Bu projede giriş, iletişim formu ve analitik uçları ayrı politikalarla korunur.
Zaman aşımı, bir bağımlılığı sonsuza kadar beklememektir. Yanıt vermeyen bir servisi beklemek iş parçacıklarını, bağlantıları ve belleği tüketir; yavaşlık zincir boyunca yayılır. Her dış çağrının makul bir zaman aşımı olmalıdır.
Retry, geçici hataları (anlık ağ kopması, 503) tekrar denemeyle aşar; ama yalnız güvenle tekrarlanabilir (idempotent) işlemlerde ve artan bekleme süreleriyle yapılmalıdır. Aksi halde zaten zorlanan servise yük bindirir. Devre kesici, sürekli hata veren bir bağımlılığa bir süre hiç istek göndermeyerek hem onu hem kendini korur. .NET’te bunlar Microsoft.Extensions.Http.Resilience (Polly) ile birlikte yapılandırılır.
Bir bağımlılığın arızası, korumasız bir sistemde bütün uygulamayı durdurabilir.
Ödeme gibi tekrarlanamaz bir POST’u otomatik retry ile iki kez göndermek.
Bir mektubun şehirdeki yolculuğu
İsteği bir mektup, sunucuyu bir şehir gibi düşün. Senaryo seç, oynat ve mektubun hangi kapıdan geçip nerede durdurulduğunu izle.
Bir bot aynı formu bir dakikada altıncı kez gönderiyor.
Aynı konu. Üç farklı derinlik.
builder.Services.AddRateLimiter(o =>
{
o.RejectionStatusCode = StatusCodes.Status429TooManyRequests;
o.AddFixedWindowLimiter("contact", w => { w.PermitLimit = 5; w.Window = TimeSpan.FromMinutes(1); });
});
[HttpPost, EnableRateLimiting("contact")] public Task<IActionResult> Send(...)Dakikada 5 form gönderimi; aşılırsa istek iş mantığına ulaşmadan 429 alır.
Bu sayfa gerçek bir sunucuya veya veritabanına bağlanmaz. Kod örnekleri .NET 8, Next.js ve SQL Server için temsilîdir; süreler simülasyondaki örnek değerlerdir, ölçüm değildir. Örnekleri yalnız kendi geliştirme ortamında dene; gerçek bağlantı dizesi, token veya parola paylaşma.
Önce kendin dene.
Bir dış döviz kuru servisi zaman zaman 20 saniye yanıt vermiyor ve o anlarda bütün siteniz yavaşlıyor. Üç katmanlı bir koruma öner.
Çözümü ve açıklamasını göster
1) Zaman aşımı: çağrı başına ör. 2 saniye.
2) Devre kesici: art arda hatalarda 30 sn boyunca servisi çağırma.
3) Yedek: son başarılı kuru önbellekten sun ve 'güncellenemedi' notu göster.
(+ isteğe bağlı: arka planda periyodik güncelleme, istek yolundan çıkarma)Yavaş bağımlılık istek yolundan ne kadar uzak tutulursa kullanıcı o kadar az etkilenir.