Zasada SpikeArrest

Wyświetlasz dokumentację Apigee Edge.
Otwórz dokumentację Apigee X. info

Ikona Spike Arrest w interfejsie Edge

Zasada Spike Arrest chroni przed nagłymi wzrostami ruchu za pomocą elementu <Rate>. Ten element ogranicza liczbę żądań przetwarzanych przez serwer proxy interfejsu API i wysyłanych do backendu, chroniąc przed opóźnieniami i przestojami.

Element <SpikeArrest>

Definiuje zasadę Spike Arrest.

Wartość domyślna Patrz karta Zasady domyślne poniżej.
Wymagany? Opcjonalny
Typ Obiekt Complex
Element nadrzędny nie dotyczy
Elementy podrzędne <Identifier>
<MessageWeight>
<Rate> (wymagany)
<UseEffectiveCount>

Składnia

Element <SpikeArrest> ma tę składnię:

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

Domyślne zasady

Poniższy przykład pokazuje domyślne ustawienia po dodaniu zasady Spike Arrest do przepływu w interfejsie 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>

This element has the following attributes that are common to all policies:

Attribute Default Required? Description
name N/A Required

The internal name of the policy. The value of the name attribute can contain letters, numbers, spaces, hyphens, underscores, and periods. This value cannot exceed 255 characters.

Optionally, use the <DisplayName> element to label the policy in the management UI proxy editor with a different, natural-language name.

continueOnError false Optional Set to "false" to return an error when a policy fails. This is expected behavior for most policies. Set to "true" to have flow execution continue even after a policy fails.
enabled true Optional Set to "true" to enforce the policy. Set to "false" to "turn off" the policy. The policy will not be enforced even if it remains attached to a flow.
async   false Deprecated This attribute is deprecated.

Przykłady

Poniższe przykłady pokazują, jak można używać zasady Spike Arrest:

Przykład 1

W tym przykładzie ustawiamy szybkość na 5 na sekundę:

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

Zasady wyrównują szybkość do 1 żądania co 200 milisekund (1000/5).

Przykład 2

W tym przykładzie ustawiamy limit na 300 na minutę:

<SpikeArrest async="false" continueOnError="false" enabled=">tru<e" name="SpikeAr<reast"
>  D<ispl>ayNam<e&>;<gtSpikeArrea>st/DisplayName
  Rate300pm/Rate
/SpikeArrest

Efektywna szybkość to 300 tokenów na minutę, co oznacza, że nowy token jest dodawany do puli co 200 milisekund. Rozmiar segmentu jest zawsze skonfigurowany na 10% messagesPerPeriod. Dlatego przy wartości messagesPerPeriod = 300 rozmiar puli wynosi 30 tokenów.

Przykład 3

Ten przykład ogranicza liczbę żądań do 12 na minutę (jedno żądanie co 5 sekund, czyli 60/12):

<SpikeArrest name="Spike-Arre>st-<1&qu>ot;
<  Rat>e12<pm/Rate
  Identifier ref=&qu>ot;<client_id" /
  MessageWeight ref=">;<request.head>er.weight" /
/SpikeArrest

Dodatkowo element <MessageWeight> akceptuje wartość niestandardową (nagłówek weight), która dostosowuje wagi wiadomości w przypadku konkretnych aplikacji lub klientów. Zapewnia to dodatkową kontrolę nad ograniczaniem przepustowości w przypadku podmiotów zidentyfikowanych za pomocą elementu <Identifier>.

Przykład 4

Poniższy przykład zawiera instrukcję dla ochrony przed nagłymi wzrostami ruchu, aby szukała wartości czasu działania ustawionej w żądaniu przekazywanym jako zmienna przepływu request.header.runtime_rate:

<SpikeArrest name="Spike-Arre>st-<1"
  Rate ref="request.header.>r<untime_rate&>quot; /
/SpikeArrest

Wartość zmiennej przepływu musi mieć format intpm lub intps.

Aby wypróbować ten przykład, wykonaj takie żądanie:

curl http://myorg-myenv.apigee.net/price -H 'runtime_rate:30ps'

Odwołanie do elementu podrzędnego

W tej sekcji opisujemy elementy podrzędne elementu <SpikeArrest>.

<DisplayName>

Use in addition to the name attribute to label the policy in the management UI proxy editor with a different, more natural-sounding name.

The <DisplayName> element is common to all policies.

Default Value n/a
Required? Optional. If you omit <DisplayName>, the value of the policy's name attribute is used
Type String
Parent Element <PolicyElement>
Child Elements None

The <DisplayName> element uses the following syntax:

Syntax

<PolicyElement>
  <DisplayName>policy_display_name</DisplayName>
  ...
</PolicyElement>

Example

<PolicyElement>
  <DisplayName>My Validation Policy</DisplayName>
</PolicyElement>

The <DisplayName> element has no attributes or child elements.

<Identifier>

Umożliwia wybór sposobu grupowania żądań, aby zasada Spike Arrest mogła być stosowana na podstawie klienta. Możesz na przykład grupować żądania według identyfikatora dewelopera. W takim przypadku żądania każdego dewelopera będą wliczane do jego własnego limitu Spike Arrest, a nie do wszystkich żądań wysyłanych do serwera proxy.

Używaj w połączeniu z elementem <MessageWeight>, aby uzyskać większą kontrolę nad ograniczaniem liczby żądań.

Jeśli pozostawisz element <Identifier> pusty, dla wszystkich żądań do tego serwera proxy interfejsu API będzie obowiązywać jeden limit szybkości.

Wartość domyślna nie dotyczy
Wymagany? Opcjonalny
Typ Ciąg znaków
Element nadrzędny <SpikeArrest>
Elementy podrzędne Brak

Składnia

<SpikeArrest
  continueOnError="[false|true]"
  enabled="[true|false]"
 > na<me="policy_name"

  I>d<entifier ref>="flow_variable"/
/SpikeArrest
        

Przykład 1

W tym przykładzie zasada Spike Arrest jest stosowana do każdego identyfikatora dewelopera:

<SpikeArrest name="Spike-Arre>st-<1"
  Identifier ref=">;de<velo>per.<id&quo>t<;/
  Rate42p>m/Rate/
/SpikeArrest

W tabeli poniżej opisano atrybuty <Identifier>:

Atrybut Opis Domyślny Obecność
ref Określa zmienną, według której funkcja Spike Arrest grupuje przychodzące żądania. Aby wskazać unikalnego klienta, możesz użyć dowolnej zmiennej przepływu, np. zmiennych dostępnych w zasadach VerifyAPIKey. Możesz też ustawić zmienne niestandardowe za pomocą zasady JavaScript lub zasady AssignMessage. nie dotyczy Wymagane

Ten element jest również omówiony w tym poście na forum społeczności Apigee: Quota Identifier Across Different Policies (Identyfikator limitu w różnych zasadach).

<MessageWeight>

Określa wagę zdefiniowaną dla każdego komunikatu. Waga wiadomości modyfikuje wpływ pojedynczego żądania na obliczanie współczynnika zapobiegania nagłym wzrostom. Waga wiadomości może być dowolną zmienną przepływu, np. nagłówkiem HTTP, parametrem zapytania, parametrem formularza lub treścią wiadomości. Możesz też używać zmiennych niestandardowych za pomocą zasady JavaScript lub zasady AssignMessage.

Używaj w połączeniu z parametrem <Identifier>, aby dodatkowo ograniczać liczbę żądań od konkretnych klientów lub aplikacji.

Jeśli na przykład limit nagłych wzrostów <Rate> wynosi 10pm, a aplikacja przesyła żądania o wadze 2, to z tego klienta dozwolonych jest tylko 5 wiadomości na minutę, ponieważ każde żądanie liczy się jako 2.

Wartość domyślna nie dotyczy
Wymagany? Opcjonalny
Typ Liczba całkowita
Element nadrzędny <SpikeArrest>
Elementy podrzędne Brak

Składnia

<SpikeArrest
  continueOnError="[false|true]"
  enabled="[true|false]"
 > na<me="policy_name"

  Mess>a<geWeight ref>="flow_variable"/
/SpikeArrest

Przykład 1

Ten przykład ogranicza liczbę żądań do 12 na minutę (jedno żądanie co 5 sekund, czyli 60/12):

<SpikeArrest name="Spike-Arre>st-<1&qu>ot;
<  Rat>e12<pm/Rate
  Identifier ref=&qu>ot;<client_id" /
  MessageWeight ref=">;<request.head>er.weight" /
/SpikeArrest

W tym przykładzie usługa <MessageWeight> akceptuje wartość niestandardową (nagłówek weight w żądaniu), która dostosowuje wagi wiadomości dla konkretnych klientów. Zapewnia to dodatkową kontrolę nad ograniczaniem przepustowości w przypadku podmiotów zidentyfikowanych za pomocą elementu <Identifier>.

W tabeli poniżej opisano atrybuty <MessageWeight>:

Atrybut Opis Obecność Domyślny
ref Określa zmienną przepływu, która zawiera wagę wiadomości dla konkretnego klienta. Może to być dowolna zmienna przepływu, np. parametr zapytania HTTP, nagłówek lub treść wiadomości. Więcej informacji znajdziesz w dokumentacji zmiennych przepływu. Możesz też ustawić zmienne niestandardowe za pomocą zasady JavaScript lub zasady AssignMessage. Wymagane Nie dotyczy

<Rate>

Określa szybkość ograniczania skoków (lub nagłych wzrostów) ruchu przez ustawienie liczby żądań dozwolonych w przedziałach minutowych lub sekundowych. Możesz też użyć tego elementu w połączeniu z <Identifier><MessageWeight>, aby płynnie ograniczać ruch w czasie działania programu, akceptując wartości od klienta.

Wartość domyślna nie dotyczy
Wymagany? Wymagane
Typ Liczba całkowita
Element nadrzędny <SpikeArrest>
Elementy podrzędne Brak

Składnia

Stawki możesz określić na jeden z tych sposobów:

  • stałą stawkę określoną w treści elementu <Rate>,
  • Wartość zmiennej, która może być przekazywana przez klienta; nazwa zmiennej przepływu jest określana za pomocą atrybutu ref.
<SpikeArrest
  continueOnError="[false|true]"
  enabled="[true|false]"
 > na<me="policy_name&quo>t;

  Rate <ref=&>q<uot;flow_var>iable"rate[pm|ps]/Rate
/SpikeArrest

Prawidłowe wartości stawki (zdefiniowane jako wartość zmiennej lub w treści elementu) muszą być zgodne z tym formatem:

  • intps (liczba żądań na sekundę, wygładzona w interwałach milisekund)
  • intpm (liczba żądań na minutę, wygładzona w interwałach sekundowych)

Wartość int musi być dodatnią liczbą całkowitą różną od zera.

Przykład 1

W tym przykładzie ustawiamy limit na 5 żądań na sekundę:

<SpikeArrest name="Spike-Arre>st-<1&qu>ot;<
  Ra>t<e5ps/Rate
/S>pikeArrest

Zasady wyrównują szybkość do 1 żądania co 200 milisekund (1000/5).

Przykład 2

Ten przykład ustawia limit na 12 żądań na minutę:

<SpikeArrest async="false" continueOnError="false" enabled=">tru<e" name="SpikeAr<reast"
>  D<ispl>ayNam<e&>;<gtSpikeArrea>st/DisplayName
  Rate300pm/Rate
/SpikeArrest

Ta przykładowa zasada wygładza szybkość do 1 żądania co 5 sekund (60/12).

W tabeli poniżej opisano atrybuty <Rate>:

Atrybut Opis Obecność Domyślny
ref Określa zmienną przepływu, która określa stawkę. Może to być dowolna zmienna przepływu, np. parametr zapytania HTTP, nagłówek lub treść wiadomości, albo wartość, np. KVM. Więcej informacji znajdziesz w dokumentacji zmiennych przepływu.

Możesz też używać zmiennych niestandardowych za pomocą zasady JavaScript lub zasady AssignMessage.

Jeśli zdefiniujesz zarówno ref, jak i treść tego elementu, zastosowana zostanie wartość ref, która ma pierwszeństwo, gdy zmienna przepływu jest ustawiona w żądaniu. (Odwrotna sytuacja ma miejsce, gdy zmienna zidentyfikowana w ref nie jest nie ustawiona w żądaniu).

Na przykład:

<Rate ref="request.header.custom_>rat<e&quo>t;1pm/Rate

W tym przykładzie, jeśli klient nie przekaże nagłówka „custom_rate”, limit żądań w przypadku serwera proxy interfejsu API wynosi 1 żądanie na minutę dla wszystkich klientów. Jeśli klient przekaże nagłówek „custom_rate”, limit szybkości wyniesie 10 żądań na sekundę dla wszystkich klientów na serwerze proxy, dopóki nie zostanie wysłane żądanie bez nagłówka „custom_rate”.

Możesz używać parametru <Identifier> do grupowania żądań, aby wymuszać niestandardowe stawki dla różnych typów klientów.

Jeśli określisz wartość atrybutu ref, ale nie ustawisz stawki w treści elementu <Rate>, a klient nie przekaże wartości, zasada Spike Arrest zgłosi błąd.

Opcjonalny nie dotyczy
W tabeli poniżej opisano atrybuty obiektu Rate, które określają sposób ograniczania ruchu:
Atrybut Opis
messagesPerPeriod Określa liczbę wiadomości dozwolonych w określonym czasie. Jeśli na przykład zasady są skonfigurowane dla wartości „10ps” (10 na sekundę), wartość messagesPerPeriod będzie wynosić 10.
periodInMicroseconds Określa w mikrosekundach okres, w którym obliczany jest parametr messagesPerPeriod. W przypadku konfiguracji „10 ps” ta wartość wynosi 1 000 000, czyli 1 sekundę.
maxBurstMessageCount Określa maksymalną liczbę żądań, które mogą być dozwolone natychmiast lub w krótkim czasie na początku nowego przedziału.

<UseEffectiveCount>

Rozdziela liczbę zatrzymań nagłych wzrostów na procesory wiadomości (MP), gdy używasz grup autoskalowania.

Składnia

<SpikeArrest
  continueOnError="[false|true]"
  enabled="[true|false]"
 > na<me="policy_n>ame"

 < UseEffectiveCount>[<false|true]/>UseEffectiveCount
/SpikeArrest

Przykład 1

W tym przykładzie wartość <UseEffectiveCount> jest ustawiona na „true”:

<SpikeArrest name='Spike-Arres>t-1<'>;
  <Rate4>0ps</Rate
  UseEffect>iveC<ounttrue/UseEffect>i<veCount
/Spi>keArrest

Element <UseEffectiveCount> jest opcjonalny. Wartość domyślna to false, gdy element jest pominięty w zasadach ochrony przed nagłymi wzrostami ruchu.

Wartość domyślna Fałsz
Wymagany? Opcjonalny
Typ Wartość logiczna
Element nadrzędny <SpikeArrest>
Elementy podrzędne Brak

W tej tabeli opisujemy atrybuty elementu <UseEffectiveCount>:

Atrybut Opis Domyślny Obecność
ref Określa zmienną, która zawiera wartość <UseEffectiveCount>. Może to być dowolna zmienna przepływu, np. parametr zapytania HTTP, nagłówek lub treść wiadomości. Więcej informacji znajdziesz w dokumentacji zmiennych przepływu. Możesz też ustawić zmienne niestandardowe za pomocą zasady JavaScript lub zasady AssignMessage. nie dotyczy Opcjonalny

Wpływ wartości <UseEffectiveCount> zależy od jej wartości:

  • true: limit częstotliwości skoków MP to <Rate> podzielony przez bieżącą liczbę MP w tym samym podzie. Łączny limit to wartość <Rate>. Gdy moduły MP są dynamicznie dodawane (lub usuwane), ich indywidualne limity szybkości wzrastają (lub maleją), ale łączny limit pozostaje bez zmian.
  • false: limit szybkości wzrostu każdego MP to po prostu wartość jego parametru <Rate>. Łączny limit to suma stawek wszystkich MP. Gdy dodasz lub usuniesz MP, ich indywidualne limity szybkości pozostaną bez zmian, ale łączny limit wzrośnie lub zmaleje.

Zasada SpikeArrest korzysta z algorytmu „token bucket”, który wygładza skoki ruchu, dzieląc określony limit szybkości na mniejsze przedziały. Wadą tego podejścia jest to, że wiele prawidłowych żądań otrzymanych w krótkim czasie może zostać odrzuconych.

Załóżmy na przykład, że wpiszesz limit 30 zapytań na minutę. Podczas testowania możesz sądzić, że możesz wysłać 30 żądań w ciągu 1 sekundy, o ile zmieszczą się one w ciągu minuty. Ale zasady nie wymuszają tego ustawienia w ten sposób. 30 żądań w ciągu 1 sekundy może być w niektórych środowiskach uznane za niewielki skok.

  • Limity na minutę są uśredniane do pełnych żądań dozwolonych w przedziałach sekund.

    Na przykład 30 żądań na minutę jest wygładzane w ten sposób:
    60 sekund (1 minuta) / 30 żądań na minutę = interwały 2-sekundowe, czyli 1 żądanie co 2 sekundy. Drugie żądanie w ciągu 2 sekund zostanie odrzucone. 31 żądanie w ciągu minuty również zakończy się niepowodzeniem.

  • Stawki na sekundę są uśredniane do pełnych żądań dozwolonych w przedziałach milisekund.

    Na przykład 10ps jest wygładzane w ten sposób:
    1000 milisekund (1 sekunda) / 10ps = odstępy 100 milisekund, czyli 1 żądanie co 100 milisekund. Drugie żądanie w ciągu 100 ms zostanie odrzucone. Nie uda się też zrealizować 11 żądania w ciągu sekundy.

W tabeli poniżej przedstawiono wpływ wartości <UseEffectiveCount> na efektywny limit stawek poszczególnych platform handlowych:

Wartość <UseEffectiveCount>
false false false true true true
Liczba punktów monitorowania 8 4 2 8 4 2
Wartość <Rate> 10 10 10 40 40 40
Stawka efektywna za MP 10 10 10 5 10 20
Limit łączny 80 40 20 40* 40* 40*
* Takie same jak <Rate>.

Zwróć uwagę, że w tym przykładzie, gdy liczba punktów MP zmniejsza się z 4 do 2, a <UseEffectiveCount> jest równe false, efektywna stawka za punkt MP pozostaje taka sama (10). Gdy jednak <UseEffectiveCount> wynosi true, efektywna stawka za MP wzrasta z 10 do 20, gdy liczba MP zmniejsza się z 4 do 2.

Zmienne przepływu

Gdy zasada Spike Arrest zostanie wykonana, zostanie wypełniona ta zmienna przepływu:

Zmienna Typ Uprawnienie Opis
ratelimit.policy_name.failed Wartość logiczna Tylko do odczytu Wskazuje, czy zasada nie została zastosowana (true lub false).

Więcej informacji znajdziesz w dokumentacji zmiennych przepływu.

Odniesienie do błędu

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>

Obecny kod stanu HTTP w przypadku przekroczenia limitu liczby żądań określonego przez zasady Quota lub Spike Arrest to 429 (Za dużo żądań). Aby zmienić kod stanu HTTP na 500 (wewnętrzny błąd serwera), ustaw wartość właściwości features.isHTTPStatusTooManyRequestEnabled na false za pomocą interfejsu API do aktualizowania właściwości organizacji.

Na przykład:

curl -u email:password -X POST -H "Content-type:application/xml" http://api.enterprise.apigee.com/v1/organizations/my<org -d \
"Organization type="trial&qu>ot; n<ame=">MyOrganiz<ation"
    Properties
        Property name="fea>ture<s.isHTTPS>tatusTooManyRequest<Enabled&quo>t<;true/Propert>y
        . . .
    /Properties
/Organization"

Schematy

Każdy typ zasad jest zdefiniowany przez schemat XML (.xsd). Schematy zasad są dostępne na GitHubie.

Powiązane artykuły