Stai visualizzando la documentazione di Apigee Edge.
Consulta la
documentazione di Apigee X. info

Il criterio SpikeArrest protegge dai picchi di traffico con l'elemento <Rate>
. Questo
elemento limita il numero di richieste elaborate da un proxy API e inviate a un backend, proteggendo da ritardi nelle prestazioni e tempi di inattività.
Elemento <SpikeArrest>
Definisce il criterio SpikeArrest.
Valore predefinito | Consulta la scheda Policy predefinita di seguito. |
Obbligatorio? | Facoltativo |
Tipo | Complex object |
Elemento principale | n/a |
Elementi secondari |
<Identifier> <MessageWeight> <Rate> (obbligatorio)<UseEffectiveCount> |
Sintassi
L'elemento <SpikeArrest>
utilizza la seguente sintassi:
<SpikeArrest continueOnError="[false|true]" enabled="[true|false]" name="policy_name" > <DisplayName>display_name</DisplayName> <Properties/> <Identifier ref="flow_variable"/> <MessageWeight ref="flow_variable"/> <Rate ref="flow_variable">rate[pm|ps]</Rate> <UseEffectiveCount>[false|true]</UseEffectiveCount> </SpikeArrest>
Norme predefinite
L'esempio seguente mostra le impostazioni predefinite quando aggiungi un criterio SpikeArrest al tuo flusso nell'interfaccia utente Edge:
<SpikeArrest async="false" continueOnError="false" enabled="true" name="Spike-Arrest-1"> <DisplayName>Spike Arrest-1</DisplayName> <Properties/> <Identifier ref="request.header.some-header-name"/> <MessageWeight ref="request.header.weight"/> <Rate>30ps</Rate> <UseEffectiveCount>true</UseEffectiveCount> </SpikeArrest>
Questo elemento ha i seguenti attributi comuni a tutti i criteri:
Attributo | Predefinita | Obbligatorio? | Description (Descrizione) |
---|---|---|---|
name |
N/A | Obbligatorio |
Il nome interno del criterio. Il valore dell'attributo Facoltativamente, utilizza l'elemento |
continueOnError |
false | Facoltativo | Imposta su "false" per restituire un errore quando un criterio non va a buon fine. Si tratta di un comportamento previsto per la maggior parte dei criteri. Impostalo su "true" per far sì che l'esecuzione del flusso continui anche dopo l'esito negativo di un criterio. |
enabled |
true | Facoltativo | Imposta su "true" per applicare il criterio. Imposta su "false" per "disattivare" il criterio. Il criterio non verrà applicato anche se rimane collegato a un flusso. |
async |
false | Deprecazione | Questo attributo è obsoleto. |
Esempi
I seguenti esempi mostrano alcuni modi in cui puoi utilizzare il criterio SpikeArrest:
Esempio 1
L'esempio seguente imposta la frequenza su cinque al secondo:
<SpikeArrest name="Spike-Arrest-1"> <Rate>5ps</Rate> </SpikeArrest>
Il criterio uniforma la velocità a una richiesta consentita ogni 200 millisecondi (1000/5).
Esempio 2
L'esempio seguente imposta la velocità a 300 al minuto:
<SpikeArrest async="false" continueOnError="false" enabled="true" name="SpikeArreast"> <DisplayName>SpikeArreast</DisplayName> <Rate>300pm</Rate> </SpikeArrest>
La velocità effettiva è di 300 al minuto, il che significa che viene aggiunto un nuovo token al bucket ogni 200 millisecondi. La dimensione del bucket è sempre configurata in modo che sia il 10% di messagesPerPeriod
. Pertanto, con un messagesPerPeriod
di 300, la dimensione del bucket è di 30 token.
Esempio 3
L'esempio seguente limita le richieste a 12 al minuto (una richiesta consentita ogni cinque secondi o 60/12):
<SpikeArrest name="Spike-Arrest-1"> <Rate>12pm</Rate> <Identifier ref="client_id" /> <MessageWeight ref="request.header.weight" /> </SpikeArrest>
Inoltre, l'elemento <MessageWeight>
accetta un valore personalizzato (l'intestazione
weight
) che regola i pesi dei messaggi per app o client specifici. Ciò
fornisce un controllo aggiuntivo sulla limitazione per le entità identificate con l'elemento
<Identifier>
.
Esempio 4
L'esempio seguente indica a Spike Arrest di cercare un valore di runtime impostato tramite la
richiesta passata come variabile di flusso request.header.runtime_rate
:
<SpikeArrest name="Spike-Arrest-1"> <Rate ref="request.header.runtime_rate" /> </SpikeArrest>
Il valore della variabile di flusso deve essere nel formato intpm
o
intps
.
Per provare questo esempio, esegui una richiesta come la seguente:
curl http://myorg-myenv.apigee.net/price -H 'runtime_rate:30ps'
Riferimento all'elemento secondario
Questa sezione descrive gli elementi secondari di <SpikeArrest>
.
<DisplayName>
Utilizza questo attributo in aggiunta all'attributo name
per etichettare il criterio nell'editor proxy dell'interfaccia utente di gestione con un nome diverso e più naturale.
L'elemento <DisplayName>
è comune a tutti i criteri.
Valore predefinito | n/a |
Obbligatorio? | Facoltativo. Se ometti <DisplayName> , viene utilizzato il valore dell'attributo name del criterio. |
Tipo | Stringa |
Elemento principale | <PolicyElement> |
Elementi secondari | Nessuno |
L'elemento <DisplayName>
utilizza la seguente sintassi:
Sintassi
<PolicyElement> <DisplayName>policy_display_name</DisplayName> ... </PolicyElement>
Esempio
<PolicyElement> <DisplayName>My Validation Policy</DisplayName> </PolicyElement>
L'elemento <DisplayName>
non ha attributi o elementi secondari.
<Identifier>
Consente di scegliere come raggruppare le richieste in modo che il criterio SpikeArrest possa essere applicato in base al client. Ad esempio, puoi raggruppare le richieste per ID sviluppatore, nel qual caso le richieste di ciascun sviluppatore verranno conteggiate ai fini del proprio tasso di Spike Arrest e non tutte le richieste al proxy.
Utilizzalo in combinazione con l'elemento <MessageWeight>
per un controllo più granulare
della limitazione delle richieste.
Se lasci vuoto l'elemento <Identifier>
, viene applicato un limite di frequenza a tutte le richieste
nel proxy API.
Valore predefinito | n/a |
Obbligatorio? | Facoltativo |
Tipo | Stringa |
Elemento principale |
<SpikeArrest>
|
Elementi secondari | Nessuno |
Sintassi
<SpikeArrest continueOnError="[false|true]" enabled="[true|false]" name="policy_name" > <Identifier ref="flow_variable"/> </SpikeArrest>
Esempio 1
Il seguente esempio applica il criterio SpikeArrest per ID sviluppatore:
<SpikeArrest name="Spike-Arrest-1"> <Identifier ref="developer.id"/> <Rate>42pm</Rate/> </SpikeArrest>
La tabella seguente descrive gli attributi di <Identifier>
:
Attributo | Descrizione | Predefinito | Presenza |
---|---|---|---|
ref |
Identifica la variabile in base alla quale Spike Arrest raggruppa le richieste in entrata. Puoi utilizzare qualsiasi variabile di flusso per indicare un client univoco, ad esempio quelle disponibili con il criterio VerifyAPIKey. Puoi anche impostare variabili personalizzate utilizzando il criterio JavaScript o il criterio AssignMessage. | n/a | Obbligatorio |
Questo elemento è trattato anche nel seguente post della community Apigee: http://community.apigee.com/questions/2807/how-does-the-edge-quota-policy-work-when-no-identi.html.
<MessageWeight>
Specifica la ponderazione definita per ogni messaggio. Il peso del messaggio modifica l'impatto di una singola richiesta sul calcolo del tasso di Spike Arrest. Il peso del messaggio può essere qualsiasi variabile di flusso, ad esempio un'intestazione HTTP, un parametro di query, un parametro del modulo o il contenuto del corpo del messaggio. Puoi anche utilizzare variabili personalizzate utilizzando il criterio JavaScript o il criterio AssignMessage.
Utilizzalo in combinazione con <Identifier>
per limitare ulteriormente le richieste in base a
client o app specifici.
Ad esempio, se Spike Arrest <Rate>
è 10pm
e un'app invia
richieste con un peso di 2
, sono consentiti solo cinque messaggi al minuto da
quel client perché ogni richiesta conta come 2.
Valore predefinito | n/a |
Obbligatorio? | Facoltativo |
Tipo | Numero intero |
Elemento principale |
<SpikeArrest>
|
Elementi secondari | Nessuno |
Sintassi
<SpikeArrest continueOnError="[false|true]" enabled="[true|false]" name="policy_name" > <MessageWeight ref="flow_variable"/> </SpikeArrest>
Esempio 1
L'esempio seguente limita le richieste a 12 al minuto (una richiesta consentita ogni cinque secondi o 60/12):
<SpikeArrest name="Spike-Arrest-1"> <Rate>12pm</Rate> <Identifier ref="client_id" /> <MessageWeight ref="request.header.weight" /> </SpikeArrest>
In questo esempio, <MessageWeight>
accetta un valore personalizzato (l'intestazione weight
nella richiesta) che regola i pesi dei messaggi per client specifici. Ciò
fornisce un controllo aggiuntivo sulla limitazione per le entità identificate con l'elemento
<Identifier>
.
La tabella seguente descrive gli attributi di <MessageWeight>
:
Attributo | Descrizione | Presenza | Predefinito |
---|---|---|---|
ref |
Identifica la variabile di flusso che contiene il peso del messaggio per il client specifico. Può essere qualsiasi variabile di flusso, ad esempio un parametro di query HTTP, un'intestazione o il contenuto del corpo del messaggio. Per ulteriori informazioni, consulta la sezione Riferimento alle variabili di flusso. Puoi anche impostare variabili personalizzate utilizzando il criterio JavaScript o il criterio AssignMessage. | Obbligatorio | N/D |
<Rate>
Specifica la velocità con cui limitare i picchi (o i burst) di traffico impostando il numero di
richieste consentite a intervalli di minuti o secondi. Puoi utilizzare questo elemento anche in
combinazione con <Identifier>
e <MessageWeight>
per
limitare il traffico in modo fluido in fase di runtime accettando i valori del client.
Valore predefinito | n/a |
Obbligatorio? | Obbligatorio |
Tipo | Numero intero |
Elemento principale |
<SpikeArrest>
|
Elementi secondari | Nessuno |
Sintassi
Puoi specificare le tariffe in uno dei seguenti modi:
- Una tariffa statica che specifichi come corpo dell'elemento
<Rate>
- Un valore variabile, che può essere passato dal client; identifica il
nome della variabile di flusso utilizzando l'attributo
ref
<SpikeArrest continueOnError="[false|true]" enabled="[true|false]" name="policy_name" > <Rate ref="flow_variable">rate[pm|ps]</Rate> </SpikeArrest>
I valori di tasso validi (definiti come valore di variabile o nel corpo dell'elemento) devono rispettare il seguente formato:
intps
(numero di richieste al secondo, suddivise in intervalli di millisecondi)intpm
(numero di richieste al minuto, uniformato in intervalli di secondi)
Il valore di int deve essere un numero intero positivo diverso da zero.
Esempio 1
L'esempio seguente imposta la frequenza su cinque richieste al secondo:
<SpikeArrest name="Spike-Arrest-1"> <Rate>5ps</Rate> </SpikeArrest>
Il criterio uniforma la velocità a una richiesta consentita ogni 200 millisecondi (1000/5).
Esempio 2
L'esempio seguente imposta la velocità a 12 richieste al minuto:
<SpikeArrest async="false" continueOnError="false" enabled="true" name="SpikeArreast"> <DisplayName>SpikeArreast</DisplayName> <Rate>300pm</Rate> </SpikeArrest>
Questa norma di esempio uniforma la frequenza a una richiesta consentita ogni cinque secondi (60/12).
La tabella seguente descrive gli attributi di <Rate>
:
Attributo | Descrizione | Presenza | Predefinito |
---|---|---|---|
ref |
Identifica una variabile di flusso che specifica la tariffa. Può trattarsi di qualsiasi variabile di flusso, ad esempio un parametro di query HTTP, un'intestazione o il contenuto del corpo del messaggio oppure un valore come una KVM. Per ulteriori informazioni, consulta Riferimento alle variabili di flusso.
Puoi anche utilizzare variabili personalizzate utilizzando il criterio JavaScript o il criterio AssignMessage. Se definisci sia Ad esempio: <Rate ref="request.header.custom_rate">1pm</Rate> In questo esempio, se il client non trasmette un'intestazione "custom_rate", la frequenza per il proxy API è di 1 richiesta al minuto per tutti i client. Se il client passa un'intestazione "custom_rate", il limite di frequenza diventa di 10 richieste al secondo per tutti i client sul proxy, finché non viene inviata una richiesta senza l'intestazione "custom_rate". Puoi utilizzare Se specifichi un valore per |
Facoltativo | n/a |
<UseEffectiveCount>
Distribuisce i conteggi di Spike Arrest tra i processori di messaggi (MP) quando vengono utilizzati gruppi di scalabilità automatica.
Sintassi
<SpikeArrest continueOnError="[false|true]" enabled="[true|false]" name="policy_name" > <UseEffectiveCount>[false|true]</UseEffectiveCount> </SpikeArrest>
Esempio 1
L'esempio seguente imposta <UseEffectiveCount>
su true:
<SpikeArrest name='Spike-Arrest-1'> <Rate>40ps</Rate> <UseEffectiveCount>true</UseEffectiveCount> </SpikeArrest>
L'elemento <UseEffectiveCount>
è facoltativo. Il valore predefinito è false
quando l'elemento viene omesso dalla policy Spike Arrest.
Valore predefinito | Falso |
Obbligatorio? | Facoltativo |
Tipo | Booleano |
Elemento principale |
<SpikeArrest>
|
Elementi secondari | Nessuno |
La tabella seguente descrive gli attributi dell'elemento <UseEffectiveCount>
:
Attributo | Descrizione | Predefinito | Presenza |
---|---|---|---|
ref |
Identifica la variabile che contiene il valore di <UseEffectiveCount> . Può essere
qualsiasi variabile di flusso, ad esempio un parametro di query HTTP, un'intestazione o il contenuto del corpo del messaggio. Per ulteriori
informazioni, consulta la Guida di riferimento alle variabili di flusso. Puoi anche impostare variabili personalizzate
utilizzando il criterio JavaScript o il criterio AssignMessage. |
n/a | Facoltativo |
L'effetto di <UseEffectiveCount>
dipende dal suo valore:
true
: il limite di picco di un MP è il<Rate>
diviso per il numero attuale di MP nello stesso pod. Il limite aggregato è il valore di<Rate>
. Quando i MP vengono aggiunti (o rimossi) in modo dinamico, i limiti di frequenza individuali aumentano (o diminuiscono), ma il limite aggregato rimane invariato.false
: Il limite del tasso di picco di ogni MP è semplicemente il valore del relativo<Rate>
. Il limite aggregato è la somma delle tariffe di tutti i MP. Quando vengono aggiunti (o rimossi) MP, i limiti individuali del tasso di picco rimarranno invariati, ma il limite aggregato aumenterà (o diminuirà).
Il criterio SpikeArrest utilizza un algoritmo "token bucket" che attenua i picchi di traffico dividendo il limite di frequenza specificato in intervalli più piccoli. Uno svantaggio di questo approccio è che più richieste legittime ricevute in un breve intervallo di tempo possono essere potenzialmente rifiutate.
Ad esempio, supponiamo che tu inserisca una frequenza di 30 pm (30 richieste al minuto). Durante il test, potresti pensare di poter inviare 30 richieste in 1 secondo, purché rientrino in un minuto. Tuttavia, non è così che la norma applica l'impostazione. Se ci pensi, 30 richieste in un periodo di 1 secondo potrebbero essere considerate un mini picco in alcuni ambienti.
- Le tariffe al minuto vengono uniformate in richieste complete consentite a intervalli di secondi.
Ad esempio, 30pm viene uniformato in questo modo:
60 secondi (1 minuto) / 30pm = intervalli di 2 secondi o 1 richiesta consentita ogni 2 secondi. Una seconda richiesta entro 2 secondi non andrà a buon fine. Inoltre, una 31ª richiesta entro un minuto non andrà a buon fine. - Le tariffe al secondo vengono uniformate in richieste complete consentite a intervalli di millisecondi.
Ad esempio, 10ps viene uniformato in questo modo:
1000 millisecondi (1 secondo) / 10ps = intervalli di 100 millisecondi o 1 richiesta consentita ogni 100 millisecondi. Una seconda richiesta entro 100 ms non andrà a buon fine. Inoltre, l'undicesima richiesta entro un secondo non andrà a buon fine.
La tabella seguente mostra l'effetto di <UseEffectiveCount>
sul limite di frequenza effettivo di
ogni MP:
Valore di <UseEffectiveCount> |
||||||
---|---|---|---|---|---|---|
false |
false |
false |
true |
true |
true |
|
N. di punti di monitoraggio | 8 | 4 | 2 | 8 | 4 | 2 |
Valore di <Rate> |
10 | 10 | 10 | 40 | 40 | 40 |
Tariffa effettiva per MP | 10 | 10 | 10 | 5 | 10 | 20 |
Limite aggregato | 80 | 40 | 20 | 40* | 40* | 40* |
* Uguale a <Rate> . |
In questo esempio, nota che quando il numero di MP viene ridotto da 4 a 2 e
<UseEffectiveCount>
è false
, la tariffa effettiva per MP rimane invariata (a
10). Tuttavia, quando <UseEffectiveCount>
è true
, la tariffa effettiva per MP passa da
10 a 20 quando il numero di MP viene ridotto da 4 a 2.
Variabili di flusso
Quando viene eseguito un criterio Spike Arrest, viene compilata la seguente variabile di flusso:
Variabile | Tipo | Autorizzazione | Descrizione |
---|---|---|---|
ratelimit.policy_name.failed |
Booleano | Sola lettura | Indica se il criterio non è stato rispettato (true o
false ). |
Per ulteriori informazioni, consulta Riferimento alle variabili di flusso.
Messaggi di errore
Questa sezione descrive i codici e i messaggi di errore restituiti, nonché le variabili di errore. impostate da Edge quando questo criterio attiva un errore. È importante sapere se stai sviluppando regole di errore per per gestire gli errori. Per saperne di più, vedi Cosa devi sapere sugli errori relativi ai criteri e sulla gestione di errore.
Errori di runtime
Questi errori possono verificarsi quando il criterio viene eseguito.
Codice di errore | Stato HTTP | Causa | Correggi |
---|---|---|---|
policies.ratelimit.FailedToResolveSpikeArrestRate |
500 |
Questo errore si verifica se il riferimento alla variabile contenente l'impostazione della tariffa
all'interno dell'elemento <Rate> non può essere risolto in un valore all'interno della funzione Spike Arrest
. Questo elemento è obbligatorio e viene utilizzato per specificare il tasso di arresto dei picchi in
nel formato intpm o intps . |
build |
policies.ratelimit.InvalidMessageWeight |
500 |
Questo errore si verifica se il valore specificato per l'elemento <MessageWeight> tramite
una variabile di flusso non è valida (valore non intero). |
build |
policies.ratelimit.SpikeArrestViolation |
429 |
Il limite di frequenza è stato superato. |
Errori di deployment
Questi errori possono verificarsi quando esegui il deployment di un proxy contenente questo criterio.
Nome errore | Causa | Correggi |
---|---|---|
InvalidAllowedRate |
Se il tasso di arresto dei picchi specificato nell'elemento <Rate> della funzione di arresto dei picchi
Il criterio non è un numero intero o se la tariffa non ha ps o pm come suffisso,
il deployment del proxy API non va a buon fine. |
build |
Variabili di errore
Queste variabili vengono impostate quando si verifica un errore di runtime. Per ulteriori informazioni, vedi Cosa devi sapere sugli errori relativi alle norme.
Variabili | Dove | Esempio |
---|---|---|
fault.name="fault_name" |
fault_name è il nome dell'errore, come elencato in Tabella Errori di runtime qui sopra. Il nome dell'errore è l'ultima parte del codice di errore. | fault.name Matches "SpikeArrestViolation" |
ratelimit.policy_name.failed |
policy_name è il nome specificato dall'utente del criterio che ha generato l'errore. | ratelimit.SA-SpikeArrestPolicy.failed = true |
Esempio di risposta di errore
Di seguito è riportato un esempio di risposta di errore:
{ "fault":{ "detail":{ "errorcode":"policies.ratelimit.SpikeArrestViolation" }, "faultstring":"Spike arrest violation. Allowed rate : 10ps" } }
Esempio di regola di errore
Di seguito è riportato un esempio di regola di errore per gestire un errore SpikeArrestViolation
:
<FaultRules> <FaultRule name="Spike Arrest Errors"> <Step> <Name>JavaScript-1</Name> <Condition>(fault.name Matches "SpikeArrestViolation") </Condition> </Step> <Condition>ratelimit.Spike-Arrest-1.failed=true</Condition> </FaultRule> </FaultRules>
Il codice di stato HTTP attuale per il superamento di un limite di frequenza impostato da una quota o da un criterio Spike Arrest
è 429
(Troppe richieste). Per modificare il codice di stato HTTP in 500
(errore interno del server), imposta la proprietà
features.isHTTPStatusTooManyRequestEnabled
su false
utilizzando
l'API
Aggiorna proprietà dell'organizzazione.
Ad esempio:
curl -u email:password -X POST -H "Content-type:application/xml" http://api.enterprise.apigee.com/v1/organizations/myorg -d \ "<Organization type="trial" name="MyOrganization"> <Properties> <Property name="features.isHTTPStatusTooManyRequestEnabled">true</Property> . . . </Properties> </Organization>"
Schemi
Ogni tipo di policy è definito da uno schema XML (.xsd
). Per riferimento, gli schemi delle policy
sono disponibili su GitHub.
Argomenti correlati
- Criteri per le quote: criteri per le quote, per limitare il traffico sui singoli client
- Limitazione di frequenza per una panoramica della limitazione di frequenza
- Confronto tra le norme relative a quote e SpikeArrest
- Esempi funzionanti di proxy API