ASP.NET Core'da rate limiting: dört algoritma ve kod örnekleri
ASP.NET Core'un yerleşik rate limiter'ı için fixed window, sliding window, token bucket ve concurrency limiter algoritmalarını karşılaştıran bir rehber. Her algoritmanın aynı trafik altında nasıl davrandığı ve hangi endpoint için uygun olduğu anlatılıyor. API'nizi kötü niyetli veya hatalı istemcilere karşı korumak isteyen .NET geliştiricileri için pratik bir başvuru.
Kilit noktalar
- AddRateLimiter ile politikaları tanımlayıp UseRateLimiter'ı UseAuthentication ve UseAuthorization'dan sonra ekleyin; böylece kullanıcı claim'leri kullanılabilir olur.
- Fixed window, login gibi uçlar için ucuz ve basittir; ancak pencere sınırında iki katına kadar istek geçebilir.
- Sliding window, SegmentsPerWindow ile pencereyi bölerek sınır patlamasını önler; 6 ila 10 segment makul bir aralıktır.
- Token bucket, TokenLimit ve TokensPerPeriod ile arama gibi kısa patlamalara izin veren ortalama bir hız tanımlar.
- Concurrency limiter, PermitLimit kadar isteğin aynı anda çalışmasına izin verir; yavaş raporlama uçları için uygundur.
- AddFixedWindowLimiter tek bir sayaç paylaştırır; istemci bazında sınır için partitioning kullanın.
Rate limiting, bir istemcinin belirli bir sürede yapabileceği iş miktarını sınırlayan kuraldır. Kötüye kullanımı, hatalı retry döngülerini ve adaletsiz kaynak tüketimini engeller. ASP.NET Core bu özelliği .NET 7 ile birlikte çerçevenin içine aldı; algoritmalar System.Threading.RateLimiting, middleware ise Microsoft.AspNetCore.RateLimiting namespace'lerinde bulunuyor ve ek NuGet paketi gerektirmiyor.
Yazar dört algoritmayı benzetmelerle ve örnek kodla anlatıyor. Fixed window belirli bir süre penceresinde sayaç tutar ve pencere sınırında iki katına kadar patlamaya izin verebilir. Sliding window pencereyi segmentlere böler ve bu sorunu giderir. Token bucket, ortalama hızı ve izin verilen ani patlamayı ayrı ayrı modeller. Concurrency limiter ise zamana değil, aynı anda çalışan istek sayısına bakar. Her biri için AddXxxLimiter seçenekleri ve kullanım önerileri ayrıntılı verilmiş. Tam kod örnekleri ve zaman çizelgeleri için orijinal yazıya bakmanız önerilir.
Gerçek dünyada kullanımı
- Login ve şifre sıfırlama uçlarını brute-force saldırılarına karşı korumak için fixed window kullanmak.
- Ürün kataloğu gibi herkese açık okuma API'lerinde dakikada N isteği tam olarak uygulamak için sliding window kullanmak.
- Ücretsiz ve ücretli planlar arasında farklı kota ve yenileme hızı tanımlayan bir SaaS API'si.
- PDF veya CSV üreten, yapay zeka modeline çağrı yapan ağır endpoint'leri aynı anda çalışan istek sayısıyla sınırlamak.
Neden önemli
Doğru algoritmayı endpoint'in gerçek trafik ve maliyet profiline göre seçmek, hem veritabanınızı hem de thread pool'unuzu tek bir hatalı istemciden korur. Politikaları ve partitioning'i baştan doğru kurmak, sonradan kullanıcılara yanlış 429 hataları dönmesini önler.