Rate Limiting Nedir? API'ler Neden İstekleri Sınırlar?
Rate limiting nedir, neden gerekir ve hangi algoritmalar kullanılır? 429 hatası, Retry-After, token bucket ve gerçek API senaryolarıyla öğrenin.
Rate Limiting Nedir?
Rate limiting, belirli bir süre içinde bir istemcinin gönderebileceği istek sayısını sınırlandırma tekniğidir. Basitçe: "1 dakikada en fazla 100 istek" gibi bir kural tanımlarsınız ve sınır aşılırsa API yeni istekleri geçici olarak reddeder.
Bu yaklaşım yalnızca saldırılara karşı bir kalkan değildir; aynı zamanda sistemi dengede tutar, tek bir kullanıcının tüm kaynakları tüketmesini engeller ve öngörülebilir performans sağlar.
Kısa cevap
Rate limiting, API'nizi korur, kaynakları adil paylaştırır ve maliyetleri kontrol altında tutar.
API'ler Neden İstekleri Sınırlar?
- Kötüye kullanımı önlemek: Brute-force, spam veya bot trafiği sınırsız bırakılmaz.
- Hizmet sürekliliği: Ani trafik dalgasında tüm kullanıcılar için sistem ayakta kalır.
- Adil kullanım: Bir istemci tüm kapasiteyi tüketemez.
- Maliyet kontrolü: Özellikle AI veya üçüncü parti API çağrılarında fatura patlaması önlenir.
- Çok kiracılı mimari: Tenant bazlı kota ile izole performans sunulur.
Sınır Aşılırsa Ne Olur?
Yaygın davranış, 429 Too Many Requests dönmektir. Çoğu API ayrıca ne zaman tekrar denemeniz gerektiğini belirtir:
HTTP/1.1 429 Too Many Requests
Retry-After: 30
Content-Type: application/json
{
"error": "rate_limit_exceeded",
"message": "30 saniye sonra tekrar deneyin"
}
Retry-After değeri saniye veya tarih olabilir. İstemci tarafında bu bilgiye saygı duymak, gereksiz tekrarları ve bloklanmayı azaltır.
En Yaygın Rate Limiting Algoritmaları
| Algoritma | Nasıl çalışır? | Artı / Eksi |
|---|---|---|
| Fixed Window | Her zaman diliminde sabit istek limiti | Basit ama pencere sınırında ani patlama olabilir |
| Sliding Window | Kayan zaman aralığında hesaplama | Daha adil, uygulaması biraz daha karmaşık |
| Token Bucket | Kovadaki token kadar istek, tokenlar zamanla dolar | Burst trafiği kontrollü destekler |
Neye Göre Sınır Koyulur?
"Kullanıcı başına" tek seçenek değildir. İhtiyaca göre anahtar değişir:
- IP adresi
- API key
- Kullanıcı ID / tenant ID
- Endpoint bazlı (ör.
/logindaha sıkı) - Plan bazlı (free/pro/enterprise)
Basit Uygulama Örneği (Node.js)
import rateLimit from "express-rate-limit";
const limiter = rateLimit({
windowMs: 60 * 1000, // 1 dakika
max: 100, // dakikada 100 istek
standardHeaders: true,
legacyHeaders: false,
message: { error: "rate_limit_exceeded" },
});
app.use("/api", limiter);
Gerçek sistemlerde bu sayaçların dağıtık ortamda tutarlı olması gerekir. Tek sunucuda memory store yeterli olabilir; çok instance yapıda Redis gibi merkezi bir katman tercih edilir.
İstemci Tarafı İçin Kısa İpuçları
429için exponential backoff uygulayın.Retry-Aftervarsa öncelikle onu kullanın.- Aynı isteği gereksiz tekrar eden UI davranışlarını azaltın (debounce/throttle).
- Mümkünse sonuçları cacheleyin.
Sık Yapılan Hatalar
- Tüm endpoint'lere aynı limit: Login ile public feed aynı profil olmayabilir.
- Sadece IP bazlı koruma: NAT/kurumsal ağlarda adil olmayabilir.
- 429 dönüp yönlendirme vermemek: Retry stratejisi olmayan istemci sürekli çakılır.
- Sadece uygulama katmanında düşünmek: API gateway/CDN seviyesinde de limit önemlidir.
Sonuç
Rate limiting, "kullanıcıyı engelleme" değil, sistemi sürdürülebilir ve adil tutma mekanizmasıdır. Doğru limit, doğru anahtar ve doğru hata davranışı bir araya geldiğinde hem güvenlik hem performans tarafında ciddi fark yaratır.