Testar se meu aplicativo lida adequadamente com throttling

Dica

Novo para limitação? Saiba o que é limitação de taxa e como lidar com ela.

Visão geral
Objetivo: Testar como seu aplicativo lida com a limitação da API em qualquer API
Tempo: 15 minutos
Plugins:GenericRandomErrorPlugin, RetryAfterPlugin
Pré-requisitos:Configurar o Proxy de Desenvolvimento

Testar a limitação de taxa é difícil porque isso ocorre raramente, somente quando o servidor que hospeda a API está sob carga intensa. Usando o Dev Proxy, você pode simular a limitação de taxa em qualquer API e verificar se seu aplicativo lida corretamente com isso.

Para simular a limitação de taxa em qualquer API, use o GenericRandomErrorPlugin. Se a API que você usa retornar um cabeçalho Retry-After, use o RetryAfterPlugin para verificar se seu aplicativo aguarda o tempo indicado pela API antes de tentar novamente.

Simular limitação em qualquer API

Para começar, habilite o GenericRandomErrorPlugin no seu arquivo de configuração do Dev Proxy.

Arquivo: devproxyrc.json

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

Em seguida, configure o plug-in para usar um arquivo que contenha os erros que você deseja simular.

Arquivo: devproxyrc.json (com configuração errorsFile)

{
  "$schema": "https://raw.githubusercontent.com/dotnet/dev-proxy/main/schemas/v3.1.0/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.1.0/genericrandomerrorplugin.schema.json",
    "errorsFile": "errors-contoso-api.json"
  }
}

No arquivo de erros, defina a resposta de limitação de taxa para que ela corresponda à resposta real de limitação de taxa da sua API:

Arquivo: errors-contoso-api.json

{
  "$schema": "https://raw.githubusercontent.com/dotnet/dev-proxy/main/schemas/v3.1.0/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"
          }
        }
      ]
    }
  ]
}

Inicie o Dev Proxy com seu arquivo de configuração e teste seu aplicativo para ver como ele lida com a limitação.

Teste o recuo correto com o cabeçalho Retry-After

Muitas APIs usam o Retry-After cabeçalho de resposta para instruir o aplicativo a recuar por um período específico. Ao simular respostas de limitação de taxa usando o Dev Proxy, você pode configurar o cabeçalho Retry-After com um valor estático ou usar um valor dinâmico que verifica se o aplicativo está aguardando conforme instruído antes de voltar a chamar a API.

Para configurar o cabeçalho Retry-After com um valor estático, adicione o cabeçalho à sua resposta de limitação de taxa:

Arquivo: errors-contoso-api.json (com Retry-After estático)

{
  "$schema": "https://raw.githubusercontent.com/dotnet/dev-proxy/main/schemas/v3.1.0/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"
          }
        }
      ]
    }
  ]
}

Neste exemplo, o Retry-After cabeçalho é definido como 60 segundos. Quando você configura o cabeçalho para um valor estático, o Dev Proxy não controla se o aplicativo está aguardando antes de chamar a API novamente.

Para testar se o aplicativo está aguardando corretamente antes de chamar a API novamente, altere o valor do cabeçalho para @dynamic:

Arquivo: errors-contoso-api.json (com Retry-After dinâmico)

{
  "$schema": "https://raw.githubusercontent.com/dotnet/dev-proxy/main/schemas/v3.1.0/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"
          }
        }
      ]
    }
  ]
}

Além disso, amplie sua configuração do Dev Proxy com o RetryAfterPlugin.

Arquivo: devproxyrc.json (completo com RetryAfterPlugin)

{
  "$schema": "https://raw.githubusercontent.com/dotnet/dev-proxy/main/schemas/v3.1.0/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.1.0/genericrandomerrorplugin.schema.json",
    "errorsFile": "errors-contoso-api.json"
  }
}

Cuidado

Adicione o RetryAfterPlugin antes do GenericRandomErrorPlugin em seu arquivo de configuração. Se você o adicionar depois, a requisição falhará pelo GenericRandomErrorPlugin antes que o RetryAfterPlugin tenha a chance de tratá-la.

Esse plug-in acompanha as respostas de limitação e falha com força nas solicitações emitidas para APIs que ainda estão limitadas.

Mais informações

Consulte também