Limitación de las solicitudes de API

Completado

Es habitual que algunos usuarios sobreutilicen una API. A veces, se sobreutiliza tanto una API que se incurre en costes adicionales o se reduce la capacidad de respuesta a otros usuarios. Puede usar la limitación (limitación de velocidad) para ayudar a proteger los puntos de conexión de la API al restringir la cantidad de veces que se puede llamar a una API dentro de un período específico.

Por ejemplo, la API del censo se distribuye a muchas agencias gubernamentales, por lo que el número de llamadas a esta API puede ser considerable. Al aplicar una directiva de límite de frecuencia, podemos habilitar una respuesta rápida a todas las solicitudes, de modo que no sea posible que un solo cliente use todos los recursos para la API del censo.

En esta unidad, aprenderá a usar las directivas de API Management para imponer dos tipos de limitaciones.

Limitación por suscripción

La limitación por suscripción permite establecer los límites de frecuencia para una operación de API específica. No diferencia entre clientes. En su lugar, todas las solicitudes a la API o la operación especificada se limitan de la misma manera. Usando nuestro ejemplo de la API del censo, podríamos usar la limitación de suscripción para limitar la cantidad de veces que se llama a cualquiera de las API dentro de un período determinado. Con esta configuración, los clientes recibirían un error 429 cuando se alcanzara ese límite. El problema de este tipo de limitación es que permite que un cliente agote todas las solicitudes antes de que otro pueda usarlas.

Por ejemplo, el código siguiente muestra una configuración de ejemplo que se aplica a todas las operaciones de API. El límite se establece en tres llamadas por período de 15 segundos:

<rate-limit calls="3" renewal-period="15" />

Como alternativa, se puede usar esta configuración para centrarse en una operación de API determinada:

<rate-limit calls="number" renewal-period="seconds">
    <api name="API name" id="API id" calls="number" renewal-period="seconds" />
        <operation name="operation name" id="operation id" calls="number" renewal-period="seconds" />
    </api>
</rate-limit>

Limitación por clave

La limitación por clave le permite configurar distintos límites de frecuencia para cualquier valor de la solicitud del cliente. Este tipo de limitación ofrece una forma mejor de administrar los límites de frecuencia al aplicar el límite a una clave de solicitud especificada, que suele ser la dirección IP del cliente. Proporciona a todos los clientes el mismo ancho de banda para llamar a la API:

<rate-limit-by-key calls="number"
                   renewal-period="seconds"
                   increment-condition="condition"
                   counter-key="key value" />

La siguiente configuración de ejemplo limita el límite de frecuencia por la dirección IP de una solicitud. Aquí, el límite se establece en 10 llamadas por período de 60 segundos:

<rate-limit-by-key calls="10"
              renewal-period="60"
              increment-condition="@(context.Response.StatusCode == 200)"
              counter-key="@(context.Request.IpAddress)"/>

Cuando decida limitar por clave, tendrá que decidir los requisitos específicos para la limitación de la frecuencia. Por ejemplo, en la tabla siguiente se enumeran tres maneras habituales de especificar counter-key:

Valor Descripción
context.Request.IpAddress Frecuencia limitada según la dirección IP del cliente
context.Subscription.Id Frecuencia limitada según el identificador de suscripción
context.Request.Headers.GetValue("My-Custom-Header-Value") Frecuencia limitada según un valor de encabezado especificado de la solicitud del cliente

Puede decidir que cada IP de cliente individual tenga su propio ancho de banda establecido, en cuyo caso deberá usar context.Request.IpAddres. También puede limitar todas las solicitudes de un nombre de dominio determinado, ya que algunos dominios hacen muchas llamadas a la API. En ese caso, deberá especificar context.Request.Headers.GetValue("host"), que limitará la frecuencia según los dominios desde los que se realice la llamada.

Nota:

La directiva <rate-limit-by-key> no está disponible cuando la puerta de enlace de API Management está en el nivel de consumo. Puede usar <rate-limit> en su lugar.