429 Te veel aanvragen: wat betekent dit en hoe u dit kunt afhandelen

Een API retourneert 429 Too Many Requests wanneer uw app meer aanvragen heeft verzonden dan de API in een bepaalde periode toestaat. Het verzoek zelf is prima. U hebt het te vaak verzonden, dus de API heeft deze uitgeschakeld. Als u wacht en het opnieuw verzendt, slaagt het meestal. Het antwoord bevat vaak een Retry-After koptekst die aangeeft hoe lang u moet wachten. Zie RFC 6585, sectie 4 voor meer informatie.

Elke API implementeert frequentielimieten anders. De statuscode, de headers en de hoofdtekst van de fout variëren, zodat code die één API correct verwerkt, de volgende API onjuist kan verwerken.

API Status Hoe kunt u zien hoe lang u moet wachten Let op
GitHub 403 of 429 retry-after indien aanwezig, anders x-ratelimit-reset (UTC epoch seconden) wanneer x-ratelimit-remaining is 0, anders ten minste 1 minuut Een 403 kan een frequentielimiet of een ontbrekende toestemming zijn. Lees de kopteksten om ze te onderscheiden.
OpenAI 429 retry-after Sommige 429's, zoals credit_balance_exhausted, betekenen dat opnieuw proberen niet helpt. Controleer error.code.
Antropisch 429 retry-after Een spend-cap 429 heeft geen retry-after en blijft falen totdat de toegang wordt hervat. Een overbelaste API retourneert 529, niet 429.
Microsoft Graph 429 Retry-After (seconden) Limieten verschillen per service, bijvoorbeeld SharePoint en Outlook.

Een 429 afhandelen

  1. Bepaal of u het helemaal opnieuw wilt proberen. Als de fout aangeeft dat uw quotum, tegoed of de bestedingslimiet is verbruikt, helpt het opnieuw proberen niet. Informeer de gebruiker en waarschuw uzelf.
  2. Wacht zo lang als de API aangeeft. Als het antwoord Retry-After heeft, wacht u zo lang. Dit is een aantal seconden of een HTTP-datum. Als de API in plaats daarvan headers voor frequentielimiet gebruikt, zoals GitHubx-ratelimit-reset, wacht u tot de tijd voor het opnieuw instellen.
  3. Anders, terug. Zonder een hint van de API, probeert u het opnieuw met exponentieel uitstel en willekeurige jitter en stopt u na een paar pogingen.
  4. Vertel de gebruiker wat er gebeurt. "Bezet, opnieuw proberen in 5 seconden" verslaat een spinner die nooit eindigt.
  5. Vertraag voor de volgende 429. Als de API headers voor frequentielimieten verzendt, gebruikt u het resterende aantal om uw aanvragen sneller te laten verlopen.
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)));
  }
}

Veel SDK's proberen 429s opnieuw voor u. De OpenAI Python SDK probeert bijvoorbeeld 2 keer opnieuw, en de .NET standaard tolerantiehandler probeert drie keer en eerRetry-After. Wanneer de SDK geen retries meer over heeft, krijgt uw code de fout, dus uw code moet hier nog steeds op voorbereid zijn.

Testen of uw app 429 verwerkt

U ziet zelden een 429 tijdens het ontwikkelen. De API is snel, u bent de enige gebruiker en uw testgegevens zijn klein. De manier waarop u de afhandeling van 429 test, bepaalt dus of u de bugs vindt voordat uw gebruikers dat doen.

Approach Wat u vindt Wat u mist
Wachten op productieomgeving Echte fouten Alles, totdat een gebruiker erop klikt
Mock de API in je tests, of laat je codeeragent de mock schrijven Of uw opnieuw-proberenvertakking wordt uitgevoerd De echte statuscodes, headers en foutteksten van de API en het retrybeleid van uw SDK. Uw app heeft ook een schakelaar alleen voor tests nodig om de mock te bereiken.
De echte API aanroepen totdat deze u rate-limiet oplegt Werkelijk gedrag U kunt geen 429 op aanvraag activeren en u verbruikt uw werkelijke quotum
Het echte verkeer van uw app onderscheppen en 429's op aanvraag retourneren Echte URL's, uw echte SDK en beleid voor opnieuw proberen, en de eigen 429-indeling van de API Er verandert niets in uw app, dus uw code wordt niet geïsoleerd getest. Gebruik daar uw unittests voor.

Probeer het op je app

Dev Proxy onderschept de aanvragen van uw app naar de API's die u kiest en retourneert 429's, met de eigen headers en foutindeling van de API, terwijl uw app de echte URL's blijft aanroepen. Er wordt ook aangegeven wanneer uw app het opnieuw probeert voordat de Retry-After tijd voorbij is.

Download de voorinstelling voor de API die uw app aanroept en start er Dev Proxy mee:

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 en SharePoint: /drive, /shares, /sites) microsoft-graph-rate-limiting

Voer vervolgens uw app zoals gebruikelijk uit en bekijk wat deze doet. Zie Dev Proxy instellen om Dev Proxy te installeren.

Volgende stappen 

Zie ook