Przeglądasz dokumentację Apigee Edge.
Otwórz dokumentację Apigee X. Informacje
![Ikona Spike Arrest w interfejsie Edge](https://docs.apigee.com/static/api-platform/images/icon_policy_spike-arrest.jpg?hl=pl)
Zasada Spike Arrest chroni przed wzrostem natężenia ruchu dzięki elementowi <Rate>
. Ten element ogranicza liczbę żądań przetwarzanych przez serwer proxy interfejsu API i wysyłanych do backendu, chroniąc przed opóźnieniami w działaniu i przestojami.
Element <SpikeArrest>
Definiuje zasadę dotyczącą Spike Arrest.
Wartość domyślna | Zobacz kartę Zasady domyślne poniżej |
Wymagany? | Opcjonalnie |
Typ | Złożony obiekt |
Element nadrzędny | nie dotyczy |
Elementy podrzędne |
<Identifier> <MessageWeight> <Rate> (wymagany)<UseEffectiveCount> |
Składnia
W elemencie <SpikeArrest>
używana jest taka składnia:
<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ślna zasada
Poniższy przykład pokazuje ustawienia domyślne, gdy dodajesz zasadę Spike Arrest do procesu 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ą, w jaki sposób można korzystać z zasady aresztowania agresywnego:
Przykład 1
Ten przykład ustawia szybkość na pięć na sekundę:
<SpikeArrest name="Spike-Arrest-1"> <Rate>5ps</Rate> </SpikeArrest>
Ta zasada wygładza częstotliwość do jednego żądania dozwolonego na 200 milisekund (1000/5).
Przykład 2
W tym przykładzie ustawiono stawkę na 12 na minutę:
<SpikeArrest name="Spike-Arrest-1"> <Rate>12pm</Rate> </SpikeArrest>
Ta przykładowa zasada wygładza częstotliwość do 1 żądania dozwolonego co 5 sekund (60/12).
Przykład 3
Poniższy przykład ogranicza liczbę żądań do 12 na minutę (1 żądanie dozwolone 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>
może mieć wartość niestandardową (nagłówek weight
), która dostosowuje wagę wiadomości w przypadku określonych aplikacji lub klientów. Zapewnia to dodatkową kontrolę nad ograniczaniem w przypadku encji zdefiniowanych za pomocą elementu <Identifier>
.
Przykład 4
Ten przykład instruuje Spike Arrest, że szuka wartości środowiska wykonawczego ustawionej za pomocą żądania, które jest przekazywane 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ć postać intpm
lub intps
.
Aby wypróbować ten przykład, wykonaj żądanie podobne do tego:
curl http://myorg-myenv.apigee.net/price -H 'runtime_rate:30ps'
Odniesienie do elementu podrzędnego
W tej sekcji opisano elementy podrzędne funkcji <SpikeArrest>
.
<DisplayName>
Użyj oprócz atrybutu name
, aby oznaczyć zasadę w edytorze serwera proxy interfejsu zarządzania inną, bardziej naturalną nazwą.
Element <DisplayName>
jest wspólny dla wszystkich zasad.
Wartość domyślna | nie dotyczy |
Wymagany? | Opcjonalnie. Jeśli pominiesz właściwość <DisplayName> , zostanie użyta wartość atrybutu name zasady |
Typ | Ciąg znaków |
Element nadrzędny | <PolicyElement> |
Elementy podrzędne | Brak |
W elemencie <DisplayName>
używana jest taka składnia:
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>
Pozwala wybrać sposób grupowania żądań, aby można było stosować zasadę Spike Arrest zależnie od klienta. Możesz na przykład pogrupować żądania według identyfikatora dewelopera. W takim przypadku żądania każdego dewelopera będą wliczane do jego własnego wskaźnika tymczasowego aresztowania, a nie do wszystkich żądań wysyłanych do serwera proxy.
Aby uzyskać bardziej szczegółową kontrolę nad ograniczaniem żądań, używaj ich w połączeniu z elementem <MessageWeight>
.
Jeśli pozostawisz element <Identifier>
pusty, dla wszystkich żądań wysyłanych do tego serwera proxy interfejsu API będzie egzekwowany jeden limit liczby żądań.
Wartość domyślna | nie dotyczy |
Wymagany? | Opcjonalnie |
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 zastosowano zasadę dotyczącą Spike Arrest dla identyfikatora dewelopera:
<SpikeArrest name="Spike-Arrest-1"> <Identifier ref="developer.id"/> <Rate>42pm</Rate/> </SpikeArrest>
Poniższa tabela opisuje atrybuty <Identifier>
:
Atrybut | Opis | Domyślne | Obecność |
---|---|---|---|
ref |
Identyfikuje zmienną, według której Spike Arrest grupuje przychodzące żądania. Aby wskazać unikalnego klienta, możesz użyć dowolnej zmiennej przepływu, np. takiego, który jest dostępny w zasadzie VerifyAPIKey. Zmienne niestandardowe możesz też ustawić za pomocą zasad JavaScript lub zasad AssignMessage. | nie dotyczy | Wymagane |
Ten element został również 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ę określoną dla każdej wiadomości. Waga wiadomości zmienia wpływ pojedynczego żądania na obliczanie częstotliwości aresztowania wiadomości. Waga wiadomości może być dowolną zmienną przepływu, taką jak nagłówek HTTP, parametr zapytania, parametr formularza lub treść wiadomości. Możesz też używać zmiennych niestandardowych za pomocą zasad JavaScriptu lub zasady AssignMessage.
Używaj w połączeniu z <Identifier>
, aby jeszcze bardziej ograniczać żądania pochodzące od konkretnych klientów lub aplikacji.
Jeśli na przykład wskaźnik Spike Arrest <Rate>
ma wartość 10pm
, a aplikacja przesyła żądania o wadze 2
, to klient może wysłać tylko 5 wiadomości na minutę, ponieważ każde żądanie liczy się jako 2.
Wartość domyślna | nie dotyczy |
Wymagany? | Opcjonalnie |
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
Poniższy przykład ogranicza liczbę żądań do 12 na minutę (1 żądanie dozwolone 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 <MessageWeight>
akceptuje wartość niestandardową (nagłówek weight
w żądaniu), która dostosowuje wagę wiadomości dla określonych klientów. Zapewnia to dodatkową kontrolę nad ograniczaniem w przypadku encji zdefiniowanych za pomocą elementu <Identifier>
.
Poniższa tabela opisuje atrybuty <MessageWeight>
:
Atrybut | Opis | Obecność | Domyślne |
---|---|---|---|
ref |
Identyfikuje zmienną przepływu zawierającą wagę wiadomości 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. Zmienne niestandardowe możesz też ustawić za pomocą zasad JavaScript lub zasad AssignMessage. | Wymagane | Nie dotyczy |
<Rate>
Określa częstotliwość, z jaką chcesz ograniczać nagłe skoki (lub impulsy) ruchu, ustawiając liczbę dozwolonych żądań w interwałach na minutę lub sekundę. Tego elementu możesz też używać w połączeniu z elementami <Identifier>
i <MessageWeight>
, aby płynnie ograniczać ruch w czasie działania przez akceptowanie 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:
- Stawka statyczna, którą określasz jako treść elementu
<Rate>
. - Wartość zmiennej, którą może przekazywać klient; nazwę zmiennej przepływu Użyj 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 (określone jako wartość zmiennej lub w treści elementu) muszą mieć format:
intps
(liczba żądań na sekundę w odstępach w milisekundach)intpm
(liczba żądań na minutę w odstępach sekundowych)
Wartość int musi być dodatnią liczbą całkowitą inną niż zero.
Przykład 1
Ten przykład ustawia szybkość na pięć żądań na sekundę:
<SpikeArrest name="Spike-Arrest-1"> <Rate>5ps</Rate> </SpikeArrest>
Ta zasada wygładza częstotliwość do jednego żądania dozwolonego na 200 milisekund (1000/5).
Przykład 2
Ten przykład ustawia szybkość na 12 żądań na minutę:
<SpikeArrest name="Spike-Arrest-1"> <Rate>12pm</Rate> </SpikeArrest>
Ta przykładowa zasada wygładza częstotliwość do 1 żądania dozwolonego co 5 sekund (60/12).
Poniższa tabela opisuje atrybuty <Rate>
:
Atrybut | Opis | Obecność | Domyślne |
---|---|---|---|
ref |
Identyfikuje zmienną przepływu, która określa tempo. Może to być dowolna zmienna przepływu, np. parametr zapytania HTTP, nagłówek lub treść wiadomości, lub wartość, np. KVM. Więcej informacji znajdziesz w dokumentacji zmiennych przepływu.
Możesz też używać zmiennych niestandardowych za pomocą zasad JavaScript lub zasad 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 przekazuje nagłówka „custom_rate”, stawka dla serwera proxy interfejsu API wynosi 1 żądanie na minutę dla wszystkich klientów. Jeśli klient przekazuje nagłówek „custom_rate”, limit szybkości wynosi 10 żądań na sekundę w przypadku wszystkich klientów korzystających z serwera proxy – dopóki nie zostanie wysłane żądanie bez nagłówka „custom_rate”. Za pomocą Jeśli określisz wartość |
Opcjonalnie | nie dotyczy |
<UseEffectiveCount>
Podczas korzystania z grup autoskalowania rozdziela liczbę węzłów Spike Arrest między procesory wiadomości (MP).
Składnia
<SpikeArrest continueOnError="[false|true]" enabled="[true|false]" name="policy_name" > <UseEffectiveCount>[false|true]</UseEffectiveCount> </SpikeArrest>
Przykład 1
Ten przykład ustawia wartość zasady <UseEffectiveCount>
na wartość true (prawda):
<SpikeArrest name='Spike-Arrest-1'> <Rate>40ps</Rate> <UseEffectiveCount>true</UseEffectiveCount> </SpikeArrest>
Element <UseEffectiveCount>
jest opcjonalny. Wartością domyślną jest false
, gdy element jest pominięty w zasadach dotyczących aresztowania Spike’s.
Wartość domyślna | Fałsz |
Wymagany? | Opcjonalnie |
Typ | Wartość logiczna |
Element nadrzędny |
<SpikeArrest>
|
Elementy podrzędne | Brak |
Tabela poniżej zawiera opis atrybutów elementu <UseEffectiveCount>
:
Atrybut | Opis | Domyślne | Obecność |
---|---|---|---|
ref |
Identyfikuje 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. Zmienne niestandardowe możesz też ustawić za pomocą zasad JavaScript lub zasad AssignMessage. |
nie dotyczy | Opcjonalnie |
Efekt działania funkcji <UseEffectiveCount>
zależy od jej wartości:
true
: limit szybkości wzrostu MP to wartość<Rate>
podzielona przez aktualną liczbę Mpix w tym samym podzie. Limit zbiorczy to wartość<Rate>
. Gdy MP są dodawane (lub usuwane), ich indywidualne limity częstotliwości wzrosną (lub zmaleją), ale łączny limit się nie zmieni.false
(wartość domyślna, jeśli zostanie pominięta): limit szybkości wzrostu każdego MP to po prostu wartość jego<Rate>
. Łączny limit to suma stawek wszystkich cen ofertowych. Po dodaniu (lub usunięciu MP) limity liczby żądań skokowych nie zmienią się, ale łączny limit się zwiększy (lub zmaleje).
W tabeli poniżej pokazujemy wpływ zasady <UseEffectiveCount>
na limit efektywnej szybkości transmisji bitów każdego Mpix:
Wartość <UseEffectiveCount> |
||||||
---|---|---|---|---|---|---|
false |
false |
false |
true |
true |
true |
|
Liczba posłów | 8 | 4 | 2 | 8 | 4 | 2 |
Wartość <Rate> |
10 | 10 | 10 | 40 | 40 | 40 |
Efektywna stawka na Mpix | 10 | 10 | 10 | 5 | 10 | 20 |
Zbiorczy limit | 80 | 40 | 20 | 40* | 40* | 40* |
* Tak samo jak w przypadku <Rate> . |
Zwróć uwagę, że w tym przykładzie, gdy liczba Mpix zostanie zmniejszona z 4 do 2, a <UseEffectiveCount>
wynosi false
, efektywna stawka na Mpix pozostanie taka sama (przy wartości 10). Jednak gdy <UseEffectiveCount>
wynosi true
, efektywna stawka na Mpx wzrośnie z 10 do 20 po zmniejszeniu liczby Mpix z 4 do 2.
Zmienne przepływu
Po uruchomieniu zasady Spike Arrest wypełniana jest taka zmienna przepływu:
Zmienna | Typ | Uprawnienia | Opis |
---|---|---|---|
ratelimit.policy_name.failed |
Wartość logiczna | Tylko do odczytu | Wskazuje, czy zasada nie powiodła się (true lub false ). |
Więcej informacji znajdziesz w dokumentacji zmiennych przepływu.
Informacje o błędach
W tej sekcji opisujemy kody błędów i komunikaty o błędach, które są zwracane, a także zmienne błędów ustawiane przez Edge, gdy ta zasada aktywuje błąd. Te informacje są ważne, jeśli opracowujesz reguły dotyczące błędów do obsługi takich błędów. Więcej informacji znajdziesz w sekcjach Co musisz wiedzieć o błędach zasad i Postępowanie w przypadku błędów.
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że zostać dopasowane do wartości w zasadzie Spike Arrest. Ten element jest wymagany i służy do określania częstotliwości aresztowań w przypadku nagłej liczby aresztowań w postaci intpm lub intps . |
build |
policies.ratelimit.InvalidMessageWeight |
500 |
Ten błąd występuje, jeśli wartość elementu <MessageWeight> w zmiennej przepływu jest nieprawidłowa (wartość nie jest liczbą całkowitą). |
build |
policies.ratelimit.SpikeArrestViolation |
429 |
Przekroczono limit częstotliwości żądań. |
Błędy wdrażania
Te błędy mogą wystąpić podczas wdrażania serwera proxy zawierającego te zasady.
Nazwa błędu | Przyczyna | Napraw |
---|---|---|
InvalidAllowedRate |
Jeśli nagły wzrost liczby aresztowań określony w elemencie <Rate> zasady aresztowania Spike nie jest liczbą całkowitą lub częstotliwość nie ma sufiksu ps ani pm , wdrożenie serwera proxy interfejsu API nie powiedzie się. |
build |
Zmienne błędów
Te zmienne są ustawiane, gdy wystąpi błąd środowiska wykonawczego. Więcej informacji znajdziesz w artykule Co musisz wiedzieć 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 Błędy środowiska wykonawczego powyżej. Nazwa błędu to ostatnia część kodu. | 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 znajduje się przykładowa odpowiedź o błędzie:
{ "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 dotycząca błędu w przypadku 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>
Bieżący kod stanu HTTP oznaczający przekroczenie limitu liczby żądań ustawionego przez zasadę limitu lub Spike Arrest to 429
(zbyt wiele żądań). Aby zmienić kod stanu HTTP na 500
(wewnętrzny błąd serwera), ustaw właściwość features.isHTTPStatusTooManyRequestEnabled
na false
za pomocą interfejsu API
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/myorg -d \ "<Organization type="trial" name="MyOrganization"> <Properties> <Property name="features.isHTTPStatusTooManyRequestEnabled">true</Property> . . . </Properties> </Organization>"
Schematy
Każdy typ zasady jest definiowany 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 ruchu w przypadku pojedynczych klientów
- Omówienie ograniczeń liczby żądań
- Porównanie zasad dotyczących limitów i SpikeArrest
- Przykładowe działanie serwerów proxy interfejsów API