Diese Seite gilt für Apigee und Apigee Hybrid.
Apigee Edge-Dokumentation aufrufen
Die SpikeArrest-Richtlinie schützt mit dem Element <Rate> vor Trafficanstieg. Dieses Element drosselt die Anzahl der Anfragen, die von einem API-Proxy verarbeitet und an ein Backend gesendet werden, um Leistungsverzögerungen und Ausfallzeiten zu verhindern.
Diese Richtlinie ist eine Standardrichtlinie, die in jeder Umgebung bereitgestellt werden kann. Informationen zu Richtlinientypen und zur Verfügbarkeit bei jedem Umgebungstyp finden Sie unter Richtlinientypen.
Unterschied zwischen SpikeArrest- und Kontingentrichtlinie
Die Kontingentrichtlinie konfiguriert die Anzahl der Anfragenachrichten, die eine Client-Anwendung im Laufe einer Stunde, eines Tages, einer Woche oder eines Monats an eine API senden kann. Die Kontingentrichtlinie erzwingt Nutzungsbeschränkungen für Clientanwendungen, die einen verteilten Zähler zur Verfügung stellen, der eingehende Anfragen erhöht.
Verwenden Sie Kontingente, um Geschäftsverträge oder SLAs mit Entwicklern und Partnern zu erzwingen, anstatt für die operative Trafficverwaltung. SpikeArrest schützt vor plötzlichen Spitzen im API-Traffic. Siehe auch Kontingente und SpikeArrest-Richtlinien vergleichen.
Videos
In diesen Videos werden Anwendungsfälle für diese Richtlinie behandelt:
Weshalb sie wichtig ist
Kontingentrichtlinie vergleichen
Element <SpikeArrest>
Definiert die SpikeArrest-Richtlinie.
| Standardwert | Siehe Tab Standardrichtlinie unten. |
| Erforderlich? | Optional |
| Typ | Komplexes Objekt |
| Übergeordnetes Element | – |
| Untergeordnete Elemente |
<Identifier><MessageWeight><Rate> (Erforderlich)<UseEffectiveCount> |
Syntax
Das <SpikeArrest>-Element verwendet die folgende Syntax:
<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>
Standardrichtlinie
Das folgende Beispiel zeigt die Standardeinstellungen, wenn Sie Ihrem Ablauf in der Benutzeroberfläche eine SpikeArrest-Richtlinie hinzufügen:
<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>false</UseEffectiveCount> </SpikeArrest>
Dieses Element hat folgende Attribute, die allen Richtlinien gemeinsam sind:
| Attribut | Standard | Erforderlich? | Beschreibung |
|---|---|---|---|
name |
- | Erforderlich |
Der interne Name der Richtlinie. Der Wert des Attributs Optional können Sie das Element |
continueOnError |
false | Optional | Legen Sie false fest, um einen Fehler zurückzugeben, wenn eine Richtlinie fehlschlägt. Dies ist für die meisten Richtlinien das erwartete Verhalten. Legen Sie true fest, damit die Ablaufausführung auch nach dem Fehlschlagen einer Richtlinie fortgesetzt wird. Weitere Informationen:
|
enabled |
wahr | Optional | Setzen Sie den Wert auf true, um die Richtlinie zu erzwingen. Legen Sie false fest, um die Richtlinie zu deaktivieren. Die Richtlinie wird nicht durchgesetzt, selbst wenn sie mit einem Ablauf verknüpft ist. |
async |
false | Verworfen | Dieses Attribut wurde verworfen. |
Beispiele
Die folgenden Beispiele zeigen Möglichkeiten, wie Sie die SpikeArrest-Richtlinie verwenden können:
Beispiel 1
Im folgenden Beispiel wird die Rate auf fünf pro Sekunde festgelegt:
<SpikeArrest name="SA-Static-5ps"> <Rate>5ps</Rate> <UseEffectiveCount>false</UseEffectiveCount> </SpikeArrest>
Diese Beispielrichtlinie lässt maximal 5 Anfragen pro Sekunde zu. Durch die Glättung wird maximal eine Anfrage pro 200 Millisekunden (1.000/5)-Intervall erzwungen.
Beispiel 2
Im folgenden Beispiel wird die Rate auf 12 pro Minute festgelegt:
<SpikeArrest name="SA-Static-12pm"> <Rate>12pm</Rate> <UseEffectiveCount>true</UseEffectiveCount> </SpikeArrest>
Diese Beispielrichtlinie lässt maximal 12 Anfragen pro Minute bei einer Rate von einer Anfrage pro 5 Sekunden (60/12) zu. Wenn es im 5-Sekunden-Intervall mehr als eine Anfrage gibt, sind solche Anfragen zulässig (keine Glättung), wenn die Anzahl der Anfragen die konfigurierte Ratenbegrenzung von 12 pro Minute nicht übersteigt.
Beispiel 3
Im folgenden Beispiel werden Anfragen auf 12 pro Minute beschränkt (eine Anfrage ist alle fünf Sekunden bzw. 60/12 zulässig):
<SpikeArrest name="SA-With-Dynamic-Weight-1"> <Rate>12pm</Rate> <Identifier ref="client_id" /> <MessageWeight ref="request_specific_weight" /> <UseEffectiveCount>true</UseEffectiveCount> </SpikeArrest>
Darüber hinaus akzeptiert das Element <MessageWeight> einen benutzerdefinierten Wert (den Header weight), mit dem die Gewichtungen von Nachrichten für bestimmte Anwendungen oder Clients angepasst werden. Hierdurch kann die Drosselung für Entitäten, die mit dem Element <Identifier> identifiziert werden, zusätzlich gesteuert werden.
Beispiel 4
Im folgenden Beispiel wird SpikeArrest angewiesen, nach einem Laufzeitwert zu suchen, der über die Anfrage festgelegt wurde, die als die Ablaufvariable request.header.runtime_rate übergeben wird:
<SpikeArrest name="SA-From-Inbound-Header-1"> <Rate ref="request.header.runtime_rate" /> <UseEffectiveCount>true</UseEffectiveCount> </SpikeArrest>
Der Wert der Ablaufvariable muss das Format intpm oder intps haben.
Wenn Sie dieses Beispiel ausprobieren möchten, führen Sie eine Anfrage wie diese aus:
curl http://myorg-myenv.apigee.net/price -H 'runtime_rate:30ps'
Verweis auf untergeordnetes Element
In diesem Abschnitt werden die untergeordneten Elemente von <SpikeArrest> beschrieben.
<DisplayName>
Wird zusätzlich zum Attribut name verwendet, um die Richtlinie im Proxy-Editor der Verwaltungs-UI mit einem anderen, natürlicher klingenden Namen zu versehen.
Das Element <DisplayName> ist für alle Richtlinien gleich.
| Standardwert | – |
| Erforderlich? | Optional. Wenn Sie <DisplayName> weglassen, wird der Wert des Attributs name der Richtlinie verwendet. |
| Typ | String |
| Übergeordnetes Element | <PolicyElement> |
| Untergeordnete Elemente | Keine |
Das <DisplayName>-Element verwendet die folgende Syntax:
Syntax
<PolicyElement> <DisplayName>POLICY_DISPLAY_NAME</DisplayName> ... </PolicyElement>
Beispiel
<PolicyElement> <DisplayName>My Validation Policy</DisplayName> </PolicyElement>
Das <DisplayName>-Element hat keine Attribute oder untergeordneten Elemente.
<Identifier>
Hier können Sie auswählen, wie die Anfragen gruppiert werden, sodass die SpikeArrest-Richtlinie basierend auf dem Client angewendet werden kann. Sie können beispielsweise Anfragen nach Entwickler-ID gruppieren. In diesem Fall werden die Anfragen jedes Entwicklers auf die eigene SpikeArrest-Rate und nicht auf alle Anfragen an den Proxy angerechnet.
Wird in Verbindung mit dem Element <MessageWeight> für eine genauere Steuerung der Anfragedrosselung verwendet.
Wenn Sie das Element <Identifier> leer lassen, wird für alle Anfragen an diesen API-Proxy eine Ratenbegrenzung erzwungen.
| Standardwert | – |
| Erforderlich? | Optional |
| Typ | String |
| Übergeordnetes Element |
<SpikeArrest>
|
| Untergeordnete Elemente | Keine |
Syntax
<SpikeArrest continueOnError="[false|true]" enabled="[true|false]" name="policy_name" > <Identifier ref="flow_variable"/> </SpikeArrest>
Beispiel 1
Im folgenden Beispiel wird die SpikeArrest-Richtlinie pro Entwickler-ID angewendet:
<SpikeArrest name="Spike-Arrest-1"> <Identifier ref="developer.id"/> <Rate>42pm</Rate/> <UseEffectiveCount>true</UseEffectiveCount> </SpikeArrest>
In der folgenden Tabelle werden die Attribute von <Identifier> beschrieben:
| Attribut | Beschreibung | Standard | Präsenz |
|---|---|---|---|
ref |
Gibt die Variable an, über die SpikeArrest eingehende Anfragen gruppiert. Sie können jede beliebige Ablaufvariable verwenden, um einen eindeutigen Client anzugeben, wie diejenigen, die mit der VerifyAPIKey-Richtlinie verfügbar sind. Sie können auch benutzerdefinierte Variablen mithilfe der JavaScript-Richtlinie oder der AssignMessage-Richtlinie festlegen. | – | Erforderlich |
Dieses Element wird auch in diesem Apigee-Communitybeitrag behandelt.
<MessageWeight>
Gibt die für jede Nachricht definierte Gewichtung an. Die Nachrichtengewichtung ändert die Auswirkungen einer einzelnen Anfrage auf die Berechnung der SpikeArrest-Rate. Die Nachrichtengewichtung kann eine beliebige Ablaufvariable sein, z. B. ein HTTP-Header, Abfrageparameter, Formularparameter oder Inhalt des Nachrichtentexts. Sie können auch benutzerdefinierte Variablen mithilfe der JavaScript-Richtlinie oder der AssignMessage-Richtlinie verwenden.
Wird in Verbindung mit <Identifier> verwendet, um Anfragen von bestimmten Clients oder Anwendungen drosseln zu können.
Wenn der SpikeArrest <Rate> beispielsweise 10pm ist und eine Anwendung Anfragen mit einer Gewichtung von 2 sendet, sind von diesem Client nur fünf Nachrichten pro Minute zulässig, weil jede Anfrage als 2 zählt.
| Standardwert | – |
| Erforderlich? | Optional |
| Typ | Ganzzahl |
| Übergeordnetes Element |
<SpikeArrest>
|
| Untergeordnete Elemente | Keine |
Syntax
<SpikeArrest continueOnError="[false|true]" enabled="[true|false]" name="policy_name" > <MessageWeight ref="flow_variable"/> </SpikeArrest>
Beispiel 1
Im folgenden Beispiel werden Anfragen auf 12 pro Minute beschränkt (eine Anfrage ist alle fünf Sekunden bzw. 60/12 zulässig):
<SpikeArrest name="SA-With-Dynamic-Weight-1"> <Rate>12pm</Rate> <Identifier ref="client_id" /> <MessageWeight ref="request_specific_weight" /> <UseEffectiveCount>true</UseEffectiveCount> </SpikeArrest>
In diesem Beispiel akzeptiert <MessageWeight> einen benutzerdefinierten Wert (den weight-Header in der Anfrage), der die Nachrichtengewichtung für bestimmte Clients anpasst. Hierdurch kann die Drosselung für Entitäten, die mit dem Element <Identifier> identifiziert werden, zusätzlich gesteuert werden.
In der folgenden Tabelle werden die Attribute von <MessageWeight> beschrieben:
| Attribut | Beschreibung | Präsenz | Standard |
|---|---|---|---|
ref |
Gibt die Ablaufvariable an, die die Nachrichtengewichtung für einen bestimmten Client enthält. Dies kann eine beliebige Ablaufvariable sein, z. B. der HTTP-Abfrageparameter, der Header oder der Nachrichteninhalt. Weitere Informationen finden Sie unter Referenz zu Ablaufvariablen. Sie können auch benutzerdefinierte Variablen mithilfe der JavaScript-Richtlinie oder der AssignMessage-Richtlinie festlegen. | Erforderlich | – |
<Rate>
Gibt die Rate an, mit der die Trafficspitzen (oder Bursts) durch Begrenzung der Anzahl der Anfragen pro Minute oder pro Sekunde eingeschränkt werden. Sie können dieses Element auch zusammen mit <Identifier> und <MessageWeight> verwenden, um den Traffic während der Laufzeit reibungslos zu drosseln, indem Sie Werte vom Client akzeptieren. Verwenden Sie das Element <UseEffectiveCount>, um den von der Richtlinie verwendeten Algorithmus für die Ratenbegrenzung festzulegen.
Informationen zu den maximalen Ratenbegrenzungen, die Sie angeben können, finden Sie auf der Seite „Limits“ im Abschnitt zu SpikeArrest.
| Standardwert | – |
| Erforderlich? | Erforderlich |
| Typ | Ganzzahl |
| Übergeordnetes Element |
<SpikeArrest>
|
| Untergeordnete Elemente | Keine |
Syntax
Sie können Raten auf eine der folgenden Arten angeben:
- Eine statische Rate, die Sie als Text des Elements
<Rate>angeben. - Ein variabler Wert, der vom Client übergeben werden kann; Ermitteln Sie den Namen der Ablaufvariablen mithilfe des Attributs
ref.
<SpikeArrest continueOnError="[false|true]" enabled="[true|false]" name="policy_name" > <Rate ref="flow_variable">rate[pm|ps]</Rate> </SpikeArrest>
Gültige Ratenwerte, die entweder als Variablenwert oder im Textkörper des Elements definiert sind, müssen dem folgenden Format entsprechen:
intps(Anzahl der Anfragen pro Sekunde, in Millisekundenintervalle geglättet)intpm(Anzahl der Anfragen pro Minute, in Sekundenintervalle geglättet)
Der Wert von int muss eine positive Ganzzahl ungleich Null sein.
Beispiel 1
Im folgenden Beispiel wird die Rate auf fünf Anfragen pro Sekunde festgelegt:
<SpikeArrest name="SA-Static-5ps"> <Rate>5ps</Rate> <UseEffectiveCount>false</UseEffectiveCount> </SpikeArrest>
Die Richtlinie glättet die Rate auf eine Anfrage alle 200 Millisekunden (1000/5).
Beispiel 2
Im folgenden Beispiel wird die Rate auf 12 Anfragen pro Minute festgelegt:
<SpikeArrest name="SA-Static-12pm"> <Rate>12pm</Rate> <UseEffectiveCount>true</UseEffectiveCount> </SpikeArrest>
Diese Beispielrichtlinie glättet die Rate auf eine Anfrage alle fünf Sekunden (60/12).
In der folgenden Tabelle werden die Attribute von <Rate> beschrieben:
| Attribut | Beschreibung | Präsenz | Standard |
|---|---|---|---|
ref |
Kennzeichnet eine Ablaufvariable, die die Rate angibt. Dies kann eine beliebige Ablaufvariable sein, z. B. ein HTTP-Abfrageparameter, Header oder Nachrichtentextinhalt oder ein Wert wie eine KVM. Weitere Informationen finden Sie unter Referenz zu Ablaufvariablen.
Sie können auch benutzerdefinierte Variablen mithilfe der JavaScript-Richtlinie oder der AssignMessage-Richtlinie verwenden. Wenn Sie sowohl Beispiel: <Rate ref="request.header.custom_rate">1pm</Rate> Wenn der Client in diesem Beispiel keinen Mit Wenn Sie einen Wert für |
Optional | – |
Rate beschrieben, die das Verhalten der Traffic-Drosselung definieren:
| Attribut | Beschreibung |
|---|---|
messagesPerPeriod |
Gibt die Anzahl der Nachrichten an, die innerhalb eines definierten Zeitraums zulässig sind. Wenn eine Richtlinie beispielsweise für „10ps“ (10 pro Sekunde) konfiguriert ist, wäre der messagesPerPeriod-Wert 10. |
periodInMicroseconds |
Definiert den Zeitraum in Mikrosekunden, über den messagesPerPeriod berechnet wird. Bei einer Konfiguration mit „10 ps“ wäre dieser Wert 1.000.000, was einer Sekunde entspricht. |
maxBurstMessageCount |
Stellt die maximale Anzahl von Anfragen dar, die sofort oder in einem kurzen Zeitraum zu Beginn eines neuen Intervalls zulässig sein können. |
<UseEffectiveCount>
Bei diesem Element können Sie zwischen unterschiedlichen SpikeArrest-Algorithmen wählen, indem Sie den Wert auf true oder false setzen, wie unten erläutert:
wahr
Wenn true festgelegt ist, wird SpikeArrest in einer Region verteilt. Das bedeutet, dass die Anzahl der Anfragen zwischen den Message Processors (MPs) in einer Region synchronisiert wird. Außerdem wird ein Ratenbegrenzungsalgorithmus des Typs "Gleitendes Fenster" verwendet. Dieser Algorithmus bietet ein konsistentes Ratenbegrenzungsverhalten und "glättet" nicht die Anzahl der eingehenden Anfragen, die an das Back-End gesendet werden können. Wenn eine Vielzahl von Anfragen in einem kurzen Zeitintervall gesendet wird, sind sie zulässig, solange sie die im Element <Rate> festgelegte Ratenbegrenzung nicht überschreiten. Beispiel:
<SpikeArrest name="Spike-Arrest-1"> <Rate>12pm</Rate> <Identifier ref="client_id" /> <MessageWeight ref="request.header.weight" /> <UseEffectiveCount>true</UseEffectiveCount> </SpikeArrest>
false (Standardeinstellung)
Wenn der Wert auf false (Standardeinstellung) gesetzt ist, verwendet die SpikeArrest-Richtlinie einen Algorithmus des Typs Token-Bucket, der die Traffic-Spitzen glättet, indem die von Ihnen angegebene Ratenbegrenzung in kleinere Intervalle aufgeteilt wird. Ein Nachteil dieses Ansatzes ist, dass mehrere legitime Anfragen, die über einen kurzen Zeitraum eingehen, potenziell abgelehnt werden können.
Angenommen, Sie geben eine Rate von 30pm (30 Anfragen pro Minute) ein. Beim Testen können Sie 30 Anfragen innerhalb einer Sekunde senden, sofern sie innerhalb einer Minute gesendet wurden. Aber das wird nicht durch die Richtlinie erzwungen. Wenn Sie darüber nachdenken, können 30 Anfragen innerhalb eines Zeitraums von 1 Sekunde in einigen Umgebungen als kleiner Anstieg angesehen werden.
- Minutenraten werden in vollständige Anfragen geglättet, die in Intervallen von Sekunden zulässig sind.
Zum Beispiel wird 30pm so geglättet:
60 Sekunden (1 Minute) / 30pm = 2-Sekunden-Intervalle oder alle 2 Sekunden ist 1 Anfrage zulässig. Eine zweite Anfrage innerhalb von 2 Sekunden schlägt fehl. Außerdem schlägt die 31. Anfrage innerhalb einer Minute fehl. - Sekundenraten werden in vollständige Anfragen geglättet, die in Intervallen von Millisekunden zulässig sind.
10ps werden z. B. so geglättet:
1.000 Millisekunden (1 Sekunde) / 10ps = 100-Millisekunden-Intervalle bzw. 1 Anfrage alle 100 Millisekunden. Eine zweite Anfrage innerhalb von 100ms schlägt fehl. Außerdem schlägt eine 11. Anfrage innerhalb einer Sekunde fehl.
| Standardwert | False |
| Erforderlich? | Optional |
| Typ | Boolescher Wert |
| Übergeordnetes Element |
<SpikeArrest>
|
| Untergeordnete Elemente | Keine |
In der folgenden Tabelle werden die Attribute des <UseEffectiveCount> -Elements beschrieben:
| Attribut | Beschreibung | Standard | Präsenz |
|---|---|---|---|
ref |
Gibt die Variable an, die den Wert von <UseEffectiveCount> enthält. Dies kann eine beliebige Ablaufvariable sein, z. B. der HTTP-Abfrageparameter, der Header oder der Nachrichteninhalt. Weitere Informationen finden Sie unter Referenz zu Ablaufvariablen. Sie können auch benutzerdefinierte Variablen mithilfe der JavaScript-Richtlinie oder der AssignMessage-Richtlinie festlegen. |
– | Optional |
Ablaufvariablen
Beim Ausführen einer SpikeArrest-Richtlinie wird die folgende Ablaufvariable ausgefüllt:
| Variable | Typ | Berechtigung | Beschreibung |
|---|---|---|---|
ratelimit.policy_name.failed |
Boolesch | Schreibgeschützt: | Gibt an, ob die Richtlinie fehlgeschlagen ist (true oder false). |
Weitere Informationen finden Sie unter Referenz zu Ablaufvariablen.
Fehlerreferenz
This section describes the fault codes and error messages that are returned and fault variables that are set by Apigee when this policy triggers an error. This information is important to know if you are developing fault rules to handle faults. To learn more, see What you need to know about policy errors and Handling faults.
Runtime errors
These errors can occur when the policy executes.
| Fault code | HTTP status | Cause | Fix |
|---|---|---|---|
policies.ratelimit.FailedToResolveSpikeArrestRate |
500 |
This error occurs if the reference to the variable containing the rate setting
within the <Rate> element cannot be resolved to a value within the SpikeArrest
policy. This element is mandatory and used to specify the spike arrest rate in
the form of intpm or intps. |
build |
policies.ratelimit.InvalidMessageWeight |
500 |
This error occurs if the value specified for the <MessageWeight> element through
a flow variable is invalid (a non-integer value). |
build |
policies.ratelimit.SpikeArrestViolation |
429 |
The rate limit is exceeded. |
Deployment errors
These errors can occur when you deploy a proxy containing this policy.
| Error name | Cause | Fix |
|---|---|---|
InvalidAllowedRate |
If the spike arrest rate specified in the <Rate> element of the SpikeArrest
policy is not an integer or if the rate does not have ps or pm as a suffix,
then the deployment of the API proxy fails. |
build |
Fault variables
These variables are set when a runtime error occurs. For more information, see What you need to know about policy errors.
| Variables | Where | Example |
|---|---|---|
fault.name="fault_name" |
fault_name is the name of the fault, as listed in the Runtime errors table above. The fault name is the last part of the fault code. | fault.name Matches "SpikeArrestViolation" |
ratelimit.policy_name.failed |
policy_name is the user-specified name of the policy that threw the fault. | ratelimit.SA-SpikeArrestPolicy.failed = true |
Example error response
Shown below is an example error response:
{ "fault":{ "detail":{ "errorcode":"policies.ratelimit.SpikeArrestViolation" }, "faultstring":"Spike arrest violation. Allowed rate : 10ps" } }
Example fault rule
Shown below is an example fault rule to handle a SpikeArrestViolation fault:
<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>Der aktuelle HTTP-Statuscode zum Überschreiten einer Ratenbegrenzung, die von einer Kontingent- oder SpikeArrest-Richtlinie festgelegt wurde, lautet 429 (Zu viele Anfragen).
Schemas
Jeder Richtlinientyp wird durch ein XML-Schema (.xsd) definiert. Zu Referenzzwecken sind Richtlinienschemas auf GitHub verfügbar.
Weitere Informationen
- Kontingentrichtlinie: Kontingentrichtlinie zum Beschränken des Traffics auf einzelne Clients
- Ratenbegrenzung für eine Übersicht über Ratenbegrenzungen
- Kontingente und SpikeArrest-Richtlinien vergleichen