REST API'lerinizin güvenilirliğini ve performansını korumak için rate limiting (hız sınırlama) kritik bir araçtır. Kötü niyetli saldırılardan kaynaklanan DDoS trafiği veya hatalı istemci davranışları, sunucunuzu aşırı yükleyerek hizmet kesintilerine yol açabilir. Rate limiting, her bir istemcinin belirli bir zaman diliminde yapabileceği istek sayısını sınırlayarak API'nizin adil bir şekilde kullanılmasını sağlar ve kaynakları korur.
Neden Rate Limiting Kullanmalısınız?
Rate limiting sadece güvenlik değil, aynı zamanda kullanıcı deneyimi ve maliyet yönetimi için de önemlidir. Aşırı istek alan bir API, yanıt sürelerinin artmasına, zaman aşımlarına ve hatta çökmelere neden olabilir. Ayrıca, ücretli API'lerde kullanım kotalarını uygulamak için rate limiting gereklidir. Örneğin, bir medya paylaşım platformu, ücretsiz kullanıcıların dakikada 10 istek yapmasına izin verirken, premium kullanıcılara daha yüksek limitler tanıyabilir.
Rate limiting, aynı zamanda veri bütünlüğünü de korur. İstemcinin çok hızlı istek göndermesi durumunda, yarış koşulları (race conditions) ortaya çıkabilir. Bu nedenle, API caching stratejileri ile birlikte rate limiting uygulamak, daha sağlam bir sistem oluşturur.
Yaygın Rate Limiting Algoritmaları
Her biri farklı kullanım senaryolarına uygun dört ana algoritma vardır: Token Bucket, Leaky Bucket, Fixed Window ve Sliding Window.
1. Token Bucket (Jeton Kovası)
En popüler algoritmalardan biridir. Sabit oranda kovaya jeton eklenir. Her istek bir jeton tüketir. Kova boşsa istek reddedilir. Bu algoritma, ani trafik patlamalarına (burst) izin verirken ortalama hızı sınırlar. İsteklerin eşit aralıklarla gelmesi gerekmediğinden kullanıcı dostudur.
2. Leaky Bucket (Sızdıran Kova)
Token Bucket'a benzer, ancak istekleri sabit bir hızda işler. Kova, sızdıran bir kova gibi sabit hızda boşalır. Gelen istekler kova boyutunu aşarsa reddedilir. Bu algoritma, trafiği yumuşatmak için idealdir, ancak burst'lere izin vermez.
3. Fixed Window (Sabit Pencere)
Belirli bir zaman diliminde (örneğin 1 dakika) yapılabilecek maksimum istek sayısını belirler. Pencere sonunda sayaç sıfırlanır. Basit ve uygulaması kolaydır, ancak pencere sınırlarında ani yük artışlarına neden olabilir. Örneğin, bir kullanıcı dakikanın son saniyesinde 100 istek gönderip bir sonraki dakikanın ilk saniyesinde tekrar 100 istek gönderebilir.
4. Sliding Window (Kayan Pencere)
Fixed Window'un dezavantajını giderir. Zamanı daha küçük dilimlere böler ve kaydırarak limiti hesaplar. Örneğin, 1 saatlik limit 3600 istek ise, herhangi bir 1 saatlik pencerede 3600 isteği geçemezsiniz. Daha doğru bir sınırlama sağlar.
Rate Limiting Uygulama Kontrol Listesi
Aşağıdaki adımları uygulayarak API'nize etkili bir rate limiting mekanizması ekleyebilirsiniz.
- Hedeflerinizi Belirleyin: API'nizin hangi kaynakları korumak istediğini tanımlayın. Tüm uç noktalar aynı limitle sınırlanmalı mı, yoksa farklı limitler mi uygulanacak?
- Algoritma Seçimi: Kullanım senaryonuza uygun algoritmayı seçin. Token Bucket genelde en iyi dengeyi sunar.
- İstemci Tanımlama: API anahtarı, JWT token veya IP adresi gibi bir tanımlayıcı kullanın. Bu konuda JWT token yönetimi makalesi yol gösterici olabilir.
- Depolama Altyapısı: Sayaçları nerede tutacağınıza karar verin. Redis gibi hızlı bir in-memory veri tabanı, dağıtık sistemler için idealdir.
- HTTP Başlıkları: Rate limit durumunu istemciye iletmek için standart başlıkları ekleyin:
X-RateLimit-Limit,X-RateLimit-Remaining,X-RateLimit-Reset. - Hata Yanıtları: Limit aşıldığında 429 Too Many Requests durum kodunu döndürün ve
Retry-Afterbaşlığıyla bekleme süresini belirtin. - Test Edin: Yük testleri yaparak limitlerinizin doğru çalıştığını ve beklenen davranışı sergilediğini doğrulayın.
- İzleme ve Güncelleme: Rate limiting istatistiklerini izleyin ve gerektiğinde limitleri ayarlayın.
Pratik İpuçları
Rate limiting uygularken dikkat edilmesi gereken bazı noktalar vardır:
- Kademeli Limit: Farklı kullanıcı rollerine veya abonelik seviyelerine göre farklı limitler uygulayın.
- Dağıtık Sistemler: Birden fazla sunucunuz varsa, sayaçların tutarlı olduğundan emin olun. Redis Cluster veya benzeri bir çözüm kullanın.
- Retry Stratejileri: Retry stratejileri ile rate limiting arasında uyum olmalıdır. İstemciler, 429 yanıtı aldıklarında
Retry-Afterbaşlığına uygun bir süre beklemelidir. - Kullanıcıya Geri Bildirim: Limit tükenmek üzereyken uyarı başlıkları ekleyerek kullanıcının davranışını ayarlamasına olanak tanıyın.
- Webhook'lar: Webhook entegrasyonlarında da rate limiting uygulayın, aksi halde aşırı yüklenen bir webhook tüm sistemi etkileyebilir.
Sık Yapılan Hatalar
- Tek Tip Limit: Tüm uç noktalara aynı limiti uygulamak. Log alma gibi hafif işlemler ile veri yazma gibi ağır işlemler farklı limitlere sahip olmalıdır.
- IP Bazlı Limit: Aynı ağdaki kullanıcılar aynı IP'yi paylaşabilir. API anahtarı gibi daha spesifik bir tanımlayıcı tercih edin.
- Sayaçları Uzun Süre Tutmak: Eski sayaçları temizleyerek bellek tüketimini azaltın.
- Test Etmemek: Limitlerin yanlış uygulanması, gerçek kullanıcıları engellemenize neden olabilir.
Rate limiting, API yönetiminin olmazsa olmaz bir parçasıdır. Doğru uygulandığında hem sunucunuzu korur hem de kullanıcılarınıza adil bir ortam sunar. Yukarıdaki kontrol listesini takip ederek kendi rate limiting çözümünüzü kolayca hayata geçirebilirsiniz.
Sık Sorulan Sorular
Rate limiting ve throttling arasındaki fark nedir?
Rate limiting, belirli bir sürede yapılabilecek istek sayısını sınırlarken; throttling, aşırı yüklenmeyi önlemek için isteklerin hızını veya kaynak kullanımını kontrol eder. Genelde throttling daha geniş bir kavramdır ve rate limiting'i de içerebilir.
Rate limiting için en iyi algoritma hangisidir?
Token Bucket algoritması çoğu senaryoda en iyi dengeyi sunar. Ani trafik patlamalarına izin verirken ortalama hızı sınırlar. Ancak sabit hızda işleme ihtiyacınız varsa Leaky Bucket daha uygundur.
Rate limit aşıldığında hangi HTTP durum kodu kullanılmalı?
429 Too Many Requests durum kodu kullanılmalıdır. Ayrıca yanıt başlığına Retry-After eklenerek istemcinin ne kadar beklemesi gerektiği belirtilmelidir.
Dağıtık bir sistemde rate limiting nasıl uygulanır?
Redis gibi merkezi bir sayaç deposu kullanmak en yaygın yöntemdir. Her sunucu aynı Redis örneğine bağlanarak sayaçları atomik olarak artırır. Bu sayede tüm sunucular tutarlı limitleme yapabilir.
API kullanıcılarına rate limit bilgisini nasıl iletirim?
Standart HTTP başlıkları ile iletebilirsiniz: X-RateLimit-Limit (toplam limit), X-RateLimit-Remaining (kalan istek sayısı) ve X-RateLimit-Reset (limit sıfırlanana kadar geçen süre).






