Compartilhar via


Solucionar problemas de desempenho em chamadas de API

Referindo-se ao blog sobre a série de solução de problemas do Gerenciamento de API do Azure, este é o quarto cenário do laboratório. Certifique-se de ter seguido as instruções de configuração do laboratório de acordo com isso, para recriar o problema.

Versão original do produto: Serviço de Gerenciamento de API
Número original do KB: 4464929

Sintomas

A API ProductStore no APIM se comunica com o endpoint de back-end (https://productstoreapp.azurewebsites.net) para criar, ler, atualizar e excluir registros facilmente como e quando necessário. No entanto, você pode enfrentar alguns problemas de desempenho e exceções ao invocar as operações de API listadas abaixo. Para facilitar o teste, mantenha apenas três produtos com IDs que variam de 1 a 3.

  • Uma das funções da API Products_GetAllProducts leva 5 segundos para retornar os resultados, enquanto o tempo de resposta esperado é inferior a um segundo.

  • Ao excluir um produto com qualquer um dos IDs mencionados acima (1 a 3), você está recebendo HTTP 500 - Erro interno do servidor com a mensagem abaixo chamando Products_DeleteProduct operação.

    {
    "Message": "Ocorreu um erro."
    }

  • Products_PutProduct operação que atualiza um produto está sendo limitada inesperadamente, lançando HTTP 429 - Muitas solicitações com a mensagem de erro abaixo, independentemente da ID do produto e do corpo da solicitação, que você envia na solicitação. Por exemplo, se o cliente atualizar o preço do produto de "Sopa de tomate" com ID do produto = 1 com o corpo Json abaixo, ele receberá o código de status HTTP 429.

    ID do parâmetro do modelo: 1
       Corpo da Solicitação: {"Nome": "Sopa de tomate","Categoria": "Mantimentos","Preço": 2.45}
       Corpo da resposta:
    {
    O limite da taxa é excedido. Tente novamente depois de algum tempo.
    }

Etapas para solucionar problemas

  • Ao solucionar problemas de desempenho, a melhor maneira de solucionar problemas de isolamento de falhas é capturar [rastreamento do inspetor APIM que mostra o tempo gasto em cada seção (Entrada / Backend / Saída).

  • Se você analisar o rastreamento do API Inspector para o primeiro problema, notará que a seção Backend está demorando a maior parte do tempo (aprox. 5 segundos), o que significa que há alguma lentidão ou operação de longa duração está ocorrendo no back-end.

    "source": "solicitação de encaminhamento",
    "timestamp": "2018-07-29T16:16:46.6615081Z",
    "decorrido": "00:00:05.5844430","data": {
    "resposta": {
    "status": {
    "código": 200,
    "reason": "OK"
    }

  • Depois de isolar que a lentidão está no back-end, você precisa investigar o código do aplicativo de back-end do aplicativo de API Web. Para cenários em que você não tem acesso ao back-end, você pode implementar o cache no nível do APIM, como abaixo. Leia sobre como você pode implementar políticas de cache para melhorar o desempenho no Gerenciamento de API do Azure.

    <?xml version="1.0" encoding="UTF-8"?>
    <policies>
       <inbound>
          <base />
          <cache-lookup vary-by-developer="true" vary-by-developer-groups="true" must-revalidate="true" downstream-caching-type="public" />
       </inbound>
       <backend>
          <base />
       </backend>
       <outbound>
          <base />
          <cache-store duration="60" />
       </outbound>
       <on-error>
          <base />
       </on-error>
    </policies>
    
  • Para o segundo problema (HTTP 500 - Erro interno do servidor), siga o mesmo procedimento de análise do rastreamento do inspetor APIM e devemos ver o código de status HTTP 500 no atributo de resposta 'forward-request'.

  • Isso significa que a API de back-end retornou HTTP 500 devido a alguma exceção não tratada que ocorreu no código de back-end, não há problema no nível do APIM.

    solicitação de encaminhamento (841.060 ms)
    {
    "resposta": {
    "status": {
    "código": 500,
    "reason": "Erro interno do servidor"
    }

  • Para o terceiro problema (HTTP 429 - Muitas solicitações), parece que você está atingindo o limite de taxa de chamadas da API. Provavelmente você pode verificar se há alguma política de 'limite de taxa' ou 'limite de taxa por chave' implementada no nível da operação.

  • Se você não conseguir encontrar nenhuma dessas políticas no nível da operação, clique no botão Calcular política efetiva, que mostrará todas as políticas herdadas de vários níveis, como se você tivesse algumas políticas no nível do produto que podem causar esse problema.

  • Aqui você deve observar que algumas políticas são implementadas no nível da API, o que não limita realmente a taxa de chamada da API, mas imita sua ação retornando uma resposta personalizada de volta ao cliente usando as políticas 'return-response' e 'set-status' na seção de saída.

    <?xml version="1.0" encoding="UTF-8"?>
    <outbound>
       <!--base: Begin Api scope-->
       <return-response>
          <set-status code="429" reason="Too many requests" />
          <set-body><![CDATA[{
    
    Rate limit is exceeded. Try again after some time.
    
    }]]></set-body>
       </return-response>
       <!--base: End Api scope-->
    </outbound>
    

Entre em contato conosco para obter ajuda

Se você tiver dúvidas ou precisar de ajuda, crie uma solicitação de suporte ou peça ajuda à comunidade de suporte do Azure. Você também pode enviar comentários sobre o produto para a comunidade de comentários do Azure.