Zasada SpikeArrest

Przeglądasz dokumentację Apigee Edge.
Otwórz dokumentację Apigee X.
Informacje

Ikona Spike Arrest w interfejsie Edge

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 name może zawierać litery, cyfry, spacje, łączniki, podkreślenia i kropki. Ta wartość nie może przekraczać 255 znaków.

Opcjonalnie użyj elementu <DisplayName>, aby oznaczyć zasadę w edytorze proxy interfejsu zarządzania inną nazwą w języku naturalnym.

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 ref, jak i treść tego elementu, zostanie zastosowana wartość ref, która ma pierwszeństwo, gdy zmienna przepływu zostanie ustawiona w żądaniu. (Odwrotność ma miejsce, gdy zmienna określona w elemencie ref nie jest ustawiona w żądaniu).

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ą <Identifier> możesz grupować żądania, aby wymusić stosowanie stawek niestandardowych dla różnych typów klientów.

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

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.
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ą).
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ę.

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