Not
Bu sayfaya erişim yetkilendirme gerektiriyor. Oturum açmayı veya dizinleri değiştirmeyi deneyebilirsiniz.
Bu sayfaya erişim yetkilendirme gerektiriyor. Dizinleri değiştirmeyi deneyebilirsiniz.
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.
Popüler API'lerde 429 nasıl görünür?
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
- 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.
- API istediği sürece bekleyin. Yanıtta
Retry-Aftervarsa, o kadar süre bekleyin. Saniye sayısı veya HTTP tarihidir. API bunun yerine GitHubx-ratelimit-resetgibi hız sınırı üst bilgileri kullanıyorsa sıfırlama zamanına kadar bekleyin. - Yoksa geri çekilin. API'den bir ipucu almadan üstel geri alma ve rastgele değişim ile yeniden deneyin ve birkaç denemeden sonra durdurun.
- Kullanıcıya neler olduğunu anlatın. "Meşgul, 5 saniye içinde yeniden deneme", hiç bitmeyecek bir spinner'ı yener.
- 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.