Limitazione avanzata delle richieste con Gestione API di AzureAdvanced request throttling with Azure API Management

La possibilità di limitare le richieste in ingresso è uno dei ruoli fondamentali di Gestione API di Azure.Being able to throttle incoming requests is a key role of Azure API Management. Tramite il controllo della frequenza delle richieste o del totale delle richieste o dei dati trasferiti, Gestione API consente ai provider di API di proteggere le API da abusi e di aggiungere valore a diversi livelli di prodotto API.Either by controlling the rate of requests or the total requests/data transferred, API Management allows API providers to protect their APIs from abuse and create value for different API product tiers.

Limitazione basata sul prodottoProduct based throttling

Finora le funzionalità di limitazione della frequenza avevano come ambito una sottoscrizione specifica a un prodotto (essenzialmente una chiave), definita nel portale di pubblicazione di Gestione API.To date, the rate throttling capabilities have been limited to being scoped to a particular Product subscription (essentially a key), defined in the API Management publisher portal. Tali funzionalità sono utili per consentire al provider di API di applicare limiti agli sviluppatori che si sono registrati per l'uso dell'API, ma non consente di limitare ad esempio i singoli utenti finali dell'API.This is useful for the API provider to apply limits on the developers who have signed up to use their API, however, it does not help, for example, in throttling individual end-users of the API. Il singolo utente dell'applicazione dello sviluppatore può usare l'intera quota e quindi impedire ad altri clienti dello sviluppatore di usare l'applicazione.It is possible that for single user of the developer's application to consume the entire quota and then prevent other customers of the developer from being able to use the application. Inoltre, alcuni clienti possono generare un numero elevato di richieste, limitando l'accesso agli utenti occasionali.Also, several customers who might generate a high volume of requests may limit access to occasional users.

Limitazione basata su chiave personalizzataCustom key based throttling

I nuovi criteri rate-limit-by-key e quota-by-key offrono una soluzione molto più flessibile per il controllo del traffico.The new rate-limit-by-key and quota-by-key policies provide a significantly more flexible solution to traffic control. Questi nuovi criteri consentono di definire le espressioni per l'identificazione delle chiavi che verranno usate per tenere traccia dell'utilizzo del traffico.These new policies allow you to define expressions to identify the keys that will be used to track traffic usage. Il modo più semplice per spiegarne il funzionamento è illustrare un esempio.The way this works is easiest illustrated with an example.

Limitazione dell'indirizzo IPIP Address throttling

I seguenti criteri limitano l'indirizzo IP di un singolo client a 10 chiamate al minuto, con un totale di 1.000.000 chiamate e 10.000 KB di larghezza di banda al mese.The following policies restrict a single client IP address to only 10 calls every minute, with a total of 1,000,000 calls and 10,000 kilobytes of bandwidth per month.

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

<quota-by-key calls="1000000"
          bandwidth="10000"
          renewal-period="2629800"
          counter-key="@(context.Request.IpAddress)" />

Se tutti i client su Internet usassero un indirizzo IP univoco, sarebbe un metodo efficace per limitare l'utilizzo per utente.If all clients on the Internet used a unique IP address, this might be an effective way of limiting usage by user. È tuttavia molto probabile che più utenti condividano un singolo indirizzo IP pubblico, in quanto accedono a Internet tramite un dispositivo NAT.However, it is quite likely that multiple users will sharing a single public IP address due to them accessing the Internet via a NAT device. Nonostante ciò, per le API che consentono l'accesso non autenticato, IpAddress può essere la soluzione migliore.Despite this, for APIs that allow unauthenticated access the IpAddress might be the best option.

Limitazione dell'identità utenteUser identity throttling

Se un utente finale viene autenticato, può essere generata una chiave per la limitazione delle richieste in base alle informazioni che identificano in modo univoco l'utente.If an end user is authenticated then a throttling key can be generated based on information that uniquely identifies an that user.

<rate-limit-by-key calls="10"
    renewal-period="60"
    counter-key="@(context.Request.Headers.GetValueOrDefault("Authorization","").AsJwt()?.Subject)" />

In questo esempio si estrae l'intestazione dell'autorizzazione, la si converte in un oggetto JWT e si usa l'oggetto del token per identificare l'utente e usarlo come chiave per la limitazione della frequenza.In this example we extract the Authorization header, convert it to JWT object and use the subject of the token to identify the user and use that as the rate limiting key. Se l'identità dell'utente è archiviata nell'oggetto JWT come una delle altre attestazioni, è possibile sostituirla con quel valore.If the user identity is stored in the JWT as one of the other claims then that value could be used in its place.

Criteri combinatiCombined policies

Sebbene i nuovi criteri di limitazione garantiscano maggiore controllo rispetto ai criteri di limitazione esistenti, la combinazione delle due funzionalità presenta comunque dei vantaggi.Although the new throttling policies provide more control than the existing throttling policies, there is still value combining both capabilities. La limitazione per chiave di sottoscrizione del prodotto (Limit call rate by subscription (Limitare la frequenza delle chiamate per sottoscrizione) e Set usage quota by subscription (Impostare la quota di utilizzo per sottoscrizione)) è un ottimo metodo per monetizzare un'API effettuando gli addebiti in base ai livelli di utilizzo.Throttling by product subscription key (Limit call rate by subscription and Set usage quota by subscription) is a great way to enable monetizing of an API by charging based on usage levels. Il controllo con granularità maggiore per impostare la limitazione per utente è complementare e impedisce che il comportamento di un utente comprometta l'esperienza di un altro utente.The finer grained control of being able to throttle by user is complementary and prevents one user's behavior from degrading the experience of another.

Limitazione basata su clientClient driven throttling

Quando la chiave per la limitazione viene definita mediante un' espressione di criteri, è il provider di API a scegliere l'ambito della limitazione.When the throttling key is defined using a policy expression, then it is the API provider that is choosing how the throttling is scoped. Uno sviluppatore può tuttavia voler controllare la modalità di limitazione della frequenza per i propri clienti.However, a developer might want to control how they rate limit their own customers. Il provider di API può abilitare questa opzione introducendo un'intestazione personalizzata per consentire all'applicazione client dello sviluppatore di comunicare la chiave all'API.This could be enabled by the API provider by introducing a custom header to allow the developer's client application to communicate the key to the API.

<rate-limit-by-key calls="100"
          renewal-period="60"
          counter-key="@(request.Headers.GetValueOrDefault("Rate-Key",""))"/>

In questo modo l'applicazione client dello sviluppatore è in grado di scegliere la modalità di creazione della chiave di limitazione della frequenza.This enables the developer's client application to choose how they want to create the rate limiting key. Con un po' di astuzia, uno sviluppatore di client può creare i propri livelli di frequenza allocando set di chiavi agli utenti e ruotando l'utilizzo delle chiavi.With a little bit of ingenuity a client developer could create their own rate tiers by allocating sets of keys to users and rotating the key usage.

SummarySummary

Gestione API di Azure offre funzionalità di limitazione della frequenza e della quota per proteggere e aggiungere valore al proprio servizio API.Azure API Management provides rate and quote throttling to both protect and add value to your API service. I nuovi criteri di limitazione con regole personalizzate di definizione dell'ambito consentono di controllare con granularità maggiore tali criteri per consentire ai clienti di creare applicazioni migliori.The new throttling policies with custom scoping rules allow you finer grained control over those policies to enable your customers to build even better applications. Gli esempi in questo articolo illustrano l'uso di questi nuovi criteri tramite la produzione di chiavi per la limitazione della frequenza con gli indirizzi IP del client, l'identità dell'utente e valori generati dal client.The examples in this article demonstrate the use of these new policies by manufacturing rate limiting keys with client IP addresses, user identity, and client generated values. È tuttavia possibile usare molte altre parti del messaggio, ad esempio l'agente utente, frammenti del percorso dell'URL e la dimensione del messaggio.However, there are many other parts of the message that could be used such as user agent, URL path fragments, message size.

Passaggi successiviNext steps

È possibile inserire commenti e suggerimenti per questo argomento nel thread Disqus.Please give us your feedback in the Disqus thread for this topic. Può essere utile individuare altri potenziali valori di chiave che sono utili negli scenari in uso.It would be great to hear about other potential key values that have been a logical choice in your scenarios.

Video contenente una panoramica di questi criteriWatch a video overview of these policies

Per altre informazioni sui criteri rate-limit-by-key e quota-by-key descritti in questo articolo, guardare il video seguente.For more information on the rate-limit-by-key and quota-by-key policies covered in this article, please watch the following video.