Annak tesztelése, hogy az alkalmazás hogyan kezeli GitHub API-sebességkorlátokat

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éri 0.
  • 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