Limitare le richieste API

Completato

Si riscontra di frequente un uso eccessivo di un'API da parte di alcuni utenti. A volte, l'uso eccessivo di un'API comporta costi aggiuntivi o una riduzione della velocità di risposta ad altri utenti. È possibile limitare le richieste (limitazione della frequenza) per proteggere gli endpoint API limitando il numero di chiamate all'API in un periodo specificato.

L'API Census, ad esempio, viene distribuita a numerose agenzie governative, quindi il numero di chiamate all'API può diventare significativo. Applicando un criterio di limitazione della frequenza, è possibile abilitare una risposta rapida a tutte le richieste in modo che non sia possibile per un singolo client usare tutte le risorse per l'API Census.

In questa unità si apprende come usare i criteri di Gestione API per imporre due tipi di limitazione delle richieste.

Limitazione in base alla sottoscrizione

La limitazione delle richieste in base alla sottoscrizione consente di impostare i limiti di velocità per un'operazione API specifica. Non fa distinzione in base al client. Ogni richiesta all'API o all'operazione specificata viene invece limitata allo stesso modo. Usando l'esempio dell'API Census, è possibile usare la limitazione in base alla sottoscrizione per limitare il numero di volte che una delle API viene chiamata in un determinato periodo di tempo. Questa configurazione determina nei client la ricezione di un errore 429 quando tale limite viene raggiunto. Il problema con questo tipo di limitazione è che consente a un solo client di usare tutte le richieste prima che le possa usare un altro client.

Ad esempio, il codice seguente illustra una configurazione di esempio valida per tutte le operazioni sulle API. Il limite è impostato su tre chiamate per un periodo di 15 secondi:

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

In alternativa, questa configurazione può essere usata per eseguire una determinata operazione sulle API:

<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>

Limitazione in base alle chiavi

La limitazione in base alle chiavi consente di configurare limiti di frequenza diversi secondo il valore della richiesta client. Questo tipo di limitazione offre un modo migliore per gestire i limiti di frequenza poiché applica il limite a una chiave di richiesta specificata, spesso l'indirizzo IP del client. Assegna a ogni client la stessa larghezza di banda per chiamare l'API:

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

Nell'esempio seguente la configurazione imposta il limite di frequenza in base all'indirizzo IP di una richiesta. In questo caso, il limite è impostato su 10 chiamate per un periodo di 60 secondi:

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

Quando si sceglie di applicare la limitazione in base alla chiave, è necessario stabilire requisiti specifici per la limitazione della frequenza. Ad esempio, nella tabella seguente sono indicati tre modi comuni per specificare il valore counter-key:

Valore Descrizione
context.Request.IpAddress Frequenze limitate dall'indirizzo IP del client
context.Subscription.Id Frequenze limitate dall'ID sottoscrizione
context.Request.Headers.GetValue("My-Custom-Header-Value") Frequenze limitate da un valore di intestazione della richiesta client specificato

È possibile scegliere di impostare una larghezza di banda specifica per ogni singolo IP client e in questo caso si usa context.Request.IpAddress. In alternativa, è possibile che si vogliano limitare tutte le richieste provenienti da un determinato nome di dominio poiché determinati domini hanno molte chiamate all'API. In questo caso è opportuno specificare context.Request.Headers.GetValue("host") che consente di limitare la frequenza in base ai domini da cui è stata effettuata la chiamata.

Nota

Il criterio <rate-limit-by-key> non è disponibile quando il gateway di Gestione API è nel livello a consumo. In alternativa, è possibile usare <rate-limit>.