Bir API için rate limiter nasıl tasarlanır? Hangi algoritmalar kullanılır?
Cevap
Rate limiter, bir istemcinin belirli sürede yapabileceği istek sayısını sınırlar: kötüye kullanımı, brute force'u ve aşırı yükü önler. Limit aşıldığında 429 Too Many Requests ve Retry-After başlığı döner.
Algoritmalar
| Algoritma | Mantık | Artı / Eksi |
|---|---|---|
| Fixed window | Her dakika için sayaç | Basit; pencere sınırında 2 kat patlama olabilir |
| Sliding window log | Her isteğin zaman damgası saklanır | Kesin; bellek yoğun |
| Sliding window counter | İki pencerenin ağırlıklı ortalaması | İyi denge, yaygın |
| Token bucket | Kovaya sabit hızla token eklenir, istek token harcar | Kısa patlamalara izin verir; çok yaygın |
| Leaky bucket | İstekler kuyruktan sabit hızla çıkar | Çıkışı düzleştirir |
Dağıtık uygulama
Birden fazla sunucu olduğunda sayaç ortak bir yerde, genelde Redis'te tutulur:
// Fixed window: kullanıcı başına dakikada 100 istek
async function allow(userId) {
const key = `rl:${userId}:${Math.floor(Date.now() / 60000)}`;
const count = await redis.incr(key);
if (count === 1) await redis.expire(key, 60);
return count <= 100;
}Token bucket gibi çok adımlı mantıkta yarış durumunu önlemek için işlem Lua script ile atomik yapılır.
Tasarım kararları
- Anahtar: kullanıcı ID, API key veya IP (girişsiz istekler için).
- Nerede: API gateway (Nginx, Kong, Cloudflare) veya uygulama middleware'i.
- Redis erişilemezse: fail-open (izin ver) mi fail-closed mu, kararı açıkça verilmeli.
- Yanıtta
X-RateLimit-Remaininggibi başlıklarla istemciye bilgi verilir.
İlgili Sistem Tasarımı soruları
- Dikey ve yatay ölçekleme arasındaki fark nedir?
- Hangi cache stratejilerini biliyorsunuz?
- REST ile GraphQL arasındaki farklar nelerdir?
- Bit.ly benzeri bir URL kısaltma servisi tasarlayın.
- Google Docs benzeri gerçek zamanlı ortak düzenleme yüksek seviyede nasıl tasarlanır?
- CDN nedir, nasıl çalışır ve hangi durumlarda kullanılır?
Bu konuda başka bir soru biliyor musun?
Mülakatta karşılaştığın soruları ekle, onaylandıktan sonra yayına alınsın.