API Hız Sınırlamasının Açıklaması: Algoritmalar, Başlıklar ve 429 Hatalarının Ele Alınması

  1. Ana sayfa
  2. Blog
  3. Yazılım Geliştirme

Yazılım Geliştirme

API Hızı Sınırlamanın Açıklaması: Algoritmalar, Başlıklar ve 429 Hatalarının Ele Alınması

Hız sınırları, API’leri aşırı yüklemeye ve kötüye kullanıma karşı korur. Çalıştırdığımız bir simülasyonu kullanarak ana algoritmaların nasıl davrandığını, iyi bir 429 yanıtının nasıl göründüğünü ve müşterilerin nasıl geri adım atması gerektiğini öğrenin.

8 dk okuma
API hız sınırlamasının açıklaması: algoritmalar, başlıklar ve 429 hatanın işlenmesi

Önemli noktalar

  • Hız sınırlaması, bir müşterinin belirli bir süre içinde yapabileceği istek sayısını sınırlar.
  • Jeton kümesi ortalama bir oranı zorunlu kılarken kısa patlamalara izin verir.
  • Basit bir sabit pencere, pencere sınırındaki sınırın iki katına çıkmasına izin verebilir.
  • Bir Retry-After başlığıyla 429 Çok Fazla İstek döndürün ve istemcilerin titremeyle geri adım atmalarını sağlayın.

Hatalı bir komut dosyası, API’nizi sıkı bir döngüde çağırır. Sınırsız bir şekilde, diğer tüm kullanıcılar için hizmeti yavaşlatabilir veya büyük bir bulut faturasına neden olabilir. API hız sınırlaması, tek bir müşterinin adil payından fazlasını almasını engelleyen bir korumadır.

Yaygın algoritmaların nasıl davrandığını göstermek için küçük Python versiyonları yazdık ve bunları simüle edilmiş istek zamanlamalarıyla besledik. Aşağıdaki çıktılar bu çalıştırmadan geliyor. Bunlar üretim kodunu değil modelleri öğretiyorlar ve gerçek ağ geçitleri daha fazla özelliğe sahip.

Hız sınırlaması nedir?

Hız sınırlama, istemci başına istekleri sayar ve kabul edilen bir sınırın (örneğin, dakikada 100 istek) üzerindeki istekleri reddeder veya geciktirir. İlgili bir fikir olan kısma, genellikle istekleri reddetmek yerine yavaşlatmak anlamına gelir. Kota genellikle daha uzun bir süre boyunca verilen daha büyük bir ödenektir (örneğin, bir fiyatlandırma planında ayda 10.000 çağrı).

API’lerin buna neden ihtiyacı var?

  • Kararlılık: trafik artışları veritabanlarını veya aşağı yöndeki hizmetleri zorlayamaz.
  • Adillik: ağır bir müşteri diğerlerini aç bırakamaz.
  • Güvenlik: kaba kuvvetle giriş denemelerini ve kazımayı yavaşlatmayı sınırlar.
  • Maliyet kontrolü: Yapay zeka model çağrıları gibi pahalı işlemler bütçe dahilinde kalır.

Hız sınırlama, sınırsız kaynak tüketimi altında OWASP API Güvenliği İlk 10’da yer alan temel bir kontroldür. Postacı ile API test etme kılavuzumuz, kontrol etmek için gereken tekrarlanan isteklerin nasıl gönderileceğini gösterir.

Jeton paketi

En fazla 5 jeton tutan bir kova hayal edin. Her istek bir jeton alır. Jetonlar saniyede 1 oranında yeniden doldurulur ve pakette hiçbir zaman 5’ten fazla jeton tutulmaz. Paket boşsa istek reddedilir.

class TokenBucket:
    def __init__(self, capacity, refill_per_sec):
        self.capacity = capacity
        self.rate = refill_per_sec
        self.tokens = capacity
        self.last = 0.0

    def allow(self, now):
        elapsed = now - self.last
        self.tokens = min(self.capacity, self.tokens + elapsed * self.rate)
        self.last = now
        if self.tokens >= 1:
            self.tokens -= 1
            return True
        return False

Aynı anda 7 istek gönderdik, ardından daha fazlasını daha sonra gönderdik:

burst of 7 at t=0:  [True, True, True, True, True, False, False]
t=2.0:              [True, True, False]
t=10:               5 allowed of 10

İlk 5’i patlamayla geçti, ardından kova boşaldı. İki saniye sonra 2 jeton yeniden dolduruldu ve böylece 2 istek daha iletildi. Uzun bir duraklamanın ardından paket tekrar doldu ancak 5 ile sınırlandı. Bu patlama ve ardından sabit davranış davranışı gerçek trafiğe uygundur, bu nedenle jeton paketlerinin API ağ geçitlerinde yaygın olarak kullanılmasının nedeni budur. Sızdıran paket, istekleri sabit bir hızda işleyen ve patlamalara izin vermek yerine çıktıyı yumuşatan yakın bir akrabadır.

Sabit pencere ve kayan pencere

Sabit pencere sayacı en basit yaklaşımdır: Dakikada 10 isteğe izin verin ve dakika değiştiğinde sayacı sıfırlayın. Sınırda bilinen bir kusuru var. 60 saniyelik pencere başına 10’luk bir sınırla, 59,9 saniyede 10 istek ve 60,0 saniyede 10 istek daha gönderdik:

fixed window allowed around boundary: 20 of 20
sliding log allowed around boundary:  10 of 20

Sabit pencere, saniyenin onda biri kadar bir sürede 20 isteğin tümüne izin verdi; bu, amaçlanan oranın iki katıydı çünkü bunlar iki farklı pencereye düşüyordu. Kayan günlük her yeni isteğin zamanını hatırlar ve son 60 saniyedekileri sayar, dolayısıyla yalnızca 10’a doğru bir şekilde izin verir.

Takas hafızadır. Kayan günlük, istek başına bir zaman damgası saklar. Kayan pencere sayacı popüler bir orta yoldur. Mevcut ve önceki pencere sayımlarını harmanlayarak, az miktarda bellek kullanarak iyi bir doğrulukla oranı tahmin eder.

Algoritma karşılaştırması

Algoritma Patlamalar doğruluk Bellek
Sabit pencere Sınırlarda 2 kata kadar Düşük Çok düşük
Kayan günlük Hayır tam Yüksek
Sürgülü pencere sayacı Küçük iyi Düşük
Jeton paketi Kapasiteye kadar izin verilir iyi Düşük
Sızdıran kova Düzeltildi iyi Düşük

Neyle sınırlandırılmalı

  • API anahtarı veya kullanıcı kimliği: kimliği doğrulanmış API’ler için en adil seçenek.
  • IP adresi: genel uç noktalar için kullanışlıdır, ancak birçok kullanıcı bir IP’yi paylaşabilir ve saldırganlar bunları dönüşümlü olarak kullanabilir.
  • Uç nokta: Arama, dışa aktarma veya oturum açma gibi pahalı işlemler daha sıkı sınırları hak eder.
  • Plan katmanı: Ücretsiz ve ücretli müşterilere genellikle farklı limitler uygulanır.

Oturum açma uç noktalarının özel bakıma ihtiyacı vardır. Hem hesaba hem de IP’ye göre sınırlama yapın, böylece saldırganlar tahminlerini çok sayıda IP’ye veya çok sayıda hesaba yayamaz.

429 yanıtı

Bir istemci sınırı aştığında, 500 veya 403 yerine HTTP 429 Çok Fazla İstek döndürün. Müşteriye ne olduğunu ve ne zaman tekrar denemesi gerektiğini söyleyen başlıklar ekleyin. Simülasyonumuz bu seti hiçbir isteği kalmayan bir müşteri için üretti:

HTTP/1.1 429 Too Many Requests
RateLimit-Limit: 100
RateLimit-Remaining: 0
RateLimit-Reset: 30
Retry-After: 30

Retry-After standart bir HTTP başlığıdır. RateLimit-* başlıkları bir IETF taslağından gelir ve birçok API kendi X-RateLimit-* varyantlarını kullanır. Neyi seçerseniz seçin, belgeleyin. Durum kodları hakkında daha fazla bilgi için HTTP durum kodları özet sayfamıza bakın.

İstemci olarak sınırları ele alma

429’dan hemen sonra yeniden denemek işleri daha da kötüleştirir. Binlerce istemci aynı anda bunu yaparsa, sunucuya senkronize dalgalar halinde vururlar. Çözüm, titreşimli üstel geri çekilmedir: her başarısızlıktan sonra daha uzun süre bekleyin ve rastgelelik ekleyin.

def backoff(attempt, base=0.5, cap=30, rng=random.Random(4)):
    return round(min(cap, base * 2 ** attempt) * rng.random(), 2)

[backoff(a) for a in range(6)]
# [0.12, 0.1, 0.79, 0.62, 0.53, 6.43]

Bu “tam titreşim”dir: sıfır ile katlanarak büyüyen tavan arasında rastgele bir bekleme. Beklemeler düzensiz görünüyor ve mesele de bu. Müşteriler birlikte yeniden denemek yerine dağılırlar. Çıktının yeniden üretilebilmesi için rastgele oluşturucuyu tohumladık.

Müşteri kontrol listesi: mevcut olduğunda Retry-After‘yi dikkate alın, yeniden deneme sayısını sınırlayın, yalnızca tekrarlanması güvenli olan yeniden deneme isteklerini izleyin ve kalan istekler başlığını izleyin, böylece sınıra ulaşmadan önce yavaşlayabilirsiniz.

Dağıtılmış hız sınırlaması

Bir yük dengeleyicinin arkasında birden fazla API sunucusu bulunduğunda, her sunucunun kendi başına sayılması, istemcinin istekleri sunuculara yayarak sınırı aşmasına olanak tanır. Ekipler genellikle sayaçları Redis gibi paylaşılan bir depoda atomik işlemlerle veya kısa bir komut dosyasıyla tutar, böylece iki sunucu son jetonu alamaz. Kong, NGINX, Envoy gibi ağ geçitleri ve bulut API ağ geçitleri bunu yapılandırma olarak sağlar. Bu makale için dağıtılmış bir kurulum çalıştırmadık.

Hız sınırlarını test etme

  • Sınıra kadar istek gönderin ve başarılı olduklarını onaylayın.
  • Bir tane daha gönderin ve doğru başlıklarla 429’u onaylayın.
  • Sıfırlama süresini bekleyin ve isteklerin tekrar başarılı olduğunu onaylayın.
  • Anahtar başına sınırları kontrol edin: Bir istemcinin kullanımı diğerini engellememelidir.
  • Çift patlama sorunu için pencereler arasındaki sınırı test edin.
  • Yoğun eşzamanlılık altındaki davranışı kontrol etmek için yük testi ve stres testi bölümünde anlatıldığı gibi bir yükleme aracı kullanın.

Birim testlerinde, simülasyonumuzun now ile yaptığı gibi geçerli saati girin, böylece testlerin asla uyuması gerekmez.

Kullanıcıların yaşayabileceği sınırları tasarlamak

Sayıları seçmek, algoritmayı seçmek kadar önemlidir. Gerçek trafikten başlayın: En yoğun meşru müşterilerinizin dakikada kaç istekte bulunduğuna bakın ve bunun üzerine rahatça sınırlar koyun. Normal kullanımı engelleyen bir limit, güvenlik değil destek biletleri oluşturur.

  • Uç nokta ve plan başına sınırları API belgelerinizde yayınlayın.
  • Engellemeden önce uyar. Kalan istekleri gösteren başlıklar, iyi niyetli istemcilerin kendi başlarına yavaşlamalarına olanak tanır.
  • Yoğun oylamaya alternatifler sunun; örneğin web kancaları, toplu uç noktalar veya daha büyük sayfalar.
  • 429 oranlarını izleyin. Ani bir artış, bir saldırı, sorunlu bir istemci sürümü veya artık çok sıkı olan limitler anlamına gelebilir.
  • Kasıtlı olarak istisnalar verin; örneğin bir iş ortağı için artırılmış limitler, sabit kod yerine yapılandırmayla kaydedilir.

Ayrıca sınırı aşan taleplere ne olacağına da karar verin. Bazı API’ler az sayıdaki ekstra istekleri reddetmek yerine kısa süreliğine sıraya koyar, bu da kısa süreli ani artışları düzeltir. Diğerleri, ödemeler gibi temel uç noktalara, analitik gibi daha az kritik olanlara göre öncelik verir, böylece sistem baskı altındayken önemli trafik akmaya devam eder.

Son sözler

İyi oran sınırlaması, API ile müşteri arasındaki bir sözleşmedir. Sunucu, genellikle bir token kovası veya kayan pencere gibi adil bir algoritma seçer ve sınırlarını 429 ve Yeniden Dene-Sonra ile net bir şekilde açıklar. Müşteri bu sinyallere saygı duyar ve heyecanla geri çekilir. API anahtarı başına cömert sınırlarla başlayın, gerçek kullanımı izleyin ve yalnızca ihtiyacınız olduğu yerde sıkılaştırın.

Sık sorulan sorular

API hızı sınırlaması nedir?

Bir istemcinin belirli bir süre içinde bir API’ye kaç istekte bulunabileceğine ilişkin bir sınırdır (dakikada 100 gibi). Limiti aşan talepler reddedilir veya geciktirilir.

HTTP 429 ne anlama geliyor?

429 Çok Fazla İstek, istemcinin oran sınırını aştığı anlamına gelir. Yanıt genellikle ne kadar bekleneceğini belirten bir Retry-After başlığını içerir.

Token kovası algoritması nedir?

Her istek, maksimuma kadar sabit bir oranda yeniden doldurulan bir paketten gelen bir jeton kullanır. Ortalama bir hızı uygularken kısa patlamalara izin verir.

Hız sınırlama ile azaltma arasındaki fark nedir?

Hız sınırlaması genellikle sınırı aşan istekleri reddeder. Kısma genellikle onları yavaşlatır veya sıraya koyar. Terimler sıklıkla birbirinin yerine kullanılmaktadır.

Bir müşteri oran limitlerini nasıl ele almalıdır?

Yeniden Deneme-Sonra’ya saygı gösterin, üstel geri çekilme ve titreşimle yeniden deneyin, yeniden deneme sayısını sınırlayın ve kalan istekler azaldığında yavaşlayın.

Öğrenmeye devam et

Stack Quora ile çalışın

Test, WordPress veya SEO konusunda yardıma mı ihtiyacınız var?

Ekiplerin daha iyi yazılımlar sunmasına ve sitelerini büyütmesine yardımcı oluyoruz. Bize ne üzerinde çalıştığınızı söyleyin, biz de bir sonraki adım için net bir öneride bulunalım.

Okumaya devam et

Daha fazla kılavuz test, yapay zeka ve modern geliştirme

Bu makaleyi beğendiniz mi? Bir konu seçin ve doğrudan en yeni eğitimlerimize geçin.

Yapay zekâ

Yapay Zeka Halüsinasyonları Açıklandı: Dil Modelleri Neden İşleri Düzeltiyor ve Nasıl Azaltılabilir?

Yapay zeka halüsinasyonları açıkladı: ne olduklarını, dil modellerinin bunları neden ürettiğini, yaygın türlerini, temellendirme ve yönlendirmelerle…

Makaleyi okuyun →
DevOps

Açıklanan Ortam Değişkenleri: .env Dosyaları, Sırlar ve Yapılandırma Doğru Yapıldı

Çalıştırdığımız Python örnekleriyle açıklanan ortam değişkenleri: bunları okumak ve ayarlamak, neden her değerin bir dize olduğu, .env dosyaları, sü…

Makaleyi okuyun →
Yazılım geliştirme

API Hız Sınırlamasının Açıklaması: Algoritmalar, Başlıklar ve 429 Hatalarının Ele Alınması

API hızı sınırlaması, çalıştırdığımız bir simülasyonla açıklanmıştır: belirteç kümesi, sabit pencere, kayan pencere, 429 yanıt, hız sınırı başlıklar…

Makaleyi okuyun →
Test otomasyonu

Python'da alay etme: Unittest.mock, patch ve Testleri Yalan Yapan Hatalar

Unittest.mock ile Python'da alay etme, test edildi: Sahte ve dönüş_değeri, yan_etki, bir adın kullanıldığı yerde yama uygulama, spesifikasyon ve oto…

Makaleyi okuyun →
Yazılım testi

Kod Kapsamının Açıklaması: Hat ve Şube Kapsamı ve %100'ün Gerçek Anlamı

Kod kapsamı gerçek bir kapsama.py çalışmasıyla açıklanmıştır: hat, şube ve durum kapsamı, bir raporun okunması, %100 kapsamın neden hâlâ hataları ka…

Makaleyi okuyun →
Veritabanları ve SQL

SQL'de DELETE vs TRUNCATE vs DROP: Farklılıklar, Geri Alma ve Her Biri Ne Zaman Kullanılmalı

DELETE vs TRUNCATE vs DROP test edilmiş SQL ile açıklandı: her birinin neyi kaldırdığı, geri aldığı, tetiklediği, kimlik sıfırlaması, hızı ve Postgr…

Makaleyi okuyun →
Veritabanları ve SQL

Açıklanan SQL Görünümleri: Örneklerle Tuzakları Oluşturun, Kullanın ve Önleyin

Çalıştırdığımız sorgularla açıklanan SQL görünümleri: görünüm oluşturma, canlı sonuçlar, sütunları gizleme, performans, güncellenebilir ve gerçekleş…

Makaleyi okuyun →
Yazılım geliştirme

TypeScript Arayüzü ve Tür: Gerçek Farklılıklar, Derleyiciyle Test Edildi

TypeScript arayüzü ve türü, gerçek derleyiciyle kontrol edildi: her ikisinin de yapabileceği, yalnızca birinin yapabileceği, bildirim birleştirme, g…

Makaleyi okuyun →
Yazılım geliştirme

Python *args ve **kwargs'ın Açıklaması: Açık Örneklerle Esnek Fonksiyonlar

Python *args ve **kwargs çalıştırdığımız kodla açıklanmıştır: paketleme ve paketten çıkarma, parametre sırası, yalnızca anahtar kelime ve yalnızca k…

Makaleyi okuyun →
Yazılım geliştirme

Python Lambda İşlevleri: Söz Dizimi, Gerçek Kullanımlar ve Ne Zaman Kullanılmaması Gerektiği

Çalıştırdığımız kodla açıklanan Python lambda işlevleri: sözdizimi, anahtarla sıralama, harita ve filtre, kapatmalar, geç bağlama tuzağı ve normal b…

Makaleyi okuyun →
Yapay zekâ

Yapay Zeka Ajanları Nelerdir? Çalıştırabileceğiniz Basit Bir Aracı Döngüsüyle Nasıl Çalışırlar?

Yapay zeka ajanları nedir? Aracı döngüsüne, araçlara, belleğe ve korkuluklara ilişkin basit bir kılavuz, çalıştırdığımız küçük bir Python döngüsü, g…

Makaleyi okuyun →
DevOps

İzleme ve Gözlemlenebilirlik: Günlükler, Metrikler ve İzlerle Gerçek Fark

İzleme ve gözlemlenebilirliğin açıklanması: bilinen ve bilinmeyen arızalar, günlükler, ölçümler ve izler, ödeme olayının gözden geçirilmesi, altın s…

Makaleyi okuyun →
DevOps

Docker Birimleri ve Bağlama Bağlantıları: Konteyner Verilerini Doğru Şekilde Kalıcılaştırın

Docker birimleri ile bağlama bağlamaları arasındaki karşılaştırma açıklandı: kapsayıcı verilerinin neden kaybolduğu, adlandırılmış birimler, bağlama…

Makaleyi okuyun →
Test otomasyonu

TDD ve BDD: Temel Farklılıklar, Her İki Şekilde Geliştirilmiş Bir Özellik ve Her Birinin Ne Zaman Kullanılacağı

TDD ve BDD, her iki yönde de oluşturulmuş bir indirim özelliğiyle açıklandı: çalıştırdığımız kodla kırmızı-yeşil-refactor, Verilen-Ne Zaman-O Zaman …

Makaleyi okuyun →
Yazılım geliştirme

Git merge vs rebase: farklar, örnekler ve hangisi ne zaman kullanılır

Git merge vs rebase; gerçek log çıktısı, karşılaştırma tablosu, rebase'in altın kuralı ve güvenli bir ekip iş akışıyla anlatılıyor.

Makaleyi okuyun →
Yazılım geliştirme

Python Liste Üreteci (List Comprehension): Sözdizimi, Örnekler ve Kaçınılacak Durumlar

Python list comprehension anlatımı: sözdizimi, filtreleme, if-else, iç içe döngüler, ölçülmüş süreler ve düz for döngüsünün daha iyi olduğu durumlar.

Makaleyi okuyun →
Veritabanları ve SQL

SQL JOIN Örneklerle Açıklama (Inner, Left, Right, Full)

SQL JOIN'leri örnek tablolar ve sorgularla adım adım öğrenin: INNER, LEFT, RIGHT, FULL, CROSS ve SELF; yaygın hatalar ve performans ipuçları.

Makaleyi okuyun →