API rate limiting, sunucu kaynaklarını korumak ve adil kullanım sağlamak için kritik bir tekniktir. Hangi algoritmanın seçileceği, uygulamanın ihtiyaçlarına ve trafik desenlerine bağlıdır. Bu yazıda, en yaygın üç algoritma olan Token Bucket, Leaky Bucket ve Fixed Window'u karşılaştırıyor, her birinin güçlü ve zayıf yönlerini örneklerle açıklıyoruz.
Token Bucket Algoritması: Esnek ve Patlama Dostu
Token Bucket algoritması, sabit hızda jeton (token) üreten bir kova (bucket) kullanır. Her istek bir jeton tüketir; kova boşaldığında istek reddedilir. Maksimum kova boyutu, ani trafik patlamalarına (burst) izin verirken uzun vadede ortalama hızı sınırlar.
- Avantajları: Patlamalara izin verir, kısa süreli trafik artışlarını tolere eder.
- Dezavantajları: Kova boyutu ve jeton üretim hızının doğru ayarlanması gerekir; aksi takdirde bellek tüketimi artabilir.
Leaky Bucket Algoritması: Sabit Çıkış Hızı ile Dengeli Trafik
Leaky Bucket, istekleri bir kuyruğa alır ve sabit hızda işler. Kova sızdıran bir kap gibidir: su ne kadar hızlı girerse girsin, çıkış sabittir. Bu, trafiği düzleştirir (smoothing) ve ani patlamaları önler.
- Avantajları: Trafik düzgün dağılır, sunucu üzerindeki ani yük azalır.
- Dezavantajları: Kuyruklama gecikmesine neden olabilir; gerçek zamanlı sistemler için uygun olmayabilir.
Fixed Window Algoritması: Basit ve Anlaşılır
Fixed Window, zamanı sabit pencerelere (örneğin her dakika) böler ve her pencerede belirli sayıda isteğe izin verir. Pencere sıfırlandığında sayaç sıfırlanır.
- Avantajları: Uygulaması kolay bellek kullanımı düşük.
- Dezavantajları: Pencere sınırında trafik patlamaları olabilir (örneğin dakika başında herkes istek gönderirse).
Karşılaştırma Tablosu
| Özellik | Token Bucket | Leaky Bucket | Fixed Window |
|---|---|---|---|
| Patlama (Burst) Desteği | Evet | Kısmen (kuyruk) | Hayır |
| Trafik Düzleştirme | Hayır | Evet | Hayır |
| Uygulama Zorluğu | Orta | Yüksek | Düşük |
| Maliyet (Bellek) | Düşük-Orta | Yüksek (kuyruk) | Çok Düşük |
| Adillik | Yüksek | Orta | Düşük |
Hangi Durumda Hangi Algoritmayı Seçmelisiniz?
Gerçek Zamanlı ve Düşük Gecikme Gereksinimi Olan Uygulamalar
Token Bucket, ani trafik artışlarına izin verdiği için sosyal medya API'leri veya haber akışı servisleri gibi patlama dostu sistemlerde idealdir. Token Bucket'ı JWT token yönetimi ile entegre ederek güvenli ve esnek bir yapı kurabilirsiniz.
Stabil ve Öngörülebilir Trafik İsteyen Sistemler
Leaky Bucket, veritabanı yazma işlemleri veya dosya yükleme gibi kaynak yoğun işlemlerde kullanılmalıdır. Trafiği düzleştirerek sunucunun aşırı yüklenmesini engeller.
Basit ve Düşük Maliyetli Çözüm Arayanlar
Fixed Window, prototip veya düşük trafikli API'ler için yeterlidir. Ancak yüksek trafikte pürüzlere neden olabilir. Bu durumda, Axios Interceptor ile HTTP hata yönetimi kullanarak rate limit hatalarını istemci tarafında ele alabilirsiniz.
Rate Limiting Uygularken Sık Yapılan Hatalar
- Pencere sınırlarını yanlış ayarlamak: Fixed Window'da dakika başına 100 istek limiti koymak, pencere sonunda patlamalara yol açar. Daha iyi bir yaklaşım için Token Bucket veya Sliding Window kullanın.
- Kullanıcıları bilgilendirmemek: Rate limit aşıldığında
429 Too Many Requestsdönmek yeterli değildir; Retry-After başlığı ekleyin ve hata mesajında bilgilendirme yapın. - İstemci tarafında işlem yapmamak: Kullanıcıların limiti aştığında uygun şekilde uyarılması gerekir. Örneğin, React'te AbortController ile otomatik iptal mekanizması kurulabilir.
Örnek Uygulama: Node.js ile Token Bucket
Aşağıdaki kod parçası, Node.js'te basit bir Token Bucket implementasyonunu göstermektedir:
class TokenBucket {
constructor(capacity, fillRate) {
this.capacity = capacity;
this.tokens = capacity;
this.lastRefill = Date.now();
this.fillRate = fillRate; // token per second
}
consume(tokens = 1) {
this.refill();
if (this.tokens - tokens >= 0) {
this.tokens -= tokens;
return true;
}
return false;
}
refill() {
const now = Date.now();
const elapsed = now - this.lastRefill;
const refillTokens = (elapsed * this.fillRate) / 1000;
this.tokens = Math.min(this.capacity, this.tokens + refillTokens);
this.lastRefill = now;
}
}
Bu algoritmayı bir API middleware'i olarak kullanabilirsiniz. Unutmayın, dağıtık sistemlerde Redis gibi merkezi bir veri deposu kullanmanız gerekir.
Sonuç: Doğru Algoritma ile API Performansınızı Koruyun
API rate limiting algoritmaları arasında sihirli bir formül yoktur. Uygulamanızın ihtiyaçlarını analiz edin: Patlama toleransı, trafik deseni, sistem kaynakları ve adillik gereksinimleri. Token Bucket esneklik, Leaky Bucket kararlılık, Fixed Window ise basitlik sunar. Gerektiğinde hibrit çözümler de değerlendirebilirsiniz. Rate limit stratejinizi düzenli olarak gözden geçirin ve güncelleyin.
Sık Sorulan Sorular
Token Bucket algoritması nedir ve ne zaman kullanılmalıdır?
Token Bucket, sabit hızda jeton üreten ve ani patlamalara izin veren bir rate limiting algoritmasıdır. Özellikle trafik patlamalarının beklendiği sosyal medya API'leri veya haber servislerinde idealdir.
Leaky Bucket ile Token Bucket arasındaki temel fark nedir?
Leaky Bucket istekleri sabit hızda işler ve trafiği düzleştirir; Token Bucket ise patlamalara izin verir. Leaky Bucket daha kararlı bir çıkış sağlar ancak kuyruklama gecikmesine neden olabilir.
Fixed Window algoritmasının zayıf yönü nedir?
Fixed Window, pencere sınırlarında trafik patlamalarına neden olabilir. Örneğin dakika başında tüm kullanıcılar istek gönderirse sunucu aşırı yüklenebilir. Bu sorunu çözmek için Sliding Window veya Token Bucket kullanılabilir.
Rate limiting uygularken en sık yapılan hata nedir?
En sık yapılan hata, kullanıcıları rate limit aşımı konusunda bilgilendirmemek ve doğru HTTP başlıklarını (Retry-After, RateLimit-Remaining) eklememektir. Ayrıca istemci tarafında işlem yapılmaması da yaygın bir hatadır.
Rate limiting algoritmasını dağıtık sistemlerde nasıl uygulamalıyım?
Dağıtık ortamlarda Redis gibi merkezi bir veri deposu kullanarak sayaçları veya jeton durumunu senkronize edin. Her sunucu örneği aynı rate limit bilgisine sahip olursa tutarlılık sağlanır.






