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.
GitHub beperkt het aantal REST API-aanvragen dat uw app kan verzenden. Wanneer u een limiet overschrijdt, wijst GitHub uw verzoeken af met een 403- of 429-status totdat de limiet opnieuw wordt ingesteld of de wachttijd is verstreken. GitHub heeft twee soorten limieten: een primaire limiet voor aanvragen per uur en secundaire limieten die beschermen tegen bursts. Als uw app aanvragen blijft verzenden terwijl er een rate limit van kracht is, kan GitHub uw integratie blokkeren. Zie Frequentielimieten voor de REST API voor meer informatie.
Hoe zien de frequentielimieten van GitHub eruit
| Limit | Value | Wanneer u het doorneemt |
|---|---|---|
| Primair, niet-aangemeld | 60 aanvragen per uur, per IP-adres |
403 of 429, en x-ratelimit-remaining is 0 |
| Primair, persoonlijk toegangstoken | 5000 aanvragen per uur | Hetzelfde als hierboven |
Primary, GITHUB_TOKEN in GitHub Actions |
1000 aanvragen per uur, per repository | Hetzelfde als hierboven |
| Secundaire | Bijvoorbeeld niet meer dan 100 gelijktijdige aanvragen, 900 punten per minuut voor REST-eindpunten en ongeveer 80 aanvragen voor het genereren van inhoud per minuut |
403 of 429 met een foutbericht.
retry-after kan aanwezig zijn. |
GitHub kan zonder kennisgeving secundaire limieten wijzigen en er is geen manier om te controleren hoe dicht u bij deze limieten bent.
Elk antwoord bevat headers die u vertellen waar u zich bevindt op de primaire limiet:
| Header | Wat het u vertelt |
|---|---|
x-ratelimit-limit |
Het maximum aantal aanvragen dat u per uur kunt verzenden |
x-ratelimit-remaining |
Hoeveel verzoeken u nog hebt in het huidige venster |
x-ratelimit-used |
Hoeveel aanvragen hebt u in het huidige venster verzonden |
x-ratelimit-reset |
Wanneer het venster opnieuw wordt ingesteld, in UTC-epochseconden |
x-ratelimit-resource |
Tegen welke limiet de aanvraag wordt meegeteld |
Omgaan met een GitHub-ratelimiet
- Maak onderscheid tussen een frequentielimiet en een machtigingsfout. GitHub retourneert
403ook wanneer uw token onvoldoende toegangsmachtigingen heeft. Als het antwoord geenretry-afterheeft,x-ratelimit-remainingniet0is, en het bericht geen frequentielimiet vermeldt, is dit een autorisatieprobleem. Probeer het niet opnieuw. - Volg
retry-aftereerst. Als de koptekst aanwezig is, wacht u dat aantal seconden. - Wacht anders op de reset. Als
x-ratelimit-remaining0is, probeer het niet opnieuw vóór de tijd inx-ratelimit-reset. - Wacht anders minstens 1 minuut. Voor een secundaire limiet zonder een van beide headers vraagt GitHub u om ten minste 1 minuut te wachten en na elke mislukte nieuwe poging langer te wachten. Stop na een bepaald aantal herhalingen en geef een fout.
-
Vertraag voordat je limiet opraakt. Gebruik
x-ratelimit-remainingenx-ratelimit-resetom het tempo van uw aanvragen aan te passen. Bouw geen logica rond een exacte resterende telling, omdat GitHub limieten kan wijzigen. Dex-ratelimit-*headers zijn de bron van waarheid, niet hetGET /rate_limiteindpunt.
async function githubWaitMs(response, attempt) {
if (response.status !== 403 && response.status !== 429) {
return null;
}
const retryAfter = response.headers.get('retry-after');
if (retryAfter) {
return Number(retryAfter) * 1000;
}
if (response.headers.get('x-ratelimit-remaining') === '0') {
const resetMs = Number(response.headers.get('x-ratelimit-reset')) * 1000;
return Math.max(resetMs - Date.now(), 0);
}
const { message = '' } = await response.clone().json().catch(() => ({}));
if (response.status === 429 || /rate limit/i.test(message)) {
return 60_000 * 2 ** attempt;
}
// A 403 without rate limit signals is a permission problem: don't retry
return null;
}
De aanroeper probeert opnieuw wanneer de functie een getal retourneert en stopt na een paar pogingen.
Testen of uw app GitHub-ratelimieten verwerkt
U hebt zelden een GitHub-ratelimiet bereikt tijdens het ontwikkelen. U verzendt een paar aanvragen en 5.000 per uur voelt eindeloos. De manier waarop u de afhandeling van rate limits test, bepaalt dus of u de bugs vindt voordat uw gebruikers dat doen.
| Approach | Wat u vindt | Wat u mist |
|---|---|---|
| Wachten op de productie | Werkelijke storingen | Alles, totdat een gebruiker erop klikt |
| Mock de API in je tests, of laat je coding agent de mock schrijven | Of uw retry-tak wordt uitgevoerd | de echte headers en foutteksten van GitHub en het retrybeleid van uw SDK. Uw app heeft ook een schakelaar nodig die alleen voor testdoeleinden is om de mock te bereiken. |
| Roep de echte API aan totdat u wordt beperkt | Werkelijk gedrag | Er zijn maximaal 5.000 aanvragen nodig, u kunt geen secundaire limiet naar wens activeren en u loopt het risico op een verbod op uw integratie |
| Het werkelijke verkeer van uw app onderscheppen en reacties op retourfrequentielimieten op aanvraag | Echte URL's, uw echte SDK en retrybeleid, en de eigen headers en foutindeling van GitHub | Er verandert niets in uw app, dus test het uw code niet geïsoleerd. Bewaar je unittests daarvoor. |
Probeer het uit in je app
Dev Proxy onderschept de aanvragen van uw app naar api.github.com en retourneert GitHub-achtige rate-limitreacties, terwijl uw app de echte URL's blijft aanroepen. De github-rate-limiting voorinstelling telt uw aanvragen mee voor een limiet van 60 per uur, verzendt de x-ratelimit-* headers en retourneert een 429 met API rate limit exceeded wanneer u uw limiet bereikt. Tot die tijd gaan uw aanvragen ook naar GitHub en tellen ze mee voor uw werkelijke limiet.
Download de voorinstelling en start de Dev Proxy ermee:
devproxy config get github-rate-limiting
devproxy --config-file "~dataFolder/configs/github-rate-limiting/.devproxy/devproxyrc.json"
Als u secundaire limieten wilt testen, start u in plaats daarvan Dev Proxy vanuit dezelfde map met devproxyrc-secondary.json. Er wordt willekeurig een secundaire ratelimiet 429 met een retry-after header geretourneerd.
Voer vervolgens uw app zoals gebruikelijk uit en bekijk wat deze doet. Zie Dev Proxy instellen om Dev Proxy te installeren.