Merhaba,
Modern web uygulamalarında API’ler, yüksek trafik ve kötü niyetli istekler karşısında korunmalıdır. Bu noktada rate limiting (istek sınırlama) devreye girer. Rate limiting, belirli bir zaman diliminde kullanıcıların yapabileceği istek sayısını sınırlar ve sistemin stabil çalışmasını sağlar.
.NET 8 ile birlikte rate limiting artık native olarak framework içinde destekleniyor, yani ekstra paket kurmadan güçlü ve esnek sınırlamalar oluşturabilirsiniz. Bu yazıda hem temel hem de gelişmiş kullanım örnekleriyle .NET 8 API rate limiting’i detaylı olarak ele alacağım.
Rate Limiting Nedir ve Neden Önemlidir?
Rate limiting, API’ye yapılan istekleri sınırlandırma mekanizmasıdır. Başlıca kullanım amaçları:
-
API sunucusunu aşırı yüklenmeden korumak.
-
DDoS ve brute-force saldırılarına karşı önlem almak.
-
Ücretli planlarda kullanıcı başına kota uygulamak.
Örnek senaryo:
Bir API endpoint’ine saniyede 1000’den fazla istek gelirse, backend çökebilir. Rate limiting ile, her kullanıcı için saniyede 5 istek limiti koyarak sistem stabil kalır.
.NET 8’de Rate Limiting’in Avantajları
Önceki sürümlerde ekstra paketler kullanmak zorundaydık. Artık .NET 8 ile:
-
Middleware üzerinden kolay entegrasyon.
-
Fixed Window, Sliding Window, Token Bucket gibi farklı stratejiler.
-
Endpoint, kullanıcı veya IP bazlı dinamik politikalar.
-
Fazla istek geldiğinde özelleştirilebilir response.
Rate Limiting servisini eklemek
var builder = WebApplication.CreateBuilder(args);
builder.Services.AddRateLimiter(options =>
{
options.AddFixedWindowLimiter("Fixed", limiterOptions =>
{
limiterOptions.PermitLimit = 5;
limiterOptions.Window = TimeSpan.FromSeconds(10);
limiterOptions.QueueProcessingOrder = QueueProcessingOrder.OldestFirst;
limiterOptions.QueueLimit = 2;
});
});
Detaylı Açıklama:
| Parametre | Ne İşe Yarar? | Örnek |
|---|---|---|
PermitLimit |
Window süresi boyunca izin verilen maksimum istek sayısı | 10 saniyede en fazla 5 istek |
Window |
Limitin resetlendiği süre | 10 saniye |
QueueProcessingOrder |
Fazla gelen isteklerin sıraya alınma sırası | OldestFirst → önce gelen önce işlenir |
QueueLimit |
Sıraya alınabilecek maksimum istek | 2 |
Senaryo Örneği:
PermitLimit = 5, QueueLimit = 2, Window = 10 saniye Kullanıcı 0–10. saniyeler arasında 7 istek yaparsa: 5 istek kabul edilir ve 7. istek sıraya alınır istek direkt reddedilir saniyede window resetlenir, yeni 5 istek hakkı verilir
Middleware’i eklemek
app.UseRateLimiter();
-
Bu middleware pipeline’ın başına eklenir ve tanımlı limitleri uygular.
-
Global olarak veya sadece belirli endpoint’lerde kullanılabilir.
Endpoint tanımlamak ve rate limit atamak
Minimal API
app.MapGet("/", () => "Hello World!").RequireRateLimiting("Fixed");
-
Endpoint’e
"Fixed"politikasını uyguladık. -
Farklı endpoint’ler için farklı limitler veya global policy kullanılabilir.
Rate Limiting Stratejileri
Sliding Window Limiter
-
Pencere kaydırmalı limit.
-
Ani trafik patlamalarını daha iyi yönetir.
options.AddSlidingWindowLimiter("Sliding", limiterOptions =>
{
limiterOptions.PermitLimit = 10;
limiterOptions.Window = TimeSpan.FromMinutes(1);
limiterOptions.SegmentsPerWindow = 6;
});
-
1 dakikalık window 6 segment’e bölünür.
-
Her segment kendi içinde istek sayısını sayar ve toplam 10 izni geçemez.
Token Bucket Limiter
-
İstekler token ile kontrol edilir.
-
Tokenler belirli aralıklarla replenish edilir.
options.AddTokenBucketLimiter("TokenBucket", limiterOptions =>
{
limiterOptions.TokenLimit = 20;
limiterOptions.QueueLimit = 5;
limiterOptions.ReplenishmentPeriod = TimeSpan.FromSeconds(30);
limiterOptions.TokensPerPeriod = 5;
});
Senaryo Örneği:
-
TokenLimit = 20 → 20 istek hakkı
-
30 saniyede 5 token eklenir
-
Fazla istek sıraya alınır veya reddedilir
Fazla İstek Durumunda Özel Response
app.UseRateLimiter(new RateLimiterOptions
{
OnRejected = async (context, token) =>
{
context.HttpContext.Response.StatusCode = 429;
await context.HttpContext.Response.WriteAsync(
"Çok fazla istek yaptınız, lütfen bekleyin.",
cancellationToken: token
);
}
});
-
429 HTTP status code: Too Many Requests.
-
Kullanıcıya bilgilendirici mesaj dönülür.
Sonuç
.NET 8 ile API rate limiting artık daha kolay, güvenli ve esnek. Doğru strateji ile API’nizi yüksek trafikte güvenli ve stabil tutabilirsiniz.
Diğer bloglarımda görüşmek üzere 👋