Solución de problemas de rendimiento en llamadas API
En el blog de la serie de solución de problemas de Azure API Management, este es el cuarto escenario del laboratorio. Asegúrese de que ha seguido las instrucciones de configuración del laboratorio según esto para volver a crear el problema.
Versión original del producto: servicio API Management
Número de KB original: 4464929
Síntomas
Api ProductStore en APIM se comunica con el punto de conexión de back-end (https://productstoreapp.azurewebsites.net
) para crear, leer, actualizar y eliminar registros fácilmente según sea necesario. Sin embargo, es posible que se produzcan algunos problemas de rendimiento y excepciones al invocar las operaciones de API que se enumeran a continuación. Para facilitar las pruebas, mantenga solo tres productos con identificadores que van de 1 a 3.
Una de las funciones de API Products_GetAllProducts tarda 5 segundos en devolver los resultados, mientras que el tiempo de respuesta esperado es menor que un segundo.
Al eliminar un producto que tiene cualquiera de los identificadores mencionados anteriormente (de 1 a 3), recibe HTTP 500: error interno del servidor con el siguiente mensaje llamando a Products_DeleteProduct operación.
{
"Mensaje": "Se ha producido un error".
}Products_PutProduct operación que actualiza un producto se está limitando inesperadamente, iniciando HTTP 429: demasiadas solicitudes con el siguiente mensaje de error, independientemente del identificador de producto y el cuerpo de la solicitud, que envíe en la solicitud. Por ejemplo, si el cliente actualiza el precio del producto de "Sopa de tomate" con el identificador de producto = 1 con el cuerpo json siguiente, obtiene el código de estado HTTP 429.
Identificador de parámetro de plantilla: 1
Cuerpo de la solicitud: {"Name": "Sopa de tomate","Categoría": "Comestibles","Precio": 2.45}
Cuerpo de la respuesta:
{
Rate limit is exceeded. (El límite de velocidad se ha excedido.) vuelva a intentarlo más tarde.
}
Pasos para solucionar problemas
Al solucionar problemas de rendimiento, la mejor técnica de aislamiento de errores es capturar [seguimiento del inspector de APIM que muestra el tiempo necesario en cada sección (entrante/ back-end/saliente).
Si analiza el seguimiento del Inspector de API para el primer problema, observaría que la sección back-end tarda la mayor parte del tiempo (aprox. 5 segundos), lo que significa que hay cierta lentitud o una operación de larga duración que se está llevando a cabo en el back-end.
"source": "forward-request",
"timestamp": "2018-07-29T16:16:46.6615081Z",
"transcurrido": "00:00:05.5844430","data": {
"response": {
"status": {
"code": 200,
"reason": "OK"
}Una vez que haya aislado que la lentitud está en el back-end, debe investigar el código de la aplicación back-end de la aplicación de API web. En escenarios en los que no tiene acceso al back-end, puede implementar el almacenamiento en caché en el nivel de APIM como el siguiente. Obtenga información sobre cómo puede implementar directivas de almacenamiento en caché para mejorar el rendimiento en Azure API Management.
<?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 el segundo problema (HTTP 500 : error interno del servidor), siga el mismo procedimiento para analizar el seguimiento del inspector de APIM y deberíamos ver el código de estado HTTP 500 en el atributo de respuesta "forward-request".
Esto significa que la API de back-end devolvió HTTP 500 debido a que se produjo alguna excepción no controlada en el código de back-end, no hay ningún problema en el nivel de APIM.
forward-request (841.060 ms)
{
"response": {
"status": {
"code": 500,
"reason": "Error interno del servidor"
}Para el tercer problema (HTTP 429 : demasiadas solicitudes), parece que se alcanza el límite de frecuencia de llamadas de API. Probablemente puede comprobar si hay alguna directiva "rate-limit" o "rate-limit-by-key" implementada en el nivel de operación.
Si no encuentra estas directivas en el nivel de operación, haga clic en el botón Calcular directiva efectiva, que mostrará todas las directivas heredadas de varios niveles, como puede tener algunas directivas en el nivel de producto que pueden causar este problema.
Aquí debe observar que algunas directivas se implementan en el nivel de API que no limitan realmente la tasa de llamadas api, pero imita su acción devolviendo una respuesta personalizada al cliente mediante las directivas "return-response" y "set-status" en la sección de salida.
<?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>
Ponte en contacto con nosotros para obtener ayuda
Si tiene preguntas o necesita ayuda, cree una solicitud de soporte o busque consejo en la comunidad de Azure. También puede enviar comentarios sobre el producto con los comentarios de la comunidad de Azure.