Solución de problemas de errores de limitación de API

Las solicitudes de Azure Compute pueden limitarse en una suscripción y por región para ayudar con el rendimiento general del servicio. Nos aseguramos de que todas las llamadas al proveedor de recursos de proceso (CRP) de Azure, que administra los recursos en el espacio de nombres Microsoft.Compute, no superen la tasa máxima de solicitudes api permitidas. En este documento se describe la limitación de API, detalles sobre cómo solucionar problemas de limitación y procedimientos recomendados para evitar limitaciones.

Limitación por parte de Azure Resource Manager frente a proveedores de recursos

Como puerta principal de Azure, Azure Resource Manager realiza la autenticación y la validación y limitación de primer orden de todas las solicitudes DE API entrantes. Aquí se describen los límites de velocidad de llamada del Administrador de recursos de Azure y los encabezados HTTP de respuesta de diagnóstico relacionados.

Cuando un cliente de la API de Azure obtiene un error de limitación, el estado HTTP es 429 Demasiadas solicitudes. Para comprender si azure Resource Manager o un proveedor de recursos subyacente como CRP realizan la limitación de solicitudes, examine las solicitudes GET y los encabezados de respuesta en busca de solicitudes que no son x-ms-ratelimit-remaining-subscription-reads x-ms-ratelimit-remaining-subscription-writes GET. Si el recuento de llamadas restante se acerca a 0, se ha alcanzado el límite de llamadas general de la suscripción definido por Azure Resource Manager. Las actividades de todos los clientes de suscripción se cuentan juntas. De lo contrario, la limitación viene del proveedor de recursos de destino (el dirigido por el segmento de la dirección /providers/<RP> URL de la solicitud).

Encabezados de respuesta informativos de la tasa de llamadas

Encabezado Formato de valor Ejemplo Descripción
x-ms-ratelimit-remaining-resource <source RP>/<policy or bucket>;<count> Microsoft.Compute/HighCostGet3Min;159 Recuento de llamadas API restante para la directiva de limitación que cubre el depósito de recursos o el grupo de operaciones, incluido el destino de esta solicitud.
x-ms-request-charge <count> 1 El número de recuentos de llamadas "cargados" para esta solicitud HTTP hacia el límite de la directiva aplicable. Suele ser 1. Las solicitudes por lotes, como para escalar un conjunto de escalado de máquina virtual, pueden cargar varios recuentos.

Tenga en cuenta que una solicitud de API puede estar sujeta a varias directivas de limitación. Habrá un encabezado x-ms-ratelimit-remaining-resource independiente para cada directiva.

Esta es una respuesta de ejemplo para eliminar la solicitud de conjunto de escalado de máquina virtual.

x-ms-ratelimit-remaining-resource: Microsoft.Compute/DeleteVMScaleSet3Min;107 
x-ms-ratelimit-remaining-resource: Microsoft.Compute/DeleteVMScaleSet30Min;587 
x-ms-ratelimit-remaining-resource: Microsoft.Compute/VMScaleSetBatchedVMRequests5Min;3704 
x-ms-ratelimit-remaining-resource: Microsoft.Compute/VmssQueuedVMOperations;4720 

Detalles del error de limitación

El estado HTTP 429 se usa normalmente para rechazar una solicitud porque se alcanza un límite de velocidad de llamada. Una respuesta de error de limitación típica del proveedor de recursos de cálculo será como el ejemplo siguiente (solo se muestran encabezados relevantes):

HTTP/1.1 429 Too Many Requests
x-ms-ratelimit-remaining-resource: Microsoft.Compute/HighCostGet3Min;46
x-ms-ratelimit-remaining-resource: Microsoft.Compute/HighCostGet30Min;0
Retry-After: 1200
Content-Type: application/json; charset=utf-8
{
  "code": "OperationNotAllowed",
  "message": "The server rejected the request because too many requests have been received for this subscription.",
  "details": [
    {
      "code": "TooManyRequests",
      "target": "HighCostGet30Min",
      "message": "{\"operationGroup\":\"HighCostGet30Min\",\"startTime\":\"2018-06-29T19:54:21.0914017+00:00\",\"endTime\":\"2018-06-29T20:14:21.0914017+00:00\",\"allowedRequestCount\":800,\"measuredRequestCount\":1238}"
    }
  ]
}

La directiva con el recuento de llamadas restante de 0 es la que se debe al error de limitación. En este caso es HighCostGet30Min . El formato general del cuerpo de la respuesta es el formato de error general de la API de Azure Resource Manager (compatible con OData). El código de error principal, es el que usa el proveedor de recursos de proceso para notificar errores de limitación (entre otros OperationNotAllowed tipos de errores de cliente). La propiedad de los errores internos contiene una estructura JSON serializada con los detalles de la infracción message de limitación.

Como se ha ilustrado anteriormente, cada error de limitación incluye el encabezado, que proporciona el número mínimo de segundos que el cliente debe esperar antes de Retry-After reintentar la solicitud.

Analizador de errores de limitación y velocidad de llamadas api

Hay disponible una versión preliminar de una característica de solución de problemas para la API del proveedor de recursos de proceso. Estos cmdlets de PowerShell proporcionan estadísticas sobre la tasa de solicitudes api por intervalo de tiempo por operación e infracciones de limitación por grupo de operaciones (directiva):

Las estadísticas de llamadas api pueden proporcionar una gran información sobre el comportamiento de los clientes de una suscripción y facilitar la identificación de patrones de llamada que causan limitación.

Una limitación del analizador por el momento es que no cuenta las solicitudes de tipos de recursos de disco y instantánea (en compatibilidad con discos administrados). Dado que recopila datos de telemetría de CRP, tampoco puede ayudar a identificar errores de limitación de datos ARM. Sin embargo, estos pueden identificarse fácilmente en función de los encabezados ARM respuesta, como se mencionó anteriormente.

Los cmdlets de PowerShell usan una API de servicio REST, a la que los clientes pueden llamar fácilmente directamente (aunque aún no tienen soporte formal). Para ver el formato de solicitud HTTP, ejecute los cmdlets con -Debug switch o snoop en su ejecución con Fiddler.

Procedimientos recomendados

  • No reintente los errores de la API de servicio de Azure incondicionalmente o inmediatamente. Una ocurrencia común es que el código de cliente entre en un bucle de reintento rápido al encontrar un error que no es capaz de reintentar. Los reintentos agotarán el límite de llamadas permitido para el grupo de la operación de destino y afectarán a otros clientes de la suscripción.
  • En casos de automatización de API de alto volumen, considere la posibilidad de implementar la limitación automática proactiva del lado cliente cuando el recuento de llamadas disponible para un grupo de operaciones de destino caiga por debajo de algún umbral bajo.
  • Al realizar un seguimiento de las operaciones asincrónicas, respeta Retry-After sugerencias de encabezado.
  • Si el código de cliente necesita información sobre una máquina virtual determinada, consulte esa máquina virtual directamente en lugar de enumerar todas las máquinas virtuales del grupo de recursos que lo contiene o toda la suscripción y, a continuación, seleccione la máquina virtual necesaria en el lado cliente.
  • Si el código de cliente necesita máquinas virtuales, discos y instantáneas de una ubicación específica de Azure, use la forma basada en ubicación de la consulta en lugar de consultar todas las máquinas virtuales de suscripción y, a continuación, filtrar por ubicación en el lado cliente: consultar a los puntos de conexión regionales del proveedor de recursos de GET /subscriptions/<subId>/providers/Microsoft.Compute/locations/<location>/virtualMachines?api-version=2017-03-30 cálculo.
  • Al crear o actualizar recursos de API en particular, máquinas virtuales y conjuntos de escala de máquina virtual, es mucho más eficaz realizar un seguimiento de la operación asincrónica devuelta hasta la finalización que realizar sondeos en la propia dirección URL del recurso (en función del provisioningState ).

Siguientes pasos

Para obtener más información acerca de la guía de reintentos para otros servicios en Azure, vea la guía de reintentos para servicios específicos