Aşırı istekleri nasıl kontrol ediyoruz?
Rate Limiting (İstek Sınırlandırma) ile sistemi aşırı yüklenmeden koruyoruz. Bir kullanıcı veya bot dakikada çok fazla istek atarsa geçici olarak engellenir.
Trafik ışığı gibi düşünün: Herkes aynı anda geçmeye çalışırsa trafik kilitlenir. Biz her kullanıcıya dakikada belirli sayıda "geçiş hakkı" veriyoruz. Hakkını kullanan beklemek zorunda.
Dakikada 60 istek
Dakikada 30 istek
5 deneme / 15 dk
Kullanıcı bir sayfaya veya API'ye istek gönderir.
Redis'te bu IP/kullanıcı için kaç istek yapıldığı kontrol edilir.
İstek sayısı < Limit mi? Evet → Geç. Hayır → Bekle.
İstek işlenirse sayaç +1, dakika dolunca sıfırlanır.
İstek işlenir, sayfa yüklenir. Kalan hak: 59/60
429 Too Many Requests hatası, X saniye bekle mesajı.
Her istek geldiğinde sistem sayaç kontrol eder ve limiti aşan istekleri engeller. İşte bu süreçte gerçekleşen teknik adımlar:
İstek geldiğinde IP adresi ve/veya user_id ile istemci tanımlanır. $request->ip() veya auth()->id() kullanılır.
Redis::get("rate:{$key}") ile mevcut istek sayısı çekilir. Redis, yüksek performanslı in-memory veritabanı olarak sayaçları tutar.
RateLimiter::hit($key) ile sayaç artırılır ve $limit = 60 ile karşılaştırılır. Sayaç < Limit ise geçiş izni verilir.
Sayaç EXPIRE ile 60 saniye sonra otomatik sıfırlanır. Her dakika başında kullanıcı yeni 60 hak kazanır.
Sayaç >= Limit ise abort(429) çağrılır. Response header'da Retry-After: X saniye bilgisi döner.
Her response'ta X-RateLimit-Limit: 60, X-RateLimit-Remaining: 58 header'ları eklenir.
(İstek Sınırlandırma)
Belirli sürede yapılabilecek istek sayısını sınırlamak.
(Çok Fazla İstek)
Limit aşıldığında dönen HTTP hata kodu.
(Distributed Denial of Service)
Sistemi çökertmek için binlerce istek gönderme saldırısı.
(Kısıtlama)
Rate limiting'in teknik adı. Hız kısıtlayıcı.