Verificare che l'applicazione gestisca correttamente la limitazione della frequenza

Tip

Non conosci ancora il throttling? Scopri che cos'è il throttling e come gestirlo.

A colpo d'occhio
Obiettivo: Testare il modo in cui l'app gestisce la limitazione delle API in qualsiasi API
Tempo: 15 minuti
Plugins:GenericRandomErrorPlugin, RetryAfterPlugin
Prerequisiti:Configurare il proxy di sviluppo

Il test del "throttling" è difficile perché si verifica raramente, solo quando il server che ospita l'API è soggetto a un carico elevato. Usando il proxy di sviluppo, è possibile simulare la limitazione delle richieste in qualsiasi API e verificare se l'applicazione la gestisce correttamente.

Per simulare la limitazione del throughput in qualsiasi API, utilizzare GenericRandomErrorPlugin. Se l'API usata, restituisce un'intestazione Retry-After , usare RetryAfterPlugin per verificare che l'app venga disattivata come indicato dall'API.

Simulare la strozzatura su qualsiasi API

Per iniziare, abilitare GenericRandomErrorPlugin nel file di configurazione del proxy di sviluppo.

Nome file: devproxyrc.json

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

Configurare quindi il plug-in per usare un file contenente gli errori da simulare.

File: devproxyrc.json (con configurazione degli errorsFile)

{
  "$schema": "https://raw.githubusercontent.com/dotnet/dev-proxy/main/schemas/v3.3.1/rc.schema.json",
  "plugins": [
    {
      "name": "GenericRandomErrorPlugin",
      "enabled": true,
      "pluginPath": "~appFolder/plugins/DevProxy.Plugins.dll",
      "configSection": "errorsContosoApi",
      "urlsToWatch": [
        "https://api.contoso.com/*"
      ]
    }
  ],
  "errorsContosoApi": {
    "$schema": "https://raw.githubusercontent.com/dotnet/dev-proxy/main/schemas/v3.3.1/genericrandomerrorplugin.schema.json",
    "errorsFile": "errors-contoso-api.json"
  }
}

Nel file degli errori, definire la risposta di throttling in modo che corrisponda alla risposta effettiva di throttling dell'API.

File: errors-contoso-api.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": "Content-Type",
              "value": "application/json"
            }
          ],
          "body": {
            "code": "TooManyRequests",
            "message": "Too many requests"
          }
        }
      ]
    }
  ]
}

Avvia Dev Proxy con il tuo file di configurazione e testa l'app per vedere come gestisce il rallentamento.

Testare il backup corretto con l'intestazione Retry-After

Molte API usano l'intestazione Retry-After della risposta per indicare all'app di eseguire il back-off per un periodo di tempo specifico. Quando si simulano risposte di limitazione usando Dev Proxy, è possibile configurare l'intestazione Retry-After su un valore statico o usare un valore dinamico che verifica se l'app è in attesa come indicato prima di chiamare nuovamente l'API.

Per configurare l'intestazione Retry-After su un valore statico, inserire l'intestazione nella risposta di throttling:

File: errors-contoso-api.json (con Retry-After statico)

{
  "$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": "Content-Type",
              "value": "application/json"
            },
            {
              "name": "Retry-After",
              "value": "60"
            }
          ],
          "body": {
            "code": "TooManyRequests",
            "message": "Too many requests"
          }
        }
      ]
    }
  ]
}

In questo esempio l'intestazione Retry-After è impostata su 60 secondi. Quando si configura l'intestazione su un valore statico, Dev Proxy non controlla se l'app è in attesa prima di chiamare nuovamente l'API.

Per verificare se l'app è in attesa correttamente prima di chiamare nuovamente l'API, modificare il valore dell'intestazione in @dynamic:

File: errors-contoso-api.json (con Retry-After dinamico)

{
  "$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": "Content-Type",
              "value": "application/json"
            },
            {
              "name": "Retry-After",
              "value": "@dynamic"
            }
          ],
          "body": {
            "code": "TooManyRequests",
            "message": "Too many requests"
          }
        }
      ]
    }
  ]
}

Estendi inoltre la configurazione del proxy di sviluppo con RetryAfterPlugin.

File: devproxyrc.json (completo con RetryAfterPlugin)

{
  "$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",
      "urlsToWatch": [
        "https://api.contoso.com/*"
      ]
    },
    {
      "name": "GenericRandomErrorPlugin",
      "enabled": true,
      "pluginPath": "~appFolder/plugins/DevProxy.Plugins.dll",
      "configSection": "errorsContosoApi",
      "urlsToWatch": [
        "https://api.contoso.com/*"
      ]
    }
  ],
  "errorsContosoApi": {
    "$schema": "https://raw.githubusercontent.com/dotnet/dev-proxy/main/schemas/v3.3.1/genericrandomerrorplugin.schema.json",
    "errorsFile": "errors-contoso-api.json"
  }
}

Attenzione

Aggiungi RetryAfterPlugin prima di GenericRandomErrorPlugin nel file di configurazione. Se lo aggiungi dopo, la richiesta verrà respinta da GenericRandomErrorPlugin prima che RetryAfterPlugin abbia la possibilità di gestirla.

Questo plug-in tiene traccia delle risposte di limitazione e interrompe forzatamente le richieste inviate alle API che sono ancora soggette a limitazione.

Ulteriori informazioni

Vedere anche