Poznámka:
Přístup k této stránce vyžaduje autorizaci. Můžete se zkusit přihlásit nebo změnit adresáře.
Přístup k této stránce vyžaduje autorizaci. Můžete zkusit změnit adresáře.
Tip
Neznáte ještě omezování rychlosti? Zjistěte, co je throttling a jak ho řešit.
Na první pohled
Cíl: Ověřte, že vaše .NET obslužná rutina odolnosti HTTP provádí opakované pokusy, prodlužuje intervaly mezi pokusy a vyprší časový limit podle očekávání.
Čas: 15 minut
Pluginy:GenericRandomErrorPlugin, RetryAfterPlugin, LatencyPlugin
Požadavky:Nastavte Dev Proxy, aplikace .NET, která používá Microsoft.Extensions.Http.Resilience
Přidali jste si AddStandardResilienceHandler() do svého HttpClient. Jak poznáte, že to funguje? Rozhraní API, která voláte, zřídka selžou schválně, a jednotkové testy, které emulují HttpMessageHandler, přeskočí pipeline odolnosti, kterou chcete testovat.
Dev Proxy se nachází mezi vaší aplikací a rozhraním API. Vaší aplikaci vrací chyby a pomalé odpovědi, takže aplikace běží beze změny a obslužná komponenta pro odolnost reaguje na skutečné odpovědi HTTP. Každý pokus se zobrazí ve výstupu Dev Proxy.
Co dělá standardní obslužná rutina pro odolnost
Než začnete testovat, zjistěte, co očekávat. S výchozími možnostmi, AddStandardResilienceHandler():
| Behavior | Výchozí |
|---|---|
| Opakované pokusy zapnuty | HTTP 500 a vyšší, 408, 429, HttpRequestExceptiona TimeoutRejectedException |
| Počet opakovaných pokusů | 3, s exponenciálním prodlužováním intervalu opakování a jitterem, počínaje 2 sekundami |
Retry-After Záhlaví |
Poctěn. Obslužná rutina počká na dobu, o kterou rozhraní API požádá. |
| Časový limit pokusu | 10 sekund za pokus |
| Celkový časový limit | 30 sekund na požadavek včetně všech opakování |
Úplný seznam strategií a jejich výchozích hodnot najdete v tématu Standardní výchozí hodnoty obslužné rutiny pro zajištění odolnosti.
Směrujte aplikaci přes Dev Proxy
.NET používá systémový proxy server, takže když spustíte Dev Proxy, zachytí požadavky vaší aplikace, aniž by bylo nutné měnit kód. Další informace najdete v tématu Použití dev proxy s .NET aplikacemi.
Simulovat přechodné chyby
Vytvořte konfiguraci Dev Proxy, která způsobí selhání požadavků na vaše rozhraní API chybami, které obslužná rutina zkouší znovu. Tento příklad používá https://api.contoso.com. Nahraďte ho adresou URL rozhraní API, které vaše aplikace volá.
Soubor: 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
Přidejte RetryAfterPlugin před GenericRandomErrorPlugin ve vašem konfiguračním souboru. Pokud ji přidáte později, GenericRandomErrorPlugin žádost zamítne dříve, než ji RetryAfterPlugin bude moct zkontrolovat.
V souboru errors definujte odpověď při omezení požadavků a dvě chyby serveru. Hodnota @dynamic nastaví hlavičku Retry-After a řekne RetryAfterPlugin, aby zkontrolovala, že vaše aplikace čeká po tuto dobu, než znovu zavolá rozhraní API.
Soubor: 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
}
]
}
]
}
Spusťte Dev Proxy a spusťte aplikaci.
devproxy --config-file devproxyrc.json
Při 50% míře selhání se většinu požadavků podaří obnovit po jednom nebo dvou opakováních. Ve výstupu Dev Proxy zkontrolujte, zda:
- Po odpovědi 429 následuje další pokus o stejnou adresu URL po
Retry-Afteruplynutí této doby. Dev Proxy používá ve výchozím nastavení 5 sekund. Pokud vaše aplikace volá rozhraní API příliš brzy,RetryAfterPluginto nahlásí a omezí požadavek. - Vaše aplikace neodesílá více pokusů, než jste nakonfigurovali.
- Žádosti, které nechcete opakovat, například požadavek
POST, který vytvoří záznam, se odesílají jenom jednou. Chcete-li je vyloučit, zavolejteoptions.Retry.DisableForUnsafeHttpMethods()nebooptions.Retry.DisableFor(...).
Testování toho, co se stane, když se vyčerpají pokusy o opakování
Opakované pokusy skryjí krátká selhání. Potřebujete také vědět, co vaše aplikace dělá, když rozhraní API neustále selhává. Spusťte Dev Proxy s 100% chybovou rychlostí:
devproxy --config-file devproxyrc.json --failure-rate 100
Dev Proxy zobrazuje 4 pokusy pro každý požadavek: původní požadavek a 3 opakování. Po posledním opakování standardní obslužná rutina nevyhodí výjimku. Vrátí vašemu kódu poslední chybovou odpověď. Zkontrolujte, co s ní vaše aplikace dělá. Například EnsureSuccessStatusCode() vyvolá HttpRequestException a GetStringAsync() vyvolá také. Ujistěte se, že aplikace zobrazuje užitečnou zprávu nebo použije náhradní řešení, místo chybového ukončení nebo zobrazení obecné chyby.
Časové limity testů
Pomalá rozhraní API aktivují v obslužné rutině jinou cestu. K otestování použijte LatencyPlugin ke zpoždění odpovědí nad časový limit 10sekundového pokusu.
Soubor: 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
}
}
Spusťte Dev Proxy a spusťte aplikaci. Každý pokus trvá déle než 10 sekund, takže časový limit pokusu ho zruší a obslužná rutina pokus zopakuje. Po 30 sekundách se celkový časový limit zruší a vašemu kódu se vrátí TimeoutRejectedException. Zkontrolujte, jestli vaše aplikace ho zachytí a řekne uživateli, co se stalo.
Tip
Pokud chcete otestovat stejné scénáře s vlastním nastavením odolnosti, změňte hodnoty ve vašem volání AddStandardResilienceHandler(options => ...) a znovu spusťte stejné konfigurace Dev Proxy.
Další krok
Přečtěte si další informace o simulaci omezování u libovolného rozhraní API.
Viz také
- Použití Dev Proxy s aplikacemi .NET – nastavení .NET
- GenericRandomErrorPlugin – úplný odkaz
- RetryAfterPlugin – Ověření chování při opakování
- LatencyPlugin – Simulovat pomalé odpovědi
- Četnost selhání žádostí o změnu – Upravte, jak často požadavky selhávají
- Používejte Dev Proxy v CI/CD – Automatizujte testování odolnosti ve svém kanálu