API Hız Sınırlaması Nasıl Uygulanır?

Ashley Innocent

Ashley Innocent

13 March 2026

API Hız Sınırlaması Nasıl Uygulanır?

Kurumsal İçin Apidog

Şirket İçi (On-Premises) Dağıtım

SSO ve RBAC

SOC 2 Uyumlu

Apidog Enterprise'ı Keşfedin

Kısaca

Token bucket veya kayan pencere algoritmalarını kullanarak API oran sınırlaması uygulayın. Standart IETF oran sınırlama başlıklarını (RateLimit-Limit, RateLimit-Remaining, RateLimit-Reset) ve sınırlar aşıldığında 429 Too Many Requests yanıtını döndürün. Modern PetstoreAPI, kullanıcı başına kotalar ve net hata yanıtları ile oran sınırlaması uygulamaktadır.

Giriş

Bir istemci, bir dakika içinde API'nize 10.000 istek gönderir. Veritabanınız çöker. İzleme uyarılarınız tetiklenir. Diğer müşterileriniz API'ye erişemez. Bir saldırı altındasınızdır veya belki de yeniden deneme döngüsünde hatalı bir istemciyle uğraşıyorsunuzdur.

Oran sınırlaması bunu önler. Bir istemcinin belirli bir zaman diliminde yapabileceği istek sayısını sınırlar. Limiti aştıklarında 429 Too Many Requests (Çok Fazla İstek) yanıtını döndürürsünüz. İstemci geri çekilir ve API'niz sağlıklı kalır.

Eski Swagger Petstore, oran sınırlamasını hiç uygulamıyor. Modern PetstoreAPI, standart IETF başlıkları, kullanıcı başına kotalar ve net hata yanıtları ile oran sınırlaması uyguluyor.

💡
REST API'leri oluşturuyorsanız veya test ediyorsanız, Apidog oran sınırlama davranışını test etmenize, oran sınırlama başlıklarını doğrulamanıza ve API'nizin aşırı istekleri doğru şekilde ele aldığından emin olmanıza yardımcı olur. Yüksek hacimli senaryoları simüle edebilir ve oran sınırlama yanıtlarını doğrulayabilirsiniz.
button

Bu rehberde, oran sınırlama algoritmalarını, standart başlıkları ve Modern PetstoreAPI'nin oran sınırlamasını nasıl doğru bir şekilde uyguladığını öğreneceksiniz.

API'lerin Neden Oran Sınırlamasına İhtiyacı Var?

Oran sınırlaması, API'nizi kötüye kullanıma karşı korur ve adil kullanımı sağlar.

Kötüye Kullanıma Karşı Koruma

1. Hizmet Reddi (DoS) saldırıları

Bir saldırgan, API'nizi kullanılamaz hale getirmek için isteklerle boğar. Oran sınırlaması, onların etkisini sınırlar.

2. Kimlik bilgisi doldurma (Credential stuffing)

Saldırganlar binlerce kullanıcı adı/şifre kombinasyonunu dener. Oran sınırlaması, onları yavaşlatır.

3. Veri kazıma (Data scraping)

Botlar tüm veri kümenizi kazır. Oran sınırlaması, kazımayı pratik olmaktan çıkarır.

4. Maliyet kontrolü

API'niz pahalı hizmetleri (AI modelleri, üçüncü taraf API'ler) çağırıyorsa, oran sınırlaması kontrol dışı maliyetleri önler.

Adil Kullanım

1. Bir istemcinin kaynakları tekeline almasını önleyin

Oran sınırlaması olmadan, saniyede 1000 istek yapan bir istemci diğer istemcileri kaynaklardan mahrum bırakabilir.

2. Öngörülebilir performans

Oran sınırlaması, tüm istemciler için tutarlı yanıt süreleri sağlar.

3. Katmanlı erişim

Ücretsiz katman: saatte 100 istek. Ücretli katman: saatte 10.000 istek. Oran sınırlaması bu katmanları uygular.

Operasyonel Faydalar

1. Kapasite planlaması

API'nizin kaldırabileceği maksimum yükü bilirsiniz.

2. Maliyet öngörülebilirliği

Oran sınırlamaları altyapı maliyetlerini sınırlar.

3. Zarif düşüş (Graceful degradation)

Yük altında, oran sınırlaması ardışık arızaları önler.

Oran Sınırlama Algoritmaları

Farklı algoritmaların farklı avantaj ve dezavantajları vardır.

1. Sabit Pencere

Sabit zaman pencerelerindeki istekleri sayar.

Nasıl çalışır:

Pencere 1 (00:00-00:59): 100 isteğe izin verilir
Pencere 2 (01:00-01:59): 100 isteğe izin verilir

Uygulama:

def is_allowed(user_id):
    current_minute = get_current_minute()
    key = f"rate_limit:{user_id}:{current_minute}"
    count = redis.incr(key)
    redis.expire(key, 60)
    return count <= 100

Avantajları:

Dezavantajları:

2. Kayan Pencere

Kaydırılan bir zaman penceresindeki istekleri sayar.

Nasıl çalışır:

01:30'da, 00:30'dan 01:30'a kadar olan istekleri sayar (son 60 dakika).

Uygulama:

def is_allowed(user_id):
    now = time.time()
    window_start = now - 3600  # 1 saat önce
    key = f"rate_limit:{user_id}"

    # Eski istekleri kaldır
    redis.zremrangebyscore(key, 0, window_start)

    # Penceredeki istekleri say
    count = redis.zcard(key)

    if count < 100:
        redis.zadd(key, {now: now})
        redis.expire(key, 3600)
        return True
    return False

Avantajları:

Dezavantajları:

3. Token Kovası (Token Bucket)

Belirli bir hızda kovaya jetonlar eklenir. Her istek bir jeton tüketir.

Nasıl çalışır:

Kova kapasitesi: 100 jeton
Yeniden doldurma hızı: saniyede 10 jeton
İstek: 1 jeton tüketir

Uygulama:

def is_allowed(user_id):
    now = time.time()
    key = f"rate_limit:{user_id}"

    # Mevcut durumu al
    data = redis.hgetall(key)
    tokens = float(data.get('tokens', 100))
    last_refill = float(data.get('last_refill', now))

    # Jetonları doldur
    elapsed = now - last_refill
    tokens = min(100, tokens + elapsed * 10)  # 10 jeton/sn

    if tokens >= 1:
        tokens -= 1
        redis.hset(key, 'tokens', tokens)
        redis.hset(key, 'last_refill', now)
        redis.expire(key, 3600)
        return True
    return False

Avantajları:

Dezavantajları:

4. Sızdıran Kova (Leaky Bucket)

İstekler bir kuyruğa eklenir ve sabit bir hızda işlenir.

Nasıl çalışır:

Kuyruk kapasitesi: 100 istek
İşleme hızı: saniyede 10 istek

Avantajları:

Dezavantajları:

Hangi Algoritma Kullanılmalı?

Çoğu API için: Token Kovası

Endüstri standardıdır, makul ani yüklere izin verir ve düzgün oran sınırlaması sağlar.

Modern PetstoreAPI, kullanıcı başına kotalarla token bucket kullanır.

Standart Oran Sınırlama Başlıkları

IETF standart başlıklarını kullanın (draft-ietf-httpapi-ratelimit-headers).

Standart Başlıklar

RateLimit-Limit: Zaman penceresinde izin verilen maksimum istek sayısı

RateLimit-Limit: 100

RateLimit-Remaining: Mevcut pencerede kalan istek sayısı

RateLimit-Remaining: 45

RateLimit-Reset: Oran sınırlamasının sıfırlanmasına kadar geçen saniye sayısı

RateLimit-Reset: 3600

Örnek Yanıt

GET /pets
200 OK
RateLimit-Limit: 100
RateLimit-Remaining: 99
RateLimit-Reset: 3600

{
  "data": [...]
}

Eski Başlıklar (Kullanımdan Kaldırıldı)

Birçok API standart olmayan başlıklar kullanır:

X-RateLimit-Limit: 100
X-RateLimit-Remaining: 99
X-RateLimit-Reset: 1710331200

Bunları kullanmayın. X- öneki kullanımdan kaldırılmıştır ve formatı standartlaştırılmamıştır.

Modern PetstoreAPI Oran Sınırlamasını Nasıl Uygular?

Modern PetstoreAPI, standart başlıklarla token bucket oran sınırlamasını uygular.

Kademelere Göre Oran Sınırlamaları

Ücretsiz kademe:

Pro kademe:

Kurumsal kademe:

Uygulama

Başarılı istek:

GET /v1/pets
200 OK
RateLimit-Limit: 100
RateLimit-Remaining: 99
RateLimit-Reset: 3540

{
  "data": [...]
}

Oran sınırı aşıldığında:

GET /v1/pets
429 Too Many Requests
Content-Type: application/problem+json
RateLimit-Limit: 100
RateLimit-Remaining: 0
RateLimit-Reset: 120
Retry-After: 120

{
  "type": "https://petstoreapi.com/errors/rate-limit-exceeded",
  "title": "Oran Sınırı Aşıldı",
  "status": 429,
  "detail": "Saatte 100 istek olan oran sınırını aştınız",
  "instance": "/v1/pets",
  "retryAfter": 120,
  "limit": 100,
  "window": "1s"
}

Kullanıcı Başına vs. IP Başına

Kullanıcı başına (kimliği doğrulanmış istekler):

Kullanıcı kimliği veya API anahtarına göre oran sınırlaması. Daha doğru ve adil.

user_id = get_authenticated_user()
is_allowed(user_id)

IP başına (kimliği doğrulanmamış istekler):

IP adresine göre oran sınırlaması. Daha az doğru (paylaşılan IP'ler, VPN'ler) ancak hiçbir şeyden iyidir.

ip_address = request.remote_addr
is_allowed(ip_address)

Modern PetstoreAPI, kimliği doğrulanmış istekler için kullanıcı başına oran sınırlaması ve genel uç noktalar için IP başına oran sınırlaması kullanır.

Oran Sınırlaması Yanıt Formatı

Oran sınırları aşıldığında, 429 yanıtını RFC 9457 hata formatıyla döndürün.

Yanıt Yapısı

{
  "type": "https://petstoreapi.com/errors/rate-limit-exceeded",
  "title": "Oran Sınırı Aşıldı",
  "status": 429,
  "detail": "Oran sınırınızı aştınız. Lütfen daha sonra tekrar deneyin.",
  "instance": "/v1/pets",
  "retryAfter": 120,
  "limit": 100,
  "remaining": 0,
  "reset": 120,
  "window": "1s"
}

Başlıklar

429 Çok Fazla İstek
RateLimit-Limit: 100
RateLimit-Remaining: 0
RateLimit-Reset: 120
Retry-After: 120

Retry-After: İstemcilere ne zaman yeniden deneme yapabileceklerini söyler (saniye cinsinden).

Apidog ile Oran Sınırlarını Test Etme

Apidog, oran sınırlama davranışını test etmenize yardımcı olur.

Test Senaryoları

1. Normal kullanım:

50 istek gönder → Hepsi başarılı
RateLimit-Remaining'in azaldığını kontrol edin

2. Limiti aşma:

101 istek gönder → 101. istek 429 döndürür
Hata yanıt formatını doğrulayın
Retry-After başlığını kontrol edin

3. Sıfırlama davranışı:

Limiti aş → Sıfırlamayı bekle → Limitin geri yüklendiğini doğrula

4. Farklı kademeler:

Ücretsiz kademeyi test et (saatte 100)
Profesyonel kademeyi test et (saatte 10.000)
Sınırların doğru uygulandığını doğrula

Apidog Test Örneği

// Oran sınırlama başlıklarını test et
pm.test("Oran sınırlama başlıkları mevcut", () => {
  pm.response.to.have.header("RateLimit-Limit");
  pm.response.to.have.header("RateLimit-Remaining");
  pm.response.to.have.header("RateLimit-Reset");
});

// Oran sınırı aşıldığında test et
pm.test("Limit aşıldığında 429 döndürür", () => {
  // 101 istek yap
  for (let i = 0; i < 101; i++) {
    pm.sendRequest("GET /v1/pets");
  }
  pm.response.to.have.status(429);
});

Oran Sınırlama En İyi Uygulamaları

1. Standart başlıkları kullanın

Özel X- başlıkları yerine IETF standart başlıklarını kullanın.

2. 403 yerine 429 döndürün

429 "çok fazla istek" anlamına gelir. 403 "yasaklandı" anlamına gelir. Bunları karıştırmayın.

3. Retry-After'ı dahil edin

İstemcilere ne zaman yeniden deneyebileceklerini söyleyin.

4. Limitlerinizi belgeleyin

Oran limitlerini belgelerde görünür hale getirin.

5. Farklı kademeler sağlayın

Ücretsiz kademe: düşük limitler. Ücretli kademe: daha yüksek limitler.

6. IP yerine kullanıcıya göre oran sınırlaması yapın

Kullanıcı başına limitler daha doğru ve adildir.

7. Ani yüklere izin verin

Token bucket, normal kullanımı cezalandırmadan makul ani yüklere izin verir.

8. Oran sınırlaması isabetlerini izleyin

İstemcilerin oran limitlerine ne sıklıkta ulaştığını takip edin. Yüksek oranlar sorunları gösterir.

9. Oran sınırlaması durum uç noktası sağlayın

GET /v1/rate-limit
200 OK
{
  "limit": 100,
  "remaining": 45,
  "reset": 3540
}

10. Oran sınırlamasını test edin

Dağıtımdan önce oran sınırlama davranışını test etmek için Apidog kullanın.

Sonuç

Oran sınırlaması, API'nizi kötüye kullanımdan korur ve adil kullanım sağlar. Standart IETF başlıkları (RateLimit-Limit, RateLimit-Remaining, RateLimit-Reset) ile token bucket algoritmasını kullanın. Sınırlar aşıldığında RFC 9457 hata formatıyla 429 Too Many Requests (Çok Fazla İstek) yanıtını döndürün.

Modern PetstoreAPI, kullanıcı başına kotalar, standart başlıklar ve net hata yanıtları ile oran sınırlamasını doğru bir şekilde uygulamaktadır. Uygulama ayrıntıları için belgeleri kontrol edin.

Oran sınırlamanızın yük altında doğru çalıştığından ve uç durumları düzgün bir şekilde ele aldığından emin olmak için Apidog ile test edin.

button

Sıkça Sorulan Sorular

Hangi oran limitlerini belirlemeliyim?

Muhafazakar başlayın: ücretsiz kademe için saatte 100 istek, ücretli kademe için saatte 10.000 istek. Kullanım modellerine ve altyapı kapasitesine göre ayarlayın.

IP'ye mi yoksa kullanıcıya mı göre oran sınırlaması yapmalıyım?

Kimliği doğrulanmış istekler için kullanıcıya (API anahtarı) göre oran sınırlaması yapın. IP tabanlı oran sınırlamasını yalnızca genel uç noktalar için kullanın.

Bir istemci oran sınırını aşarsa ne olur?

Retry-After başlığı ile 429 Too Many Requests (Çok Fazla İstek) yanıtını döndürün. İstemciyi kalıcı olarak engellemeyin; pencere sıfırlandıktan sonra yeniden denemelerine izin verin.

Webhook'lar için oran limitlerini nasıl yönetirim?

Webhook'lar sunucudan sunucuya olduğundan, oran limitleri daha yüksek olmalıdır. Webhook'lar ve API çağrıları için ayrı limitler düşünün.

Dahili hizmetleri oran sınırlamasına tabi tutmalı mıyım?

Evet, ancak çok daha yüksek limitlerle. Oran sınırlaması, dahili sistemlerde bile ardışık arızaları önler.

Oran sınırlamasını nasıl test ederim?

Birden çok istek göndermek ve 429 yanıtlarını, oran sınırlama başlıklarını ve sıfırlama davranışını doğrulamak için Apidog kullanın.

API'm bir CDN'nin arkasındaysa ne olur?

CDN önbelleğe alma yükü azaltır, ancak önbellek isabetleri ve POST/PUT/DELETE istekleri için yine de oran sınırlamasına ihtiyacınız vardır.

Birden çok sunucuda oran sınırlamasını nasıl uygularım?

Tüm sunucularda oran limitlerini izlemek için paylaşılan bir veri deposu (Redis, Memcached) kullanın. Yerel bellek kullanmayın; dağıtılmış sistemlerde çalışmaz.

API Tasarım-Öncelikli Yaklaşımı Apidog'da Uygulayın

API'leri oluşturmanın ve kullanmanın daha kolay yolunu keşfedin