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

Zasada Spike Arrest chroni przed nagłymi wzrostami ruchu dzięki elementowi <Rate>
. Ten element ogranicza liczbę żądań przetwarzanych przez serwer proxy API i wysyłanych do backendu, chroniąc przed spadkiem wydajności i przestojami.
Element <SpikeArrest>
Określa zasadę Spike Arrest.
Wartość domyślna | Zobacz kartę Domyślne zasady poniżej. |
Wymagany? | Opcjonalny |
Typ | Obiekt złożony |
Element nadrzędny | nie dotyczy |
Elementy podrzędne |
<Identifier> <MessageWeight> <Rate> (wymagany)<UseEffectiveCount> |
Składnia
Element <SpikeArrest>
używa tej 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
Ten przykład pokazuje ustawienia domyślne 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 stosować zasadę Spike Arrest:
Przykład 1
W tym przykładzie ustawiono szybkość na 5 na sekundę:
<SpikeArrest name="Spike-Arrest-1"> <Rate>5ps</Rate> </SpikeArrest>
Ta zasada wygładza częstotliwość do jednej prośby na każde 200 milisekund (1000/5).
Przykład 2
W tym przykładzie ustawiono stawkę na 300 na minutę:
<SpikeArrest async="false" continueOnError="false" enabled="true" name="SpikeArreast"> <DisplayName>SpikeArreast</DisplayName> <Rate>300pm</Rate> </SpikeArrest>
Skuteczna częstotliwość to 300 pm, co oznacza, że do puli dodawany jest nowy token co 200 ms. Rozmiar puli jest zawsze ustawiany na 10% wartości messagesPerPeriod
. Dlatego przy messagesPerPeriod
równym 300 rozmiar puli wynosi 30 tokenów.
Przykład 3
W tym przykładzie żądania są ograniczone do 12 na minutę (dozwolone jest 1 żą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 wagę wiadomości w przypadku konkretnych aplikacji lub klientów. Zapewnia to dodatkową kontrolę nad ograniczeniem przepustowości w przypadku elementów zidentyfikowanych za pomocą elementu <Identifier>
.
Przykład 4
W tym przykładzie polecenie Spike Arrest sprawdza wartość czasu wykonywania ustawioną za pomocą żądania przekazywanego 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>
Oprócz atrybutu name
możesz użyć innej, bardziej naturalnie brzmiącej nazwy do oznaczenia zasady w edytorze proxy w interfejsie zarządzania.
Element <DisplayName>
jest wspólny dla wszystkich zasad.
Wartość domyślna | nie dotyczy |
Wymagany? | Opcjonalnie. Jeśli pominiesz parametr <DisplayName> , zostanie użyta wartość atrybutu name zasady. |
Typ | Ciąg znaków |
Element nadrzędny | <PolicyElement> |
Elementy podrzędne | Brak |
Element <DisplayName>
używa tej 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 wybranie 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ą się liczyć do jego własnego współczynnika Spike Arrest, a nie wszystkich żądań do serwera proxy.
Aby uzyskać bardziej szczegółową kontrolę nad ograniczaniem żądań, użyj elementu <MessageWeight>
.
Jeśli element <Identifier>
pozostanie pusty, dla wszystkich żądań wysyłanych 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 na podstawie identyfikatora dewelopera:
<SpikeArrest name="Spike-Arrest-1"> <Identifier ref="developer.id"/> <Rate>42pm</Rate/> </SpikeArrest>
W tej tabeli opisano atrybuty <Identifier>
:
Atrybut | Opis | Domyślny | Obecność |
---|---|---|---|
ref |
Określa zmienną, według której Spike Arrest grupował przychodzące żądania. Aby wskazać unikalnego klienta, możesz użyć dowolnej zmiennej przepływu, np. dostępnej w zasadzie VerifyAPIKey. Zmienne niestandardowe możesz też ustawić za pomocą zasad dotyczących JavaScriptu lub zasad dotyczących przypisywania wiadomości. | nie dotyczy | Wymagane |
Ten element jest również omawiany w tym poście w 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 zmienia wpływ pojedynczego żądania na obliczenie współczynnika Spike Arrest. Waga wiadomości może być dowolną zmienną przepływu, np. nagłówkiem HTTP, parametrem zapytania, parametrem formularza lub treścią w treści wiadomości. Zmiennych niestandardowych możesz też używać w ramach zasad dotyczących JavaScriptu lub zasad dotyczących funkcji AssignMessage.
Używaj ich razem z <Identifier>
, aby dodatkowo ograniczać liczbę żądań wysyłanych przez konkretnych klientów lub aplikacje.
Jeśli np. wartość <Rate>
dla szczytowego zatrzymania <Rate>
wynosi 10pm
, a aplikacja przesyła żądania o ciężarze 2
, z tego klienta dozwolone są tylko 5 wiadomości na minutę, ponieważ każde żądanie jest liczone 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
W tym przykładzie żądania są ograniczone do 12 na minutę (dozwolone jest 1 żą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 parametr <MessageWeight>
przyjmuje wartość niestandardową (nagłówek weight
w żądaniu), która dostosowuje wagi wiadomości dla konkretnych klientów. Zapewnia to dodatkową kontrolę nad ograniczeniem przepustowości w przypadku elementów zidentyfikowanych za pomocą elementu <Identifier>
.
W tej tabeli opisano atrybuty <MessageWeight>
:
Atrybut | Opis | Obecność | Domyślny |
---|---|---|---|
ref |
Identyfikuje 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ść nagłówka wiadomości. Więcej informacji znajdziesz w dokumentacji dotyczącej zmiennych przepływu. Możesz też ustawić zmienne niestandardowe za pomocą zasad dotyczących JavaScriptu lub zasad dotyczących przypisywania wiadomości. | Wymagane | Nie dotyczy |
<Rate>
Określa szybkość, z jaką należy ograniczać skok (lub wzrost) natężenia ruchu, przez ustawienie liczby żądań dozwolonych w interwałach minutowych lub sekundowych. Możesz też użyć tego elementu w połączeniu z elementami <Identifier>
i <MessageWeight>
, aby płynnie ograniczać natężenie ruchu w czasie wykonywania, 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łe oprocentowanie, które określasz jako treść elementu
<Rate>
. - Wartość zmiennej, którą może przekazać klient; nazwę zmiennej przepływu można zidentyfikować 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 stawek (zdefiniowane jako wartość zmiennej lub w treści elementu) muszą odpowiadać temu formatowi:
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ą niezerową.
Przykład 1
W tym przykładzie ustawiamy szybkość na 5 żądań na sekundę:
<SpikeArrest name="Spike-Arrest-1"> <Rate>5ps</Rate> </SpikeArrest>
Ta zasada wygładza częstotliwość do jednej prośby na każde 200 milisekund (1000/5).
Przykład 2
W tym przykładzie ustawiono częstotliwość 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 wygładza częstotliwość do 1 żądania na 5 sekund (60/12).
W tej tabeli 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ść treści wiadomości, albo wartość, np. KVM. Więcej informacji znajdziesz w dokumentacji dotyczącej zmiennych przepływu.
Możesz też używać zmiennych niestandardowych, korzystając z zasad dotyczących JavaScriptu lub zasad dotyczących przypisywania wiadomości. 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”, szybkość dla serwera proxy API wynosi 1 żądanie na minutę dla wszystkich klientów. Jeśli klient przekaże nagłówek „custom_rate”, limit szybkości zostanie ustawiony na 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żyć Jeśli podasz wartość atrybutu |
Opcjonalny | nie dotyczy |
<UseEffectiveCount>
Przy użyciu autoskalowania rozkłada liczbę Spike Arrest na procesory wiadomości (MP) w grupach.
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 „prawda”:
<SpikeArrest name='Spike-Arrest-1'> <Rate>40ps</Rate> <UseEffectiveCount>true</UseEffectiveCount> </SpikeArrest>
Element <UseEffectiveCount>
jest opcjonalny. Wartość domyślna to false
, jeśli element jest pominięty w zasadach Spike Arrest.
Wartość domyślna | Fałsz |
Wymagany? | Opcjonalny |
Typ | Wartość logiczna |
Element nadrzędny |
<SpikeArrest>
|
Elementy podrzędne | Brak |
W tej tabeli opisano 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 dotyczącej zmiennych przepływu. Możesz też ustawić zmienne niestandardowe za pomocą zasad dotyczących JavaScriptu lub zasad dotyczących przypisywania wiadomości. |
nie dotyczy | Opcjonalny |
Efekt działania funkcji <UseEffectiveCount>
zależy od jej wartości:
true
: Ograniczenie częstotliwości szczytowej instancji usługi jest równe<Rate>
podzielone przez bieżącą liczbę instancji usługi w tym samym podzie. Łączny limit to<Rate>
. Gdy MP są dynamicznie dodawane (lub usuwane), ich indywidualne limity szybkości będą się zwiększać (lub zmniejszać), ale łączny limit pozostanie taki sam.false
(jeśli nie zostanie podana, jest to wartość domyślna): limit szybkości szczytowej każdego MP jest po prostu wartością jego<Rate>
. Łączny limit to suma stawek wszystkich MP. Gdy dodasz (lub usuniesz) MP, ich indywidualne limity szybkości skoku pozostaną bez zmian, ale łączny limit zostanie zwiększony (lub zmniejszony).
Poniższa tabela pokazuje wpływ wartości <UseEffectiveCount>
na skuteczny limit stawki każdego MP:
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 na MP | 10 | 10 | 10 | 5 | 10 | 20 |
Limit zbiorczy | 80 | 40 | 20 | 40* | 40* | 40* |
* To samo co <Rate> . |
W tym przykładzie zwróć uwagę, że gdy liczba MP zmniejszy się z 4 na 2, a <UseEffectiveCount>
będzie równa false
, skuteczna stawka na MP pozostanie taka sama (na poziomie 10). Gdy jednak <UseEffectiveCount>
= true
, skuteczna stawka na MP zmienia się z 10 na 20, gdy liczba MP zmniejsza się z 4 na 2.
Zmienne przepływu
Gdy zadziała reguła zapobiegania wzrostom, wypełnia się ta zmienna przepływu:
Zmienna | Typ | Uprawnienie | Opis |
---|---|---|---|
ratelimit.policy_name.failed |
Wartość logiczna | Tylko do odczytu | Wskazuje, czy zasada zakończyła się niepowodzeniem (true lub false ). |
Więcej informacji znajdziesz w dokumentacji dotyczącej 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 zatrzymania wzrostu to 429
(Za dużo żądań). Aby zmienić kod stanu HTTP na 500
(błąd wewnętrzny serwera), użyj interfejsu API
Update organization properties, aby ustawić właściwość features.isHTTPStatusTooManyRequestEnabled
na false
.
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 definiowany przez schemat XML (.xsd
). Informacje na temat schematów zasad znajdziesz na GitHubie.
Powiązane artykuły
- Zasady dotyczące limitów: zasady dotyczące limitów, aby ograniczyć ruch dla poszczególnych klientów
- Ograniczenie szybkości – omówienie ograniczania szybkości
- Porównywanie zasad dotyczących limitów i SpikeArrest
- działające przykłady serwerów proxy interfejsu API