429 Çok Fazla İstek: ne anlama gelir ve nasıl ele alınır

Bir API, uygulamanız belirli bir süre içinde API'nin izin verdiğinden daha fazla istek gönderdiğinde 429 Too Many Requests döndürür. İsteğin kendisi uygun. Çok sık gönderdiğiniz için API bunu reddetti. Bekleyip yeniden gönderirseniz, genellikle başarılı olur. Yanıt genellikle ne kadar bekleyeceğinizi belirten bir Retry-After üst bilgi içerir. Daha fazla bilgi için bkz. RFC 6585, bölüm 4.

Her API hız sınırlarını farklı uygular. Durum kodu, üst bilgiler ve hata gövdesinin tümü farklılık gösterir, bu nedenle bir API'yi doğru işleyen kod bir sonrakini yanlış işleyebilir.

API Statü Ne kadar beklemeniz gerektiğini nasıl anlarsınız? Aşağıdakilere dikkat edin:
GitHub 403 veya 429 retry-after varsa, aksi takdirde x-ratelimit-reset (UTC dönem saniye) olduğunda x-ratelimit-remaining0, değilse en az 1 dakika bir 403 hız sınırı veya eksik izin olabilir. Birbirinden ayırmak için üst bilgileri okuyun.
OpenAI 429 retry-after Bazı 429'lar, credit_balance_exhausted gibi, yeniden denemenin yardımcı olmayacağı anlamına gelir. error.code öğesini denetleyin.
Anthropic 429 retry-after 429 harcama üst sınırında retry-after yoktur ve erişim yeniden sağlanana kadar başarısız olmaya devam eder. Aşırı yüklenmiş bir API döndürür 529, döndürmez 429.
Microsoft Graph 429 Retry-After (saniye) Sınırlar hizmet başına farklılık gösterir, örneğin SharePoint ve Outlook.

429 nasıl ele alınır

  1. Yeniden deneyip denemeyeceğine karar verin. Hata kotanızın, kredilerinizin veya harcama limitinizin tükendiğini belirtiyorsa yeniden denemeniz yararlı olmaz. Kullanıcıya bildirin ve kendinizi uyarın.
  2. API istediği sürece bekleyin. Yanıtta Retry-After varsa, o kadar süre bekleyin. Saniye sayısı veya HTTP tarihidir. API bunun yerine GitHub x-ratelimit-resetgibi hız sınırı üst bilgileri kullanıyorsa sıfırlama zamanına kadar bekleyin.
  3. Yoksa geri çekilin. API'den bir ipucu almadan üstel geri alma ve rastgele değişim ile yeniden deneyin ve birkaç denemeden sonra durdurun.
  4. Kullanıcıya neler olduğunu anlatın. "Meşgul, 5 saniye içinde yeniden deneme", hiç bitmeyecek bir spinner'ı yener.
  5. Bir sonraki 429'dan önce yavaşlayın. API hız sınırı üst bilgileri gönderiyorsa, isteklerinizin temposunu ayarlamak için kalan sayıyı kullanın.
async function fetchWithRetry(url, options, attempts = 3) {
  for (let attempt = 1; ; attempt++) {
    const response = await fetch(url, options);
    if (response.status !== 429 || attempt === attempts) {
      return response;
    }
    const retryAfter = response.headers.get('retry-after');
    const waitMs = retryAfter
      ? (isNaN(retryAfter) ? new Date(retryAfter) - Date.now() : retryAfter * 1000)
      : 2 ** attempt * 1000 + Math.random() * 1000;
    await new Promise(resolve => setTimeout(resolve, Math.max(waitMs, 0)));
  }
}

Birçok SDK sizin için 429'ları yeniden dener. Örneğin, OpenAI Python SDK'sı varsayılan olarak 2 kez yeniden dener ve .NET standart dayanıklılık işleyicisi 3 kez yeniden dener ve Retry-After değerini dikkate alır. SDK'nın yeniden denemeleri bittiğinde kodunuz hatayı alır, bu nedenle yine de bir plana ihtiyaç duyar.

Uygulamanızın 429 hatasını nasıl ele aldığını test etme

Geliştirirken nadiren bir 429 görürsünüz. API hızlıdır, tek kullanıcı sizsiniz ve test verileriniz küçüktür. Dolayısıyla 429 işlemeyi test etme yönteminiz, hataları kullanıcılarınızdan önce bulup bulmayacağınızı belirler.

Approach Bulduklarınız Kaçırdığınız şeyler
Üretimi bekleyin Gerçek arızalar Bir kullanıcı ona tıklayana kadar her şey
Testlerinizde API'yi mock’layın veya kodlama aracınızın mock’u yazmasına izin verin Yeniden deneme dalınızın çalışıp çalışmayacağı API'nin gerçek durum kodları, başlıkları ve hata gövdeleri ile SDK'nızın yeniden deneme ilkesi. Uygulamanızın mock’a erişmek için yalnızca test amaçlı bir anahtara da ihtiyacı vardır.
Sizi kısıtlayana kadar gerçek API'yi çağırın Gerçek davranış İstediğiniz zaman 429 tetikleyemezsiniz ve gerçek kotanızı kullanırsınız
Uygulamanızın gerçek trafiğini yakalayın ve isteğe bağlı olarak 429 döndürün Gerçek URL'ler, gerçek SDK'nız ve yeniden deneme ilkeniz ve API'nin kendi 429 biçimi Uygulamanızda hiçbir şey değişmez, bu yüzden kodunuzu yalıtılmış olarak test etmez. Bunun için birim testlerinizi ayırın.

Uygulamanızda deneyin

Dev Proxy, uygulamanız gerçek URL'leri çağırmaya devam ederken, uygulamanızın seçtiğiniz API'lere yaptığı istekleri yakalar ve API'nin kendi üst bilgileri ve hata biçimiyle 429 döndürür. Ayrıca, Retry-After süre dolmadan önce uygulamanız yeniden denediğinde bunu da bildirir.

Uygulamanızın çağırmış olduğu API için ön ayarı indirin ve bununla Dev Proxy'yi başlatın:

devproxy config get github-rate-limiting
devproxy --config-file "~dataFolder/configs/github-rate-limiting/.devproxy/devproxyrc.json"
API Preset
GitHub github-rate-limiting
OpenAI openai-throttling
Anthropic anthropic-throttling
Microsoft Graph (OneDrive ve SharePoint: /drive, /shares, /sites) microsoft-graph-rate-limiting

Ardından uygulamanızı her zamanki gibi çalıştırın ve ne yaptığını izleyin. Geliştirme Proxy'sini yüklemek için bkz. Dev Proxy'yi ayarlama.

Sonraki Adımlar

Ayrıca bkz.