Kommentar
Åtkomst till den här sidan kräver auktorisering. Du kan prova att logga in eller ändra kataloger.
Åtkomst till den här sidan kräver auktorisering. Du kan prova att ändra kataloger.
Retry-After är ett HTTP-svarshuvud som talar om för din app hur länge den ska vänta innan den skickar nästa begäran. Värdet är antingen ett antal sekunder eller ett HTTP-datum. När ett API skickar det är det det mest tillförlitliga svaret på "när kan jag försöka igen?" eftersom det kommer från servern som avvisade din begäran. Mer information finns i RFC 9110, avsnitt 10.2.3.
Hur Retry-After ser ut
Rubriken har två format. Din app måste hantera båda.
| Format | Example | Vad det innebär |
|---|---|---|
| Seconds | Retry-After: 120 |
Vänta 120 sekunder (2 minuter) från när du fick svaret. Värdet är ett icke-negativt heltal. |
| HTTP-datum | Retry-After: Fri, 31 Dec 1999 23:59:59 GMT |
Skicka inte begäran igen före denna tidpunkt. Datumet är alltid i GMT. |
Servrar skickar Retry-After med följande statuskoder:
| Status | Vad Retry-After betyder |
Source |
|---|---|---|
429 Too Many Requests |
Hur länge ska du vänta innan du skickar en ny begäran. Servern kan innehålla den. | RFC 6585, avsnitt 4 |
503 Service Unavailable |
Hur länge tjänsten förväntas vara otillgänglig. Servern kan innehålla det. | RFC 9110, avsnitt 15.6.4 |
413 Content Too Large |
Om tillståndet är tillfälligt bör servern säga efter hur lång tid tillståndet upphör. | RFC 9110, avsnitt 15.5.14 |
Valfri omdirigering 3xx |
Minsta tid att vänta innan du följer omdirigeringen. | RFC 9110, avsnitt 10.2.3 |
Rubriken är valfri. Vissa API:er använder sina egna headers i stället. GitHub meddelar dig till exempel när gränsen återställs med x-ratelimit-reset. Mer information finns i GitHub API-gränsen för begäranden har överskridits.
Hantera Retry-After
- Läs båda formaten. Om värdet är ett tal är det sekunder. Annars parsar du det som ett datum och subtraherar den aktuella tiden. Om datumet redan har passerat kan du försöka igen direkt.
- Vänta minst så länge som rubriken anger. Att försöka igen tidigare ger dig vanligtvis en annan
429eller503. Vissa API:er fortsätter att räkna dina förfrågningar medan de begränsar dig, så tidiga återförsök kan göra väntetiden längre. Se till exempel Microsoft Graph-vägledning om throttling. - Gå tillbaka till backoff med jitter när headern saknas. Dubbla väntetiden efter varje misslyckat försök, lägg till en slumpmässig mängd så att många klienter inte försöker igen vid samma tidpunkt och begränsa väntetiden.
- Begränsa dina återförsök. Efter några försök, returnera felet till anroparen.
- Kontrollera att ett nytt försök kan hjälpa. Vissa API:er returnerar
429när dina krediter eller din utgiftsgräns är slut. Att vänta löser inte det. Se OpenAI insufficient_quota och credit_balance_exhausted som exempel.
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);
}
Vad populära SDK:er används till
Många SDK:er hanterar Retry-After åt dig, men bara tills återförsöken tar slut. Då får koden felet.
| SDK | Vad det gör som standard |
|---|---|
| .NET standardhanterare för resiliens | Försök igen vid svaren 408, 429 och 5xx upp till 3 gånger med exponentiell backoff och jitter. Den använder Retry-After för fördröjningen eftersom standardvärdet för ShouldRetryAfterHeader är true. |
| Microsoft Graph SDKs | Använd Retry-After när den finns och falla tillbaka på exponentiell backoff när den inte gör det. Begäranden i en JSON-batch försöks inte igen automatiskt. |
| OpenAI Python SDK | Försöker igen vid anslutningsfel och svaren 408, 409, 429 och 5xx 2 gånger med en kort exponentiell fördröjning. Ange max_retries för att ändra det. |
Kontrollera SDK:s dokumentation för den exakta policyn och testa vad som händer när det senaste omförsöket misslyckas.
Så här testar du att appen hanterar Retry-After
Du får sällan ett Retry-After medan du utvecklar, och när du får det kan du inte kontrollera dess värde. Så hur du testar detta avgör om du hittar buggarna innan dina användare gör det.
| Approach | Det här hittar du | Vad du saknar |
|---|---|---|
| Vänta tills produktionen är klar | Faktiska fel | Allt, tills en användare träffar den |
| Mocka API:et i dina tester eller låt kodningsagenten skriva mocken | Om koden parsar huvud | Om din riktiga HTTP-klient eller SDK väntar tillräckligt länge och vad API:et faktiskt skickar. Din app behöver också en testflagga för att nå mocken. |
| Anropa det verkliga API:et tills det hastighetsbegränsar dig | Faktiskt beteende | Du kan inte utlösa ett strypt svar när du vill, och du förbrukar din faktiska kvot |
| Fånga upp appens verkliga trafik och returnera strypda svar på begäran | Om din riktiga SDK och återförsöksprincip väntar så länge som huvudet säger | Ingenting i din app ändras, så den testar inte din kod isolerat. Spara det till enhetstesterna. |
Prova det i din app
Dev Proxy fångar upp appens begäranden till de API:er som du väljer och returnerar 429 svar med en Retry-After header, medan appen fortsätter att anropa de verkliga URL:erna.
RetryAfterPlugin kommer ihåg när varje begränsad begäran kan göras på nytt. Om appen anropar samma URL före den tiden rapporterar Dev Proxy den och begränsar begäran igen. Plugin-programmet spårar 429 endast svar.
I felfilen för GenericRandomErrorPlugin anger du Retry-After värdet för ett 429 svar till @dynamicoch Dev Proxy fyller i antalet sekunder och spårar det åt dig.
Om du vill prova det laddar du ned en förinställning som använder båda plugin-program och startar Dev Proxy med den:
devproxy config get openai-throttling
devproxy --config-file "~dataFolder/configs/openai-throttling/.devproxy/devproxyrc.json"
Kör sedan appen som vanligt och se vad den gör. Information om hur du installerar Dev Proxy finns i Installera Dev Proxy.