Remarque
L’accès à cette page nécessite une autorisation. Vous pouvez essayer de vous connecter ou de modifier des répertoires.
L’accès à cette page nécessite une autorisation. Vous pouvez essayer de modifier des répertoires.
GitHub limite le nombre de demandes d’API REST que votre application peut envoyer. Lorsque vous dépassez une limite, GitHub rejette vos requêtes avec un code d'état 403 ou 429 jusqu'à ce que la limite soit réinitialisée ou que le délai d'attente soit écoulé. GitHub applique deux types de limites : une limite principale sur le nombre de requêtes par heure et des limites secondaires qui protègent contre les pics de requêtes. Si votre application continue d'envoyer des requêtes alors qu'elle est soumise à une limitation de débit, GitHub peut bannir votre intégration. Pour plus d’informations, consultez Les limites de débit pour l’API REST.
Présentation des limites de débit de GitHub
| Limit | Value | Lorsque vous la dépassez |
|---|---|---|
| Limite principale, sans authentification | 60 requêtes par heure, par adresse IP |
403 ou 429, et x-ratelimit-remaining est 0 |
| Limite principale, jeton d'accès personnel | 5 000 requêtes par heure | Comme ci-dessus |
Limite principale, GITHUB_TOKEN dans GitHub Actions |
1 000 requêtes par heure, par dépôt | Comme ci-dessus |
| Secondary | Par exemple, pas plus de 100 requêtes simultanées, 900 points par minute pour les points de terminaison REST et environ 80 requêtes de génération de contenu par minute |
403 ou 429 avec un message d’erreur.
retry-after peut être présent. |
GitHub peut modifier les limites secondaires sans préavis, et il n'existe aucun moyen de vérifier la proximité de celles-ci.
Chaque réponse inclut des en-têtes qui vous indiquent où vous vous trouvez sur la limite principale :
| Header | Ce qu’il vous dit |
|---|---|
x-ratelimit-limit |
Nombre maximal de requêtes que vous pouvez envoyer par heure |
x-ratelimit-remaining |
Nombre de requêtes qu'il vous reste dans la fenêtre actuelle |
x-ratelimit-used |
Nombre de demandes que vous avez envoyées dans la fenêtre actuelle |
x-ratelimit-reset |
Lorsque la fenêtre est réinitialisée, en secondes d’époque UTC |
x-ratelimit-resource |
Limite à laquelle la requête a été imputée |
Comment gérer une limite de taux de GitHub
- Distinguez une limite de débit d’une erreur d’autorisation. GitHub retourne également
403lorsque votre jeton ne dispose pas des droits d’accès. Si la réponse n’a pasretry-after,x-ratelimit-remainingn’est pas0, et que le message ne mentionne pas de limitation du nombre de requêtes, il s’agit d’un problème d’autorisation. Ne réessayez pas. - Suivez
retry-afterd’abord. Si l’en-tête est présent, attendez ce nombre de secondes. - Sinon, attendez la réinitialisation. Si
x-ratelimit-remainingest0, ne réessayez pas avant l’heure indiquée dansx-ratelimit-reset. - Sinon, attendez au moins 1 minute. Pour une limite secondaire sans en-tête, GitHub vous demande d’attendre au moins 1 minute et d’attendre plus longtemps après chaque nouvelle tentative ayant échoué. Arrêtez après un nombre défini de nouvelles tentatives et générez une erreur.
-
Ralentissez avant d'atteindre votre limite. Utilisez
x-ratelimit-remainingetx-ratelimit-resetpour réguler le rythme de vos requêtes. Ne fondez pas votre logique sur un nombre exact restant, car GitHub peut modifier les limites. Les en-têtesx-ratelimit-*font autorité, et non le point de terminaisonGET /rate_limit.
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;
}
Votre appelant réessaye lorsque la fonction retourne un nombre et s’arrête après quelques tentatives.
Comment tester que votre application gère les limites de taux de GitHub
Vous atteignez rarement une limite de requêtes GitHub pendant que vous développez. Vous envoyez quelques requêtes, et une limite de 5 000 requêtes par heure semble inépuisable. Ainsi, la façon dont vous testez la gestion des limites de débit détermine si vous trouvez les bogues avant que vos utilisateurs ne le fassent.
| Approach | Ce que vous trouvez | Ce qui vous échappe |
|---|---|---|
| Attendre la mise en production | Échecs réels | Tout, jusqu’à ce qu’un utilisateur appuie dessus |
| Simuler l’API dans vos tests ou laisser votre agent de codage écrire la simulation | Vérifier si votre branche de nouvelle tentative s'exécute | Les véritables en-têtes et corps de réponse d'erreur de GitHub, ainsi que la stratégie de nouvelles tentatives de votre SDK. Votre application a également besoin d'un commutateur réservé aux tests pour accéder au simulateur. |
| Appelez l’API réelle jusqu’à ce qu’elle vous limite | Comportement réel | Cela nécessite jusqu'à 5 000 requêtes, vous ne pouvez pas déclencher une limite secondaire à la demande et vous risquez de voir votre intégration bannie. |
| Intercepter le trafic réel de votre application et renvoyer des réponses de limitation de débit à la demande | De véritables URL, votre SDK et votre stratégie de nouvelle tentative réels, ainsi que les en-têtes et le format d'erreur propres à GitHub | Rien dans votre application ne change, cela ne teste donc pas votre code de manière isolée. Conservez vos tests unitaires pour cela. |
Essayez-le sur votre application
Dev Proxy intercepte les requêtes de votre application vers api.github.com et renvoie des réponses de limitation du débit de style GitHub, tandis que votre application continue d’appeler les URL réelles. Le préréglage github-rate-limiting comptabilise vos requêtes par rapport à une limite de 60 par heure, envoie les en-têtes x-ratelimit-* et renvoie un code 429 avec API rate limit exceeded lorsque vous atteignez la limite. Jusque-là, vos requêtes sont transmises à GitHub et sont également comptabilisées dans votre limite réelle.
Téléchargez le préréglage et démarrez Dev Proxy avec celui-ci :
devproxy config get github-rate-limiting
devproxy --config-file "~dataFolder/configs/github-rate-limiting/.devproxy/devproxyrc.json"
Pour tester les limites secondaires, démarrez plutôt Dev Proxy avec devproxyrc-secondary.json à partir du même dossier. Il renvoie de manière aléatoire une réponse de limitation de débit secondaire 429 avec un en-tête retry-after.
Exécutez ensuite votre application comme d’habitude et regardez ce qu’elle fait. Pour installer Dev Proxy, consultez Configurer Dev Proxy.