Újrapróbálkozások és időtúllépések tesztelése a Microsoft.Extensions.Http.Resilience-t használó .NET-alkalmazásokban

Tip

Új számodra a throttling? Ismerje meg a korlátozás fogalmát és ennek kezelését.

Egy pillantással
Cél: Győződjön meg arról, hogy a .NET HTTP rugalmassági kezelő a várt módon újrapróbálkozik, késleltetést alkalmaz, és időtúllépést használ
Idő: 15 perc
Beépülő modulok:GenericRandomErrorPlugin, RetryAfterPlugin, LatencyPlugin
Előfeltételek:A Dev Proxy beállítása, egy olyan .NET-alkalmazásé, amely a Microsoft.Extensions.Http.Resilience függvénytárat használja

Hozzáadta a(z) AddStandardResilienceHandler() elemet a(z) HttpClient fiókjához. Honnan tudod, hogy működik? Az általad hívott API-k ritkán nem akkor hibásodnak meg, amikor szeretnéd, és azok az egységtesztek, amelyek mockolják a(z) HttpMessageHandler elemet, kihagyják a tesztelni kívánt rugalmassági folyamatot.

A Dev Proxy az alkalmazás és az API között helyezkedik el. Hibákat és lassú válaszokat ad vissza az alkalmazásodnak, így az alkalmazásod változatlanul fut, és a rugalmasságkezelő valós HTTP-válaszokra reagál. A Dev Proxy kimenetében minden kísérlet megjelenik.

Mit csinál a standard rugalmasságkezelő

Mielőtt tesztelnél, tudd, mire számíthatsz. Az alapértelmezett beállításokkal: AddStandardResilienceHandler()

Viselkedés Alapértelmezett
Újrapróbálkozások: be HTTP 500 és újabb, 408, 429 HttpRequestExceptionés TimeoutRejectedException
Újrapróbálkozások száma 3, exponenciális újrapróbálkozási késleltetéssel és jitterrel, 2 másodperctől kezdve
Retry-After Fejléc Megtisztelő. A kezelő az API által kért ideig vár.
Sikertelen kísérlet időkorlát miatt Kísérletenként 10 másodperc
Teljes időtúllépés 30 másodperc a kéréshez, beleértve az újrapróbálkozásokat is

A stratégiák és azok alapértelmezéseinek teljes listáját a Standard rezilienciakezelő alapértelmezései című témakörben találja.

Irányítsa az alkalmazását Dev Proxy-n keresztül

A .NET a rendszerproxyt használja, így a Dev Proxy indításakor kódmódosítások nélkül elfogja az alkalmazás kéréseit. További információ: Dev Proxy használata .NET alkalmazásokkal.

Átmeneti hibák szimulálása

Hozzon létre egy fejlesztői proxykonfigurációt, amely meghiúsítja az API-jához irányuló kéréseket azokkal a hibákkal, amelyek esetén a kezelő újrapróbálkozik. Ez a példa a https://api.contoso.com-t használja. Cserélje le azt az alkalmazás által hívott API URL-címére.

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": "transientErrors"
    }
  ],
  "urlsToWatch": [
    "https://api.contoso.com/*"
  ],
  "transientErrors": {
    "$schema": "https://raw.githubusercontent.com/dotnet/dev-proxy/main/schemas/v3.3.1/genericrandomerrorplugin.schema.json",
    "errorsFile": "transient-errors.json",
    "rate": 50
  }
}

Caution

Adja hozzá az RetryAfterPlugin elemet a GenericRandomErrorPlugin elé a konfigurációs fájlban. Ha ezt követően adja hozzá, a GenericRandomErrorPlugin elutasítja a kérést, mielőtt az RetryAfterPlugin ellenőrizni tudja.

A hibafájlban adjon meg egy sebességkorlátozási választ és két kiszolgálóhibát. Az @dynamic érték beállítja a Retry-After fejlécet, és utasítja a RetryAfterPlugin-t, hogy ellenőrizze, hogy az alkalmazás mennyi ideig vár, mielőtt újra meghívja az API-t.

Fájl: transient-errors.json

{
  "$schema": "https://raw.githubusercontent.com/dotnet/dev-proxy/main/schemas/v3.3.1/genericrandomerrorplugin.errorsfile.schema.json",
  "errors": [
    {
      "request": {
        "url": "https://api.contoso.com/*"
      },
      "responses": [
        {
          "statusCode": 429,
          "headers": [
            {
              "name": "Retry-After",
              "value": "@dynamic"
            }
          ]
        },
        {
          "statusCode": 500
        },
        {
          "statusCode": 503
        }
      ]
    }
  ]
}

Indítsa el a Dev Proxy-t, és futtassa az alkalmazást.

devproxy --config-file devproxyrc.json

50% hibaarány esetén a legtöbb kérés egy-két újrapróbálkozás után sikeres lesz. A Dev Proxy kimenetében ellenőrizze, hogy:

  • A 429-válasz után a következő kísérlet ugyanarra az URL-címre a Retry-After idő után következik. A Dev Proxy alapértelmezés szerint 5 másodperces értéket használ. Ha az alkalmazás túl korán hívja meg az API-t, a RetryAfterPlugin jelzi ezt, és korlátozza a kérést.
  • Az alkalmazás nem küld több próbálkozást, mint amennyit konfigurált.
  • A rendszer csak egyszer küldi el azokat a kéréseket, amelyeket nem szeretne újra elküldeni, például egy POST rekordot létrehozó kérést. A kizárásukhoz hívja a options.Retry.DisableForUnsafeHttpMethods() vagy a options.Retry.DisableFor(...) elemet.

Annak tesztelése, hogy mi történik az újrapróbálkozások elfogyásakor

Az újrapróbálkozások elrejtik az átmeneti hibákat. Azt is tudnia kell, hogy az alkalmazás mit tesz, ha az API-hívások folyamatosan hibát adnak. A Dev Proxy indítása 100% hibaaránysal:

devproxy --config-file devproxyrc.json --failure-rate 100

A Dev Proxy 4 kísérletet jelenít meg minden egyes kéréshez: az eredeti kérést és 3 újrapróbálkozást. Az utolsó újrapróbálkozás után a szabványos kezelő nem vált ki kivételt. A kódodnak visszaadott utolsó hibaválaszt adja vissza. Ellenőrizze, hogy az alkalmazás mit csinál vele. Például EnsureSuccessStatusCode() dob egy HttpRequestException, és GetStringAsync() dob is. Győződjön meg arról, hogy az alkalmazás egy hasznos üzenetet jelenít meg, vagy alternatívára vált ahelyett, hogy összeomlana vagy általános hibát jelenít meg.

Tesztelési időtúllépések

A lassú API-k egy másik elérési utat aktiválnak a kezelőkomponensben. A teszteléshez használja a LatencyPlugin parancsot a válaszok 10 másodperces kísérleti időkorláton túlra történő késleltetésére.

Fájl: devproxyrc.json

{
  "$schema": "https://raw.githubusercontent.com/dotnet/dev-proxy/main/schemas/v3.3.1/rc.schema.json",
  "plugins": [
    {
      "name": "LatencyPlugin",
      "enabled": true,
      "pluginPath": "~appFolder/plugins/DevProxy.Plugins.dll",
      "configSection": "slowApi"
    }
  ],
  "urlsToWatch": [
    "https://api.contoso.com/*"
  ],
  "slowApi": {
    "$schema": "https://raw.githubusercontent.com/dotnet/dev-proxy/main/schemas/v3.3.1/latencyplugin.schema.json",
    "minMs": 11000,
    "maxMs": 15000
  }
}

Indítsa el a Dev Proxy-t, és futtassa az alkalmazást. Minden kísérlet több mint 10 másodpercet vesz igénybe, ezért a kísérlet időtúllépése megszakítja azt, és a kezelő újra megpróbálja. 30 másodperc elteltével a teljes időtúllépés megszakítja a kérést, és a kódja egy TimeoutRejectedException hibát kap. Ellenőrizze, hogy az alkalmazás kezeli-e, és közli a felhasználóval, hogy mi történt.

Tip

Ha ugyanazokat a forgatókönyveket saját rugalmassági beállításaival szeretné tesztelni, módosítsa a AddStandardResilienceHandler(options => ...) hívásban lévő értékeket, és futtassa újra ugyanazokat a Dev Proxy-konfigurációkat.

Következő lépés

További információ a sebességkorlátozás szimulálásáról bármely API-n.

Lásd még