API Rate Limiting: Token Bucket mı Sabit Pencere mi?
API Rate Limiting Nedir ve Neden Önemlidir?
API rate limiting, sunucuların belirli bir zaman diliminde bir istemciden kabul edeceği istek sayısını kontrol etme mekanizmasıdır. Bir web hizmetinin aşırı yüklenmesini önlemek, kötü niyetli erişimleri durdurmak ve kaynakları adil şekilde dağıtmak için kullanılır. Ancak bu işlemi gerçekleştirmenin birden fazla yöntemi vardır ve her birinin farklı avantaj ve dezavantajları bulunmaktadır.
Bir API'yi tasarlarken karşılaşacağınız temel soru şudur: Hangi algoritmayı kullanmalıyım? Token bucket ve sabit pencere (fixed window), en yaygın iki yaklaşımdır. Her ikisi de farklı senaryolarda farklı performans gösterir ve seçim, sistemin ihtiyaçlarına bağlı olarak değişir.
Sabit Pencere (Fixed Window) Algoritması
Sabit pencere yöntemi, zamanı eşit parçalara bölüp her parçada belirli sayıda isteğe izin verme mantığıyla çalışır. Örneğin, "her dakikada 100 istek" kuralı uygulanırsa, sistem 60 saniyelik zaman dilimleri oluşturur ve her dilimde sayaç sıfırlanır.
Sabit Pencere'nin Avantajları
- Kolay uygulanır: Basit bir sayaç ve zaman damgası mekanizması yeterlidir
- Düşük bellek kullanımı: Hesaplamalar minimal kaynakla yapılır
- Hızlı işlem: Kontrol noktalarında minimum gecikme oluşur
- Tahmin edilebilirdir: Kullanıcı ne kadar istek gönderebileceğini kolaylıkla anlayabilir
Sabit Pencere'nin Dezavantajları
- Pencere sınırında yoğunlaşma (burst attack): Kullanıcı limit değerinin tamamını pencere sonunda gönderebilir, hemen ardından yeni pencerede tekrar gönderebilir. Bu durumda, çok kısa sürede çift miktarda istek işlenir
- DDoS koruması zayıfdır: Koordineli saldırılar, pencere geçişlerinde kötü niyetli istekleri artırabilir
- Adil dağıtım sağlamaz: Erken bağlanan kullanıcı, geç bağlanan kullanıcıdan daha fazla hak elde eder
Token Bucket Algoritması
Token bucket yöntemi, bir kova içinde belirli sayıda token (jeton) olduğunu hayal eder. Her istek bir token tüketir ve belirli hızda yeni tokenler kovaya eklenir. Kova dolduğunda yeni token eklenmez, bu da üst sınırı garanti eder.
Token Bucket'ın Avantajları
- Daha adil dağıtım: Token yenileme hızı sabit olduğundan, uzun sürede tüm kullanıcılar eşit hak elde eder
- Patlama (burst) için esneklik: Birikmiş tokenler, geçici ani trafiğe cevap vermek için kullanılabilir. Böylece meşru kullanıcılarla kötü niyetli istekler arasında fark oluşur
- DDoS koruması daha etkilidir: Saldırganın tüm tokenları tüketmesi, uzun bir süre beklemesine neden olur
- Esnektir: Token ekleme hızını dinamik olarak değiştirerek farklı kullanıcılara farklı limitler verilebilir
Token Bucket'ın Dezavantajları
- Daha karmaşıktır: Zaman hesaplamaları, token yönetimi ve kova durumu takibi gerekir
- Daha fazla bellek kullanır: Her kullanıcı veya API anahtarı için token durumu saklanmalıdır
- Kullanıcıya açık değildir: Kaç token kaldığını görmek kolay değildir
Karşılaştırma Tablosu
| Kriter | Sabit Pencere | Token Bucket |
|---|---|---|
| Uygulanma Zorluğu | Çok kolay | Orta düzey |
| Bellek Tüketimi | Çok düşük | Düşük-orta |
| DDoS Koruması | Zayıf | Güçlü |
| Adillik | Düşük | Yüksek |
| Burst İzni | Kontrolsüz | Kontrollü |
| Öngörülebilirlik | Yüksek | Orta |
Seçim Kriterleri: Sizin İçin Hangisi Uygun?
Sabit pencereyi seçin eğer: İç ağda çalışan, güvenilir kullanıcılarla işlem yapıyorsanız; sistem basit olmalıysa; ve tahmin edilebilirlik önemliyse.
Token bucket seçin eğer: Halka açık bir API sunuyorsanız; DDoS tehdidi varsa; farklı kullanıcılara farklı limitler vermek istiyorsanız; ve kısa süreli trafik artışlarına izin vermek istiyorsanız.
Çoğu modern API yönetim platformu token bucket yaklaşımını tercih eder çünkü güvenlik ile esnekliği dengeler. Ancak sistemin mimarisi, beklenen yük ve güvenlik gereksinimleriniz final kararı belirler. Her iki yöntemi pilot ortamda test etmek, hangisinin iş gereksinimlerinize daha iyi uyduğunu gösterecektir.