SpikeArrest-Richtlinie

Sie lesen gerade die Dokumentation zu Apigee Edge.
Zur Dokumentation zu Apigee X
info

Spike Arrest-Symbol auf der Edge-Benutzeroberfläche

Die Spike Arrest-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 Back-End gesendet werden, um Leistungsverzögerungen und Ausfallzeiten zu verhindern.

Element <SpikeArrest>

Definiert die Spike Arrest-Richtlinie.

Standardwert Siehe Standardrichtlinie Tab 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 Edge-UI eine Spike Arrest-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>true</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 name kann Buchstaben, Ziffern, Leerzeichen, Bindestriche, Unterstriche und Punkte enthalten. Dieser Wert darf 255 Zeichen nicht überschreiten.

Optional können Sie das Element <DisplayName> verwenden, um die Richtlinie im Proxy-Editor der Verwaltungs-UI mit einem anderen Namen in einer natürlichen Sprache zu versehen.

continueOnError falsch Optional Ist das Element auf "false" gesetzt, wird ein Fehler zurückgegeben, wenn eine Richtlinie fehlschlägt. Dies ist für die meisten Richtlinien das erwartete Verhalten. Ist das Element auf "true" gesetzt, wird die Ausführung des Ablaufs auch nach dem Fehlschlagen einer Richtlinie fortgesetzt.
enabled wahr Optional Auf "true" setzen, um die Richtlinie durchzusetzen. Auf "false" setzen, um die Richtlinie zu "deaktivieren". Die Richtlinie wird nicht durchgesetzt, selbst wenn sie mit einem Ablauf verknüpft ist.
async   falsch Eingestellte Funktionen Dieses Attribut wurde verworfen.

Beispiele

Die folgenden Beispiele zeigen Möglichkeiten, wie Sie die Spike Arrest-Richtlinie verwenden können:

Beispiel 1

Im folgenden Beispiel wird die Rate auf fünf pro Sekunde festgelegt:

<SpikeArrest name="Spike-Arrest-1">
  <Rate>5ps</Rate>
</SpikeArrest>

Die Richtlinie glättet die Rate auf eine Anfrage alle 200 Millisekunden (1000/5).

Beispiel 2

Im folgenden Beispiel wird die Rate auf 300 pro Minute festgelegt:

<SpikeArrest async="false" continueOnError="false" enabled="true" name="SpikeArreast">
  <DisplayName>SpikeArreast</DisplayName>
  <Rate>300pm</Rate>
</SpikeArrest>

Die effektive Rate beträgt 300 pro Minute. Das bedeutet, dass dem Bucket alle 200 Millisekunden ein neues Token hinzugefügt wird. Die Bucket-Größe ist immer auf 10% von messagesPerPeriod konfiguriert. Bei einem messagesPerPeriod von 300 beträgt die Bucket-Größe also 30 Tokens.

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="Spike-Arrest-1">
  <Rate>12pm</Rate>
  <Identifier ref="client_id" />
  <MessageWeight ref="request.header.weight" />
</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 Spike Arrest angewiesen, nach einem Laufzeitwert zu suchen, der über die Anfrage festgelegt wurde, die als die Ablaufvariable request.header.runtime_rate übergeben wird:

<SpikeArrest name="Spike-Arrest-1">
  <Rate ref="request.header.runtime_rate" />
</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? 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 Spike Arrest-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 Spike Arrest-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 Spike Arrest-Richtlinie pro Entwickler-ID angewendet:

<SpikeArrest name="Spike-Arrest-1">
  <Identifier ref="developer.id"/>
  <Rate>42pm</Rate/>
</SpikeArrest>

In der folgenden Tabelle werden die Attribute von <Identifier> beschrieben:

Attribut Beschreibung Standard Präsenz
ref Gibt die Variable an, über die Spike Arrest 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 im folgenden Apigee-Communitybeitrag diskutiert: http://community.apigee.com/questions/2807/how-does-the-edge-quota-policy-work-when-no-identi.html.

<MessageWeight>

Gibt die für jede Nachricht definierte Gewichtung an. Die Nachrichtengewichtung ändert die Auswirkungen einer einzelnen Anfrage auf die Berechnung der Spike Arrest-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 Spike Arrest <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="Spike-Arrest-1">
  <Rate>12pm</Rate>
  <Identifier ref="client_id" />
  <MessageWeight ref="request.header.weight" />
</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.

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="Spike-Arrest-1">
  <Rate>5ps</Rate>
</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 async="false" continueOnError="false" enabled="true" name="SpikeArreast">
  <DisplayName>SpikeArreast</DisplayName>
  <Rate>300pm</Rate>
</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 ref als auch den Text dieses Elements definieren, wird der Wert von ref angewendet und hat Vorrang, wenn die Ablaufvariable in der Anfrage festgelegt wird. Das gilt auch umgekehrt, wenn die in ref angegebene Variable nicht in der Anfrage festgelegt ist.

Beispiel:

<Rate ref="request.header.custom_rate">1pm</Rate>

Wenn der Client in diesem Beispiel keinen "custom_rate"-Header übergibt, beträgt die Rate für den API-Proxy für alle Clients eine Anfrage pro Minute. Wenn der Client einen "custom_rate"-Header übergibt, wird die Ratenbegrenzung für alle Clients auf dem Proxy auf 10 Anfragen pro Sekunde geändert, bis eine Anfrage ohne den Header "custom_rate" gesendet wird.

Mit <Identifier> können Sie Anfragen gruppieren, um benutzerdefinierte Raten für verschiedene Clienttypen zu erzwingen.

Wenn Sie einen Wert für ref angeben, aber nicht die Rate im Text des Elements <Rate> festlegen und der Client keinen Wert übergibt, gibt die Spike Arrest-Richtlinie einen Fehler aus.

Optional

<UseEffectiveCount>

Verteilt Ihre SpikeArrest-Zähler auf Nachrichtenprozessoren (Message Processors, MPs), wenn Sie Autoscaling-Gruppen verwenden.

Syntax

<SpikeArrest
  continueOnError="[false|true]"
  enabled="[true|false]"
  name="policy_name"
>
  <UseEffectiveCount>[false|true]</UseEffectiveCount>
</SpikeArrest>

Beispiel 1

Im folgenden Beispiel wird <UseEffectiveCount> auf „true“ gesetzt:

<SpikeArrest name='Spike-Arrest-1'>
  <Rate>40ps</Rate>
  <UseEffectiveCount>true</UseEffectiveCount>
</SpikeArrest>

Das <UseEffectiveCount>-Element ist optional. Der Standardwert ist false, wenn das Element in Ihrer Spike Arrest-Richtlinie nicht enthalten ist.

Standardwert Falsch
Erforderlich? Optional
Typ Boolesch
Ü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

Die Wirkung von <UseEffectiveCount> hängt von seinem Wert ab:

  • true: Das Spike-Ratenlimit eines MP ist die <Rate> geteilt durch die aktuelle Anzahl von MPs im selben Pod. Das aggregierte Limit ist der Wert von <Rate>. Wenn MPs dynamisch hinzugefügt oder entfernt werden, erhöhen oder verringern sich die individuellen Ratenbegrenzungen für Spitzen, die aggregierte Begrenzung bleibt jedoch gleich.
  • false: Das Limit für die Spike-Rate jedes MP ist einfach der Wert von <Rate>. Das aggregierte Limit ist die Summe der Raten aller MPs. Wenn MPs hinzugefügt oder entfernt werden, bleiben ihre individuellen Ratenbegrenzungen für Spitzen gleich, aber die aggregierte Begrenzung wird erhöht oder verringert.

Die SpikeArrest-Richtlinie verwendet 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.

In der folgenden Tabelle sehen Sie die Auswirkungen von <UseEffectiveCount> auf das effektive Ratenlimit der einzelnen MPs:

Wert von <UseEffectiveCount>
false false false true true true
Anzahl der MPs 8 4 2 8 4 2
Wert von <Rate> 10 10 10 40 40 40
Effektiver Preis pro MP 10 10 10 5 10 20
Aggregiertes Limit 80 40 20 40* 40* 40*
* Gleich wie <Rate>.

In diesem Beispiel sehen Sie, dass die effektive Rate pro MP gleich bleibt (bei 10), wenn die Anzahl der MPs von 4 auf 2 reduziert wird und <UseEffectiveCount> gleich false ist. Wenn <UseEffectiveCount> jedoch true ist, steigt der effektive Preis pro MP von 10 auf 20, wenn die Anzahl der MPs von 4 auf 2 sinkt.

Ablaufvariablen

Beim Ausführen einer Spike Arrest-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 Edge 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 Spike Arrest policy. This element is mandatory and used to specify the spike arrest rate in the form of intpm or intps.
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).
policies.ratelimit.SpikeArrestViolation 429

The rate limit was 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 Spike Arrest 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.

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 Spike Arrest-Richtlinie festgelegt wurde, lautet 429 (Zu viele Anfragen). Wenn Sie den HTTP-Statuscode in 500 (Interner Serverfehler) ändern möchten, setzen Sie das Attribut features.isHTTPStatusTooManyRequestEnabled über die API Organisationsattribute aktualisieren auf false.

Beispiel:

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

Schemas

Jeder Richtlinientyp wird durch ein XML-Schema (.xsd) definiert. Zu Referenzzwecken sind Richtlinienschemas auf GitHub verfügbar.

Weitere Informationen