Megjegyzés
Az oldalhoz való hozzáféréshez engedély szükséges. Megpróbálhat bejelentkezni vagy módosítani a címtárat.
Az oldalhoz való hozzáféréshez engedély szükséges. Megpróbálhatja módosítani a címtárat.
Tip
Új számodra a throttling? Ismerje meg a korlátozás fogalmát és ennek kezelését.
Egy pillantással
Cél: Annak tesztelése, hogy az alkalmazás hogyan kezeli a GitHub REST API sebességkorlátait
Idő: 15 perc
Beépülő modulok:RateLimitingPlugin, GenericRandomErrorPlugin, RetryAfterPlugin
Előfeltételek:Fejlesztői proxy beállítása
Az alkalmazás meghívja a GitHub API-t. A gépén működik, majd egy CI-feladat, egy nagy szervezet vagy egy forgalmas nap átlépi a sebességkorlátot, és hibázni kezd. A valós API-n való teszteléshez fel kell használnia a hívási korlátját, majd akár egy órát is várnia kell, mielőtt újra próbálkozhat. A Dev Proxy helyileg szimulálja a GitHub sebességkorlátozását egy ön által választott korláttal és időkerettel.
Tudd, mit ad vissza a GitHub
A GitHub kétféle lekérési korlátot alkalmaz a REST API-hoz.
Az elsődleges kéréskorlátok az óránkénti kérelmek számát korlátozzák. Például 60 a hitelesítés nélküli kérések esetében, és 5000 a személyes hozzáférési tokennel rendelkező kérések esetén. Minden válasz tartalmaz fejléceket, amelyek azt mutatják, hogy hol tart:
| Header | Meaning |
|---|---|
x-ratelimit-limit |
A kérelmek maximális száma óránként |
x-ratelimit-remaining |
Az aktuális ablakban maradt kérések száma |
x-ratelimit-reset |
Az idő, amikor az ablak alaphelyzetbe áll, UTC epoch másodpercben |
Ha túllépi az elsődleges korlátot, a GitHub a 403 vagy x-ratelimit-remaining választ adja vissza, ahol a 429 értéke 0. Ne próbálkozzon újra a(z) x-ratelimit-reset időpontig.
A másodlagos sebességkorlátok védik a GitHubot a terhelési csúcsoktól, például túl sok egyidejű kéréstől vagy túl sok tartalom túl gyors létrehozásától. Ha túllépi az egyet, a GitHub 403 vagy 429 választ ad vissza egy másodlagos rátakorlátról szóló üzenettel. Ha a válasz fejléccel retry-after rendelkezik, várjon ennyi másodpercet. Ellenkező esetben várjon legalább egy percet, és növelje a várakozási időt, ha a kérés sikertelen marad.
A GitHub letilthatja azokat az integrációkat, amelyek továbbra is kéréseket küldenek, miközben elérték a kérelmi korlátot. További információkért tekintse meg a REST API sebességkorlátait a GitHub dokumentációjában.
Az elsődleges korlátozás szimulálása
A RateLimitingPlugin használatával megszámolhatja a kéréseket, és visszaadhatja GitHub sebességkorlátozási fejléceit. Ha egy óra várakozás nélkül szeretne tesztelni, használjon egy alacsony limitet és egy rövid időablakot.
Fájl: devproxyrc.json
{
"$schema": "https://raw.githubusercontent.com/dotnet/dev-proxy/main/schemas/v3.3.1/rc.schema.json",
"plugins": [
{
"name": "RetryAfterPlugin",
"enabled": true,
"pluginPath": "~appFolder/plugins/DevProxy.Plugins.dll"
},
{
"name": "RateLimitingPlugin",
"enabled": true,
"pluginPath": "~appFolder/plugins/DevProxy.Plugins.dll",
"configSection": "githubRateLimit"
}
],
"urlsToWatch": [
"https://api.github.com/*"
],
"githubRateLimit": {
"$schema": "https://raw.githubusercontent.com/dotnet/dev-proxy/main/schemas/v3.3.1/ratelimitingplugin.schema.json",
"headerLimit": "x-ratelimit-limit",
"headerRemaining": "x-ratelimit-remaining",
"headerReset": "x-ratelimit-reset",
"resetFormat": "UtcEpochSeconds",
"costPerRequest": 1,
"rateLimit": 5,
"resetTimeWindowSeconds": 60,
"warningThresholdPercent": 0,
"whenLimitExceeded": "Custom",
"customResponseFile": "github-rate-limit-exceeded.json"
}
}
Caution
Adja hozzá az RetryAfterPlugin elemet a RateLimitingPlugin elé a konfigurációs fájlban. Ha ezt követően adja hozzá, a RateLimitingPlugin kezeli a kérést, mielőtt az RetryAfterPlugin ellenőrizhetné.
Az egyéni válaszfájlban adja meg azt a választ, amelyet a GitHub az elsődleges kérelmi korlát túllépésekor ad vissza.
Fájl: github-rate-limit-exceeded.json
{
"$schema": "https://raw.githubusercontent.com/dotnet/dev-proxy/main/schemas/v3.3.1/ratelimitingplugin.customresponsefile.schema.json",
"statusCode": 429,
"headers": [
{
"name": "content-type",
"value": "application/json; charset=utf-8"
}
],
"body": {
"message": "API rate limit exceeded for user ID 1.",
"documentation_url": "https://docs.github.com/rest/overview/rate-limits-for-the-rest-api"
}
}
Indítsa el a Dev Proxyt, és futtassa az alkalmazást.
devproxy --config-file devproxyrc.json
A Dev Proxy minden percben továbbítja az első öt kérést a GitHubnak, és beállítja a x-ratelimit-* fejléceket a válaszokban. A 6. kéréstől kezdve a Dev Proxy a sebességkorlátozási választ adja vissza, amelyben a 0 értéke x-ratelimit-reset, a x-ratelimit-remaining értéke pedig az időablak vége. Ha az alkalmazás az időablak visszaállása előtt ismét meghívja az API-t, a RetryAfterPlugin ezt jelzi, és korlátozza a kérést.
Ellenőrizze, hogy az alkalmazása:
- Beolvassa
x-ratelimit-remaining, és lelassul, mielőtt eléri0. - A sebességkorlát-válasz után leállítja az API meghívását, és vár, amíg
x-ratelimit-reset. - Tájékoztatja a felhasználót arról, hogy mi történik, például: „A GitHub kérésszámkorlátját elérte, 14:05-kor újrapróbálkozik”, ahelyett, hogy hibaüzenet nélkül kudarcba fulladna.
Note
A GitHub a(z) 403 vagy 429 értéket adja vissza, ha túlléped a kérésszámkorlátot. Annak teszteléséhez, hogy az alkalmazás a(z) 403 elemet is kezeli, módosítsa a(z) statusCode értéket erre: 403. Az RetryAfterPlugin csak a 429 válaszokat követi nyomon, így nem jelenti a korai újrapróbálkozásokat egy 403 után.
Tip
A Dev Proxy a szimulált korlát eléréséig a GitHub felé továbbítja a kéréseket. Ezek a kérések a valós GitHub lekérési korlátnak is számítanak.
Másodlagos kéréskorlátozások szimulálása
A másodlagos sebességkorlátok hullámokban jelentkeznek, és tartalmaznak egy retry-after fejlécet. A GenericRandomErrorPlugin használatával véletlenszerűen adja vissza őket.
Fájl: devproxyrc.json
{
"$schema": "https://raw.githubusercontent.com/dotnet/dev-proxy/main/schemas/v3.3.1/rc.schema.json",
"plugins": [
{
"name": "RetryAfterPlugin",
"enabled": true,
"pluginPath": "~appFolder/plugins/DevProxy.Plugins.dll"
},
{
"name": "GenericRandomErrorPlugin",
"enabled": true,
"pluginPath": "~appFolder/plugins/DevProxy.Plugins.dll",
"configSection": "githubSecondaryRateLimit"
}
],
"urlsToWatch": [
"https://api.github.com/*"
],
"githubSecondaryRateLimit": {
"$schema": "https://raw.githubusercontent.com/dotnet/dev-proxy/main/schemas/v3.3.1/genericrandomerrorplugin.schema.json",
"errorsFile": "github-secondary-rate-limit.json",
"rate": 50,
"retryAfterInSeconds": 60
}
}
Fájl: github-secondary-rate-limit.json
{
"$schema": "https://raw.githubusercontent.com/dotnet/dev-proxy/main/schemas/v3.3.1/genericrandomerrorplugin.errorsfile.schema.json",
"errors": [
{
"request": {
"url": "https://api.github.com/*"
},
"responses": [
{
"statusCode": 429,
"headers": [
{
"name": "content-type",
"value": "application/json; charset=utf-8"
},
{
"name": "retry-after",
"value": "@dynamic"
}
],
"body": {
"message": "You have exceeded a secondary rate limit. Please wait a few minutes before you try again.",
"documentation_url": "https://docs.github.com/rest/overview/rate-limits-for-the-rest-api#about-secondary-rate-limits"
}
}
]
}
]
}
Indítsa el a Dev Proxy-t, és futtassa az alkalmazást. Ellenőrizze, hogy az alkalmazás kivárja-e a retry-after fejlécben megadott másodpercek számát, mielőtt újra meghívja az API-t. Ha nem, a RetryAfterPlugin jelenti.
Ha az Octokitot a sebességkorlátozó bővítménnyel használja, ellenőrizze, hogy a onRateLimit és onSecondaryRateLimit kezelők futnak-e, és hogy a várt eredményt adják-e vissza.
Következő lépés
További információ a RateLimitingPlugin-ról.
Lásd még
- Rate-Limit API-válaszok szimulálása – Kérésszámkorlátok bármely API-n
- Annak tesztelése, hogy az alkalmazás megfelelően kezeli-e a fojtást – Fojtás bármely API-n
- RetryAfterPlugin – Az újrapróbálkozás működésének ellenőrzése
- Dev Proxy használata a CI/CD-ben – A folyamat rugalmassági tesztelésének automatizálása