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.
Retry-After, uygulamanıza bir sonraki isteği göndermeden önce ne kadar beklemesi gerektiğini bildiren bir HTTP yanıt üst bilgisidir. Değer, ya saniye cinsinden bir sayı ya da bir HTTP tarihidir. Bir API bunu gönderdiğinde, isteğinizi reddeden sunucudan geldiğinden "ne zaman yeniden deneyebilirim?" sorusunun en güvenilir yanıtıdır. Daha fazla bilgi için bkz. RFC 9110, bölüm 10.2.3.
Retry-After’ın görünümü
Üst bilgi 2 biçime sahiptir. Uygulamanızın her ikisini de desteklemesi gerekir.
| Format | Example | Ne anlama gelir? |
|---|---|---|
| Seconds | Retry-After: 120 |
Yanıtı aldığınızdan itibaren 120 saniye (2 dakika) bekleyin. Değer negatif olmayan bir tamsayıdır. |
| HTTP tarihi | Retry-After: Fri, 31 Dec 1999 23:59:59 GMT |
Bu zamandan önce isteği bir daha göndermeyin. Tarih her zaman GMT'dedir. |
Sunucular Retry-After öğesini şu durum kodlarıyla gönderir:
| Statü |
Retry-After ne anlama gelir |
Source |
|---|---|---|
429 Too Many Requests |
Yeni bir istek göndermeden önce ne kadar beklemeniz gerekir? Sunucu bunu içerebilir. | RFC 6585, bölüm 4 |
503 Service Unavailable |
Hizmetin ne kadar süreyle kullanılamayacağı. Sunucu bunu içerebilir. | RFC 9110, bölüm 15.6.4 |
413 Content Too Large |
Durum geçiciyse, sunucu bunun ne kadar süre sonra sona ereceğini belirtmelidir. | RFC 9110, bölüm 15.5.14 |
Herhangi bir 3xx yeniden yönlendirme |
Yeniden yönlendirmeyi izlemeden önce beklemeniz gereken en kısa süre. | RFC 9110, bölüm 10.2.3 |
Başlık isteğe bağlıdır. Bazı API'ler bunun yerine kendi başlıklarını kullanır. Örneğin, GitHub limitiniz x-ratelimit-reset sıfırlandığında size bildirir. Daha fazla bilgi için bkz. GitHub API hız sınırı aşıldı.
Retry-After nasıl ele alınır
- Her iki biçimi de okuyun. Değer bir sayıysa, saniyedir. Aksi takdirde, tarih olarak ayrıştırın ve geçerli zamanı ondan çıkarın. Tarih zaten geçmişteyse, hemen yeniden deneyebilirsiniz.
- Üst bilgide belirtildiği kadar bekleyin. Daha erken yeniden denemek genellikle başka bir
429veya503alırsınız. Bazı API'ler sizi kısıtlarken isteklerinizi saymaya devam eder, bu yüzden erken yeniden denemeler bekleme süresini uzatabilir. Örneğin, bkz. Microsoft Graph kısıtlama kılavuzu. - Üst bilgi eksik olduğunda jitter’lı backoff kullanın. Her başarısız denemeden sonra bekleme süresini iki katına çıkarın, birçok istemcinin aynı anda yeniden denememesi için rastgele bir miktar ekleyin ve beklemeyi sınırlandırın.
- Yeniden denemelerinizi sınırlayın. Birkaç denemeden sonra, hatayı çağıran tarafa döndürün.
- Yeniden denemenin yardımcı olup olmadığını denetleyin. Kredileriniz veya harcama limitiniz tükendiğinde bazı API'ler
429döndürür. Beklemek bunları düzeltmez. Bir örnek için bkz. OpenAI insufficient_quota ve credit_balance_exhausted.
function retryDelayMs(response, attempt) {
const value = response.headers.get('retry-after');
if (value) {
const seconds = Number(value);
const ms = Number.isNaN(seconds) ? Date.parse(value) - Date.now() : seconds * 1000;
if (!Number.isNaN(ms)) {
return Math.max(ms, 0);
}
}
// No usable header: exponential backoff with jitter, capped at 30 seconds
return Math.random() * Math.min(30_000, 1_000 * 2 ** attempt);
}
Popüler SDK'lar ne yapar?
Birçok SDK, Retry-After işlemini sizin için yönetir, ancak yalnızca yeniden deneme hakları tükenene kadar. Ardından kodunuz bir hatayla karşılaşır.
| SDK | Varsayılan olarak ne yapar? |
|---|---|
| .NET standard dayanıklılık işleyicisi | Üstel geri alma ve değişim ile , 429ve 5xx yanıtlarını en fazla 3 kez yeniden dener408. varsayılan truedeğeri olduğundan ShouldRetryAfterHeader gecikme için kullanırRetry-After. |
| Microsoft Graph SDK'ları | Mevcut olduğunda kullanın Retry-After ve mevcut olmadığında üstel geri çekilmeye geri dönün. JSON toplu işlemi içindeki istekler otomatik olarak yeniden denenmiyor. |
| OpenAI Python SDK'sı | Bağlantı hatalarını ve 408, 409, 429ve 5xx yanıtlarını kısa bir üstel geri alma ile 2 kez yeniden dener. Değiştirmek için max_retries ayarlayın. |
Tam ilke için SDK'nızın belgelerine bakın ve son yeniden deneme başarısız olduktan sonra ne olacağını test edin.
Uygulamanızın Retry-After’ı nasıl ele aldığını test etme
Geliştirme yaparken nadiren zaman Retry-After alırsınız ve bunu yaptığınızda değerini denetleyemezsiniz. Bu nedenle bunu test yönteminiz, hataları kullanıcılarınızdan önce bulup bulamayacağınıza karar verir.
| Approach | Bulduklarınız | Özlediğiniz şeyler |
|---|---|---|
| Üretim için bekleme | Gerçek hatalar | Bir kullanıcı ona ulaşana kadar her şey |
| Testlerinizde API'yi mock'layın veya kodlama aracınızın mock'u yazmasına izin verin | Kodunuzun üst bilgiyi ayrıştırıp ayrıştırmayacağı | Gerçek HTTP istemcinizin veya SDK'nızın yeterince uzun süre bekleyip beklemediği ve API'nin gerçekten ne gönderdiği. Uygulamanızın sahteye ulaşmak için yalnızca test anahtarına da ihtiyacı vardır. |
| Sizi kısıtlayana kadar gerçek API'yi çağırın | Gerçek davranış | İsteğe bağlı olarak kısıtlanmış yanıt tetikleyemezsiniz ve gerçek kotanızı tüketirsiniz |
| Uygulamanızın gerçek trafiğini yakalayın ve isteğe bağlı olarak kısıtlanmış yanıtlar döndürün | Gerçek SDK'nızın ve yeniden deneme ilkenizin üst bilgide belirtildiği kadar bekleyip beklemediği | Uygulamanızda hiçbir şey değişmez, bu yüzden kodunuzu yalıtılmış olarak test etmez. Bunun için birim testlerinizi kullanın. |
Uygulamanızda deneyin
Dev Proxy, uygulamanız gerçek URL'leri çağırmaya devam ederken, uygulamanızın seçtiğiniz API'lere yönelik isteklerini yakalar ve 429 üst bilgisine sahip Retry-After yanıtlar döndürür.
RetryAfterPlugin, hız sınırlamasına uğrayan her isteğin ne zaman yeniden denenebileceğini anımsar. Uygulamanız o zamandan önce aynı URL'yi çağırırsa Dev Proxy bunu bildirir ve isteği yeniden kısıtlar. Eklenti yalnızca 429 yanıtlarını izler.
GenericRandomErrorPlugin için hata dosyanızda, bir @dynamic yanıtının 429 değerini Retry-After olarak ayarlayın; Dev Proxy saniye sayısını doldurur ve bunu sizin için izler.
Denemek için, her iki eklentiyi de kullanan bir ön ayar indirin ve Bununla Dev Proxy'yi başlatın:
devproxy config get openai-throttling
devproxy --config-file "~dataFolder/configs/openai-throttling/.devproxy/devproxyrc.json"
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.