Notitie
Voor toegang tot deze pagina is autorisatie vereist. U kunt proberen u aan te melden of de directory te wijzigen.
Voor toegang tot deze pagina is autorisatie vereist. U kunt proberen de mappen te wijzigen.
Retry-After is een HTTP-antwoordheader die aangeeft hoe lang uw app moet wachten voordat uw app de volgende aanvraag verzendt. De waarde is een aantal seconden of een HTTP-datum. Wanneer een API deze verzendt, is het het meest betrouwbare antwoord op 'wanneer kan ik het opnieuw proberen?', omdat deze afkomstig is van de server die uw aanvraag heeft afgewezen. Zie RFC 9110, sectie 10.2.3 voor meer informatie.
Hoe ziet Retry-After eruit
De header heeft twee indelingen. Uw app moet beide afhandelen.
| Format | Example | Wat betekent het? |
|---|---|---|
| Seconds | Retry-After: 120 |
Wacht 120 seconden (2 minuten) vanaf het moment dat u het antwoord hebt ontvangen. De waarde is een niet-negatief geheel getal. |
| HTTP-datum | Retry-After: Fri, 31 Dec 1999 23:59:59 GMT |
Verzend de aanvraag niet opnieuw vóór dit tijdstip. De datum is altijd in GMT. |
Servers verzenden Retry-After met deze statuscodes:
| Status | Wat Retry-After betekent |
bron |
|---|---|---|
429 Too Many Requests |
Hoe lang moet u wachten voordat u een nieuwe aanvraag verzendt. De server kan deze bevatten. | RFC 6585, sectie 4 |
503 Service Unavailable |
Hoe lang de service naar verwachting niet beschikbaar is. De server kan deze bevatten. | RFC 9110, sectie 15.6.4 |
413 Content Too Large |
Als de voorwaarde tijdelijk is, moet de server aangeven na hoeveel tijd deze voorbij is. | RFC 9110, sectie 15.5.14 |
Willekeurige 3xx omleiding |
De minimale tijd om te wachten voordat u de omleiding volgt. | RFC 9110, sectie 10.2.3 |
De header is optioneel. Sommige API's gebruiken in plaats daarvan hun eigen headers. GitHub geeft bijvoorbeeld met x-ratelimit-reset aan wanneer uw limiet opnieuw wordt ingesteld. Zie GitHub API-frequentielimiet overschreden voor meer informatie.
Retry-After afhandelen
- Lees beide formaten. Als de waarde een getal is, zijn dit seconden. Anders interpreteert u het als een datum en trekt u de huidige tijd ervan af. Als de datum zich al in het verleden bevindt, kunt u het meteen opnieuw proberen.
- Wacht minstens zolang de koptekst zegt. Als u het eerder opnieuw probeert, krijgt u meestal een andere
429of503. Sommige API's blijven uw aanvragen tellen terwijl ze u beperken, zodat vroege nieuwe pogingen de wachttijd langer kunnen maken. Zie bijvoorbeeld Microsoft Graph-richtlijnen voor throttling. - Terugvallen op backoff met jitter wanneer de header ontbreekt. Verdubbel de wachttijd na elke mislukte poging, voeg een willekeurige hoeveelheid toe, zodat veel clients het niet opnieuw op hetzelfde moment proberen en stel een maximum in voor de wachttijd.
- Beperk het aantal pogingen. Retourneer na enkele pogingen de fout aan de aanroeper.
- Controleer of een nieuwe poging kan helpen. Sommige API's retourneren
429wanneer uw tegoeden of bestedingslimiet op zijn. Wachten lost deze niet op. Zie OpenAI insufficient_quota en credit_balance_exhausted voor een voorbeeld.
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);
}
Wat populaire SDK's doen
Veel SDK's verwerken Retry-After voor u, maar alleen totdat hun retries op zijn. Vervolgens geeft uw code een fout.
| SDK | Wat het standaard doet |
|---|---|
| .NET standaardhandler voor veerkracht | Probeert 408, 429 en 5xx reacties maximaal 3 keer opnieuw, met exponentieel toenemende wachttijd en jitter. Het gebruikt Retry-After voor de vertraging, omdat ShouldRetryAfterHeader standaard is ingesteld op true. |
| Microsoft Graph SDKs | Gebruik Retry-After als die aanwezig is, en val terug op exponential backoff als die er niet is. Aanvragen in een JSON-batch worden niet automatisch opnieuw geprobeerd. |
| OpenAI Python SDK | Probeert 2 keer opnieuw bij verbindingsfouten en 408, 409, 429 en 5xx-antwoorden met een korte exponentiële uitstel. Stel max_retries in om dit te wijzigen. |
Controleer de documentatie van uw SDK voor het exacte beleid en test wat er gebeurt nadat de laatste herhalingspoging is mislukt.
Zo test u of uw app met Retry-After omgaat
U krijgt zelden een Retry-After tijdens het ontwikkelen en wanneer u dat doet, kunt u de waarde ervan niet beheren. De manier waarop u dit test, bepaalt dus of u de bugs vindt voordat uw gebruikers dat doen.
| Approach | Wat u vindt | Wat u mist |
|---|---|---|
| Wacht op productie | Echte storingen | Alles, tot een gebruiker erop klikt |
| Mock de API in je tests, of laat je codeeragent de mock schrijven | Of uw code de header kan parseren | Of uw echte HTTP-client of SDK lang genoeg wacht en wat de API echt verzendt. Uw app heeft ook een schakelaar alleen voor testdoeleinden nodig om de mock te bereiken. |
| De echte API aanroepen totdat deze u rate-limiet oplegt | Werkelijk gedrag | U kunt niet naar wens een reactie met snelheidsbeperking activeren, en u verbruikt uw echte quotum |
| Het echte verkeer van uw app onderscheppen en vertraagde reacties op aanvraag retourneren | Of uw echte SDK en retrybeleid net zo lang wachten als de header aangeeft | Er verandert niets in uw app, dus uw code wordt niet geïsoleerd getest. Gebruik daar unittests voor. |
Probeer het uit in je app
Dev Proxy onderschept de aanvragen van uw app naar de API's die u kiest en retourneert 429 antwoorden met een Retry-After header, terwijl uw app de echte URL's blijft aanroepen. De RetryAfterPlugin onthoudt wanneer elk beperkt verzoek opnieuw kan worden geprobeerd. Als uw app vóór die tijd dezelfde URL aanroept, rapporteert Dev Proxy deze en beperkt Dev Proxy de aanvraag opnieuw. De invoegtoepassing houdt alleen 429-antwoorden bij.
Stel in het foutenbestand voor GenericRandomErrorPlugin de Retry-After waarde in van een 429 reactie op @dynamic, en Dev Proxy vult het aantal seconden in en houdt het voor u bij.
Als u het wilt proberen, downloadt u een voorinstelling die beide invoegtoepassingen gebruikt en start u de Dev Proxy ermee:
devproxy config get openai-throttling
devproxy --config-file "~dataFolder/configs/openai-throttling/.devproxy/devproxyrc.json"
Voer vervolgens uw app zoals gebruikelijk uit en bekijk wat deze doet. Zie Dev Proxy instellen om Dev Proxy te installeren.