Wyświetlasz dokumentację Apigee Edge.
Zapoznaj się z dokumentacją Apigee X. info

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>
Ten element ma te atrybuty, które są wspólne dla wszystkich zasad:
Atrybut | Domyślnie | Wymagany? | Description |
---|---|---|---|
name |
Nie dotyczy | Wymagane |
Wewnętrzna nazwa zasady. Wartość atrybutu Opcjonalnie użyj elementu |
continueOnError |
fałsz | Opcjonalnie | Ustaw wartość „false”, aby wyświetlać błąd, gdy zasada nie działa. To prawidłowy proces w przypadku większości zasad. Ustaw wartość „true”, aby kontynuować wykonywanie przepływu nawet po wystąpieniu błędu. |
enabled |
prawda | Opcjonalnie | Ustaw wartość „true”, aby egzekwować zasadę. Ustaw wartość „false”, aby wyłączyć zasadę. Zasada nie będzie egzekwowana, nawet jeśli pozostanie powiązana z przepływem. |
async |
fałsz | Wycofano | Ten atrybut został wycofany. |
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="true" name="SpikeArreast"> <DisplayName>SpikeArreast</DisplayName> <Rate>300pm</Rate> </SpikeArrest>
Efektywna szybkość to 300 tokenów na minutę, co oznacza, że do puli co 200 milisekund dodawany jest nowy token. 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-Arrest-1"> <Rate>12pm</Rate> <Identifier ref="client_id" /> <MessageWeight ref="request.header.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-Arrest-1"> <Rate ref="request.header.runtime_rate" /> </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>
Używaj tego atrybutu w połączeniu z atrybutem name
, aby oznaczyć zasadę w edytorze proxy interfejsu zarządzania inną, bardziej naturalnie brzmiącą nazwą.
Element <DisplayName>
jest wspólny dla wszystkich zasad.
Wartość domyślna | nie dotyczy |
Wymagany? | Opcjonalnie. Jeśli pominiesz <DisplayName> , używana jest wartość atrybutu name zasady. |
Typ | Ciąg znaków |
Element nadrzędny | <PolicyElement> |
Elementy podrzędne | Brak |
Element <DisplayName>
ma tę składnię:
Składnia
<PolicyElement> <DisplayName>policy_display_name</DisplayName> ... </PolicyElement>
Przykład
<PolicyElement> <DisplayName>My Validation Policy</DisplayName> </PolicyElement>
Element <DisplayName>
nie ma atrybutów ani elementów podrzędnych.
<Identifier>
Umożliwia wybór sposobu grupowania żądań, aby można było zastosować zasadę Spike Arrest 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]" name="policy_name" > <Identifier ref="flow_variable"/> </SpikeArrest>
Przykład 1
W tym przykładzie zasada Spike Arrest jest stosowana do każdego identyfikatora dewelopera:
<SpikeArrest name="Spike-Arrest-1"> <Identifier ref="developer.id"/> <Rate>42pm</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. tych, które są dostępne w zasadach VerifyAPIKey. Możesz też ustawić zmienne niestandardowe za pomocą zasady JavaScript lub zasady AssignMessage. | nie dotyczy | Wymagane |
Ten element został też omówiony w tym poście na forum społeczności Apigee: http://community.apigee.com/questions/2807/how-does-the-edge-quota-policy-work-when-no-identi.html.
<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 <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]" name="policy_name" > <MessageWeight 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-Arrest-1"> <Rate>12pm</Rate> <Identifier ref="client_id" /> <MessageWeight ref="request.header.weight" /> </SpikeArrest>
W tym przykładzie funkcja <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ść, z jaką należy ograniczać skoki (lub nagłe wzrosty) ruchu, ustawiając liczbę żądań dozwolonych w interwałach minutowych lub sekundowych. Możesz też użyć tego elementu w połączeniu z <Identifier>
i <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]" name="policy_name" > <Rate ref="flow_variable">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-Arrest-1"> <Rate>5ps</Rate> </SpikeArrest>
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="true" name="SpikeArreast"> <DisplayName>SpikeArreast</DisplayName> <Rate>300pm</Rate> </SpikeArrest>
Ta przykładowa zasada uśrednia liczbę żądań do jednego żą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 Na przykład: <Rate ref="request.header.custom_rate">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 Jeśli określisz wartość atrybutu |
Opcjonalny | nie dotyczy |
<UseEffectiveCount>
Rozdziela liczbę zatrzymań nagłych wzrostów na procesory wiadomości (MP) w przypadku korzystania z grup autoskalowania.
Składnia
<SpikeArrest continueOnError="[false|true]" enabled="[true|false]" name="policy_name" > <UseEffectiveCount>[false|true]</UseEffectiveCount> </SpikeArrest>
Przykład 1
W tym przykładzie wartość <UseEffectiveCount>
jest ustawiona na „true”:
<SpikeArrest name='Spike-Arrest-1'> <Rate>40ps</Rate> <UseEffectiveCount>true</UseEffectiveCount> </SpikeArrest>
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>
. Limit łączny 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ń przychodzących w krótkim odstępie czasu może zostać odrzuconych.
Załóżmy, że wpiszesz wartość 30pm (30 żądań 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 uznawane za niewielki skok.
- Stawki za 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ż wysłać 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* |
* Taka sama 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
W tej sekcji opisano zwracane kody błędów i komunikaty o błędach oraz zmienne błędów ustawiane przez Edge, gdy ta zasada wywołuje błąd. Warto o tym wiedzieć, jeśli rozwijasz reguły błędów, aby obsługi błędów. Więcej informacji: Niezbędne informacje o błędach związanych z zasadami i postępowaniu z błędami
Błędy w czasie wykonywania
Te błędy mogą wystąpić podczas wykonywania zasady.
Kod błędu | Stan HTTP | Przyczyna | Napraw |
---|---|---|---|
policies.ratelimit.FailedToResolveSpikeArrestRate |
500 |
Ten błąd występuje, jeśli odwołanie do zmiennej zawierającej ustawienie stawki
w elemencie <Rate> nie można przyjąć wartości w ramach parametru Spike Arrest
. Ten element jest obowiązkowy i służy do określania gwałtownego wzrostu współczynnika zatrzymania w
ma postać intpm lub intps . |
build |
policies.ratelimit.InvalidMessageWeight |
500 |
Ten błąd występuje, jeśli wartość określona dla elementu <MessageWeight> przez
zmienna przepływu jest nieprawidłowa (wartość nie jest liczbą całkowitą). |
build |
policies.ratelimit.SpikeArrestViolation |
429 |
Przekroczono limit żądań. |
Błędy wdrażania
Te błędy mogą wystąpić podczas wdrażania serwera proxy zawierającego tę zasadę.
Nazwa błędu | Przyczyna | Napraw |
---|---|---|
InvalidAllowedRate |
gwałtowny wzrost liczby aresztowań określony w elemencie <Rate> w grze Spike Arest;
Zasada nie jest liczbą całkowitą, a jeśli stopa nie ma sufiksu ps lub pm ,
wdrożenie serwera proxy interfejsu API się nie uda. |
build |
Zmienne błędów
Te zmienne są ustawiane po wystąpieniu błędu działania. Więcej informacji znajdziesz w artykule Podstawowe informacje o błędach związanych z naruszeniem zasad.
Zmienne | Gdzie | Przykład |
---|---|---|
fault.name="fault_name" |
fault_name to nazwa błędu podana w tabeli tabeli Błędy czasu działania powyżej. Nazwa błędu to ostatnia część kodu błędu. | fault.name Matches "SpikeArrestViolation" |
ratelimit.policy_name.failed |
policy_name to określona przez użytkownika nazwa zasady, która spowodowała błąd. | ratelimit.SA-SpikeArrestPolicy.failed = true |
Przykładowa odpowiedź na błąd
Poniżej znajdziesz przykładową odpowiedź na błąd:
{ "fault":{ "detail":{ "errorcode":"policies.ratelimit.SpikeArrestViolation" }, "faultstring":"Spike arrest violation. Allowed rate : 10ps" } }
Przykładowa reguła błędu
Poniżej znajduje się przykładowa reguła błędu obsługi błędu 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>
Obecny kod stanu HTTP w przypadku przekroczenia limitu szybkości określonego przez zasadę dotyczącą limitu lub ochrony przed nagłymi wzrostami 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
Aktualizowanie 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/myorg -d \ "<Organization type="trial" name="MyOrganization"> <Properties> <Property name="features.isHTTPStatusTooManyRequestEnabled">true</Property> . . . </Properties> </Organization>"
Schematy
Każdy typ zasad jest zdefiniowany przez schemat XML (.xsd
). Schematy zasad są dostępne na GitHubie.
Powiązane artykuły
- Zasady dotyczące limitów: zasady dotyczące limitów, które ograniczają ruch na poszczególnych klientach.
- Ograniczanie liczby żądań – omówienie ograniczeń liczby żądań
- Porównanie zasad dotyczących limitów i zasad SpikeArrest
- Działające przykłady serwerów proxy interfejsu API