Zasady dotyczące limitów

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

Co

Za pomocą zasady Quota możesz skonfigurować liczbę wiadomości z żądaniami, które serwer proxy interfejsu API może przetwarzać w określonym czasie, np. w ciągu minuty, godziny, dnia, tygodnia lub miesiąca. Możesz ustawić ten sam limit dla wszystkich aplikacji uzyskujących dostęp do serwera proxy interfejsu API lub ustawić limit na podstawie:

  • Produkt zawierający serwer proxy interfejsu API
  • aplikacja, która wysyła żądanie do interfejsu API;
  • Deweloper aplikacji
  • wiele innych kryteriów.

Nie używaj limitu, aby chronić się przed ogólnymi skokami ruchu. Do tego celu użyj zasady Spike Arrest. Zapoznaj się z zasadami Spike Arrest.

Filmy

W tych filmach przedstawiamy zarządzanie limitami za pomocą zasad dotyczących limitów:

Intro (New Edge)

Intro (Classic Edge)

Dynamic Quota

Rozproszone i synchroniczne

Waga wiadomości

Kalendarz

Okres obserwacji

Flexi

Limit warunkowy

Zmienne przepływu

Obsługa błędów

Przykłady

Te przykłady kodu zasad pokazują, jak rozpoczynać i kończyć okresy limitu:

Większy limit dynamiczny

<Quota name="CheckQuota">
  <Interval ref="verifyapikey.verify-api-key.apiproduct.developer.quota.interval">1</Interval>
  <TimeUnit ref="verifyapikey.verify-api-key.apiproduct.developer.quota.timeunit">hour</TimeUnit>
  <Allow count="200" countRef="verifyapikey.verify-api-key.apiproduct.developer.quota.limit"/>
</Quota>

Limity dynamiczne umożliwiają skonfigurowanie pojedynczych zasad limitów, które wymuszają różne ustawienia limitów na podstawie informacji przekazywanych do tych zasad. Innym określeniem ustawień limitu w tym kontekście jest „Plan usługi”. Dynamiczny limit sprawdza „Plan usługi” aplikacji, a następnie wymusza te ustawienia.

Uwaga: jeśli podasz zarówno wartość, jak i odniesienie do elementu, pierwszeństwo będzie miało odniesienie. Jeśli odwołanie nie zostanie rozpoznane w czasie działania, używana jest wartość.

Na przykład podczas tworzenia produktu API możesz opcjonalnie ustawić dozwolony limit limitu, jednostkę czasu i interwał. Ustawienie tych wartości w usłudze API nie wymusza jednak ich użycia w proxy interfejsu API. Musisz też dodać do proxy interfejsu API zasadę dotyczącą limitów, która odczytuje te wartości. Więcej informacji znajdziesz w artykule Tworzenie usług API.

W przykładzie powyżej serwer proxy interfejsu API zawierający zasadę dotyczącą limitu używa zasady VerifyAPIKey o nazwie verify-api-key do weryfikacji klucza interfejsu API przekazanego w żądaniu. Zasada Quota policy uzyskuje następnie dostęp do zmiennych przepływu z zasady VerifyAPIKey, aby odczytać wartości limitu ustawione w usłudze API. Więcej informacji o zmiennych przepływu VerifyAPIKey znajdziesz w sekcji Zasady Verify API Key.

Możesz też ustawić atrybuty niestandardowe dla poszczególnych deweloperów lub aplikacji, a następnie odczytać te wartości w zasadach dotyczących limitów. Możesz na przykład ustawić różne wartości limitu dla poszczególnych deweloperów. W tym przypadku ustawiasz atrybuty niestandardowe dewelopera zawierające limit, jednostkę czasu i interwał. Następnie odwołujesz się do tych wartości w zasadach dotyczących limitów, jak pokazano poniżej:

<Quota name="DeveloperQuota">
  <Identifier ref="verifyapikey.verify-api-key.client_id"/>
  <Interval ref="verifyapikey.verify-api-key.developer.timeInterval"/>
  <TimeUnit ref="verifyapikey.verify-api-key.developer.timeUnit"/>
  <Allow countRef="verifyapikey.verify-api-key.developer.limit"/>
</Quota>

W tym przykładzie używane są też zmienne przepływu VerifyAPIKey, aby odwoływać się do atrybutów niestandardowych ustawionych dla dewelopera.

Do ustawiania parametrów zasady dotyczącej limitu możesz używać dowolnej zmiennej. Te zmienne mogą pochodzić z:

  • Zmienne przepływu
  • Właściwości produktu API, aplikacji lub programisty
  • Mapa klucz-wartość (KVM)
  • nagłówek, parametr zapytania, parametr formularza itp.

Do każdego serwera proxy interfejsu API możesz dodać zasadę dotyczącą limitu, która odwołuje się do tej samej zmiennej co wszystkie inne zasady dotyczące limitu we wszystkich innych serwerach proxy. Może też odwoływać się do zmiennych unikalnych dla tej zasady i serwera proxy.

Czas rozpoczęcia

<Quota name="QuotaPolicy" type="calendar">
  <StartTime>2017-02-18 10:30:00</StartTime>
  <Interval>5</Interval>
  <TimeUnit>hour</TimeUnit>
  <Allow count="99"/>
</Quota>

W przypadku limitu z ustawioną wartością type na calendar musisz zdefiniować jawną wartość <StartTime>. Wartość czasu jest podana w czasie GMT, a nie w czasie lokalnym. Jeśli nie podasz wartości <StartTime> dla zasady typu calendar, Edge zgłosi błąd.

Licznik limitu dla każdej aplikacji jest odświeżany na podstawie wartości <StartTime>, <Interval><TimeUnit>. W tym przykładzie limit zaczyna się liczyć o 10:30 GMT 18 lutego 2017 r. i jest odświeżany co 5 godzin. Dlatego następne odświeżenie nastąpi 18 lutego 2017 r. o godzinie 15:30 czasu GMT.

Licznik dostępu

<Quota name="QuotaPolicy">
  <Interval>5</Interval>
  <TimeUnit>hour</TimeUnit>
  <Allow count="99"/>
</Quota>

Pełnomocnik interfejsu API ma dostęp do zmiennych przepływu ustawionych przez zasadę dotyczącą limitu. Do tych zmiennych przepływu możesz uzyskać dostęp w proxy interfejsu API, aby wykonywać przetwarzanie warunkowe, monitorować zasadę, gdy zbliża się do limitu, zwracać bieżący licznik limitu do aplikacji lub z innych powodów.

Dostęp do zmiennych przepływu w zasadach zależy od atrybutu name zasad. W przypadku powyższych zasad o nazwie QuotaPolicy dostęp do zmiennych przepływu uzyskuje się w formie:

  • ratelimit.QuotaPolicy.allowed.count: dozwolona liczba.
  • ratelimit.QuotaPolicy.used.count: bieżąca wartość licznika.
  • ratelimit.QuotaPolicy.expiry.time: czas UTC, w którym licznik się resetuje.

Dostępnych jest wiele innych zmiennych przepływu, które opisujemy poniżej.

Możesz na przykład użyć tej zasady AssignMessage, aby zwracać wartości zmiennych przepływu Quota jako nagłówki odpowiedzi:

<AssignMessage async="false" continueOnError="false" enabled="true" name="ReturnQuotaVars">
    <AssignTo createNew="false" type="response"/>
    <Set>
        <Headers>
            <Header name="QuotaLimit">{ratelimit.QuotaPolicy.allowed.count}</Header>
            <Header name="QuotaUsed">{ratelimit.QuotaPolicy.used.count}</Header>
            <Header name="QuotaResetUTC">{ratelimit.QuotaPolicy.expiry.time}</Header>
        </Headers>
    </Set>
    <IgnoreUnresolvedVariables>false</IgnoreUnresolvedVariables>
</AssignMessage>

Pierwsza prośba

<Quota name="MyQuota">
  <Interval>1</Interval>
  <TimeUnit>hour</TimeUnit>
  <Allow count="10000"/>
</Quota>

Użyj tego przykładowego kodu,aby wymusić limit 10 000 wywołań na godzinę. Zasada resetuje licznik limitu na początku każdej godziny. Jeśli licznik osiągnie limit 10 000 połączeń przed końcem godziny, połączenia powyżej tego limitu zostaną odrzucone.

Jeśli na przykład licznik zaczyna się od 2017-07-08 07:00:00, resetuje się do 0 o 2017-07-08 08:00:00 (godzinę od czasu rozpoczęcia). Jeśli pierwsza wiadomość zostanie odebrana o godzinie 2017-07-08 07:35:28,a liczba wiadomości osiągnie 10 000 przed godziną 2017-07-08 08:00:00, połączenia przekraczające tę liczbę będą odrzucane do momentu zresetowania licznika na początku kolejnej godziny.

Czas resetowania licznika zależy od kombinacji reguł <Interval> i <TimeUnit>. Jeśli na przykład ustawisz wartość <Interval> na 12 dla <TimeUnit> godziny, licznik będzie się resetować co 12 godzin. Możesz ustawić <TimeUnit> na minuty, godziny, dni, tygodnie lub miesiące.

Możesz odwoływać się do tych zasad w wielu miejscach w proxy interfejsu API. Możesz na przykład umieścić go w Proxy PreFlow, aby był wykonywany przy każdym żądaniu. Możesz też umieścić go w wielu ścieżkach w proxy interfejsu API. Jeśli używasz tej zasady w wielu miejscach w serwerze proxy, utrzymuje ona jeden licznik, który jest aktualizowany przez wszystkie jej instancje.

Możesz też zdefiniować w proxy interfejsu API kilka zasad dotyczących limitów. Każda zasada dotycząca limitu utrzymuje własny licznik na podstawie atrybutu name zasady.

Ustawianie identyfikatora

<Quota name="QuotaPolicy" type="calendar">
  <Identifier ref="request.header.clientId"/>
  <StartTime>2017-02-18 10:00:00</StartTime>
  <Interval>5</Interval>
  <TimeUnit>hour</TimeUnit>
  <Allow count="99"/>
</Quota>

Domyślnie zasada dotycząca limitu określa jeden licznik dla serwera proxy interfejsu API, niezależnie od źródła żądania. Możesz też użyć atrybutu <Identifier> z zasadami dotyczącymi limitów, aby prowadzić oddzielne liczniki na podstawie wartości atrybutu <Identifier>.

Użyj np. tagu <Identifier>, aby zdefiniować osobne liczniki dla każdego identyfikatora klienta. W żądaniu do serwera proxy aplikacja kliencka przekazuje nagłówek zawierający clientID, jak pokazano w przykładzie powyżej.

W atrybucie <Identifier> możesz określić dowolną zmienną przepływu. Możesz na przykład określić, że parametr zapytania o nazwie id zawiera unikalny identyfikator:

<Identifier ref="request.queryparam.id"/>

Jeśli do weryfikacji klucza interfejsu API używasz zasady VerifyAPIKey lub zasad OAuthV2 z tokenami OAuth, możesz użyć informacji z klucza interfejsu API lub tokena do zdefiniowania poszczególnych liczników dla tych samych zasad Quota. Na przykład ten tag <Identifier> używa zmiennej przepływu client_id zasady VerifyAPIKey o nazwie verify-api-key:

<Identifier ref="verifyapikey.verify-api-key.client_id"></Identifier>

Każda unikalna wartość client_id definiuje teraz własny licznik w zasadach dotyczących limitu.

Klasa

<Quota name="QuotaPolicy">
  <Interval>1</Interval>
  <TimeUnit>day</TimeUnit>
  <Allow>
    <Class ref="request.header.developer_segment">
      <Allow class="platinum" count="10000"/>
      <Allow class="silver" count="1000" />
    </Class>
  </Allow>
</Quota>

Limity miejsca możesz ustawiać dynamicznie, korzystając z liczby miejsca opartej na klasie. W tym przykładzie limit przydziału jest określany przez wartość nagłówka developer_segment przekazywanego z każdym żądaniem. Może ona mieć wartość platinum lub silver. Jeśli nagłówek ma nieprawidłową wartość, zasady zwracają błąd naruszenia limitu.


Informacje o zasadach dotyczących limitów

Limit to przydział wiadomości z żądaniami, które serwer proxy interfejsu API może obsłużyć w określonym czasie, np. w ciągu minuty, godziny, dnia, tygodnia lub miesiąca. Zasady utrzymują liczniki, które zliczają liczbę żądań otrzymanych przez serwer proxy interfejsu API. Ta funkcja umożliwia dostawcom interfejsów API egzekwowanie limitów liczby wywołań interfejsu API wykonywanych przez aplikacje w określonym przedziale czasu. Za pomocą zasad dotyczących limitów możesz na przykład ograniczyć liczbę żądań wysyłanych przez aplikacje do 1 na minutę lub 10 tys. na miesiąc.

Jeśli na przykład limit wynosi 10 tys. wiadomości miesięcznie, ograniczenie szybkości zaczyna się po wysłaniu 10-tysięcznej wiadomości. Nie ma znaczenia, czy 10 000 wiadomości zostało zliczonych pierwszego czy ostatniego dnia tego okresu. Do momentu automatycznego zresetowania licznika limitu na koniec określonego przedziału czasu lub do momentu wyraźnego zresetowania limitu za pomocą zasad resetowania limitu nie są dozwolone żadne dodatkowe żądania.

Odmiana limitu o nazwie SpikeArrest zapobiega nagłym wzrostom ruchu, które mogą być spowodowane nagłym wzrostem wykorzystania, błędami w klientach lub złośliwymi atakami. Więcej informacji o zasadach SpikeArrest znajdziesz w zasadach SpikeArrest.

Limity dotyczą poszczególnych serwerów proxy interfejsu API i nie są rozdzielane między serwery proxy interfejsu API. Jeśli na przykład produkt API zawiera 3 proxy interfejsu API, pojedynczy limit nie jest współdzielony przez wszystkie 3 proxy, nawet jeśli wszystkie 3 używają tej samej konfiguracji zasad limitu.

Typy zasad dotyczących limitów

Zasady dotyczące limitów obsługują kilka różnych typów zasad: domyślne, calendar, flexirollingwindow. Każdy typ określa, kiedy licznik limitu zaczyna działać i kiedy jest resetowany, co pokazano w tej tabeli:

Jednostka czasu Resetowanie do wartości domyślnej (lub null) resetowanie kalendarza, elastyczne resetowanie
minuta Początek następnej minuty 1 minutę po: <StartTime> Minutę po pierwszym żądaniu
godzina Początek następnej godziny Godzinę po: <StartTime> Godzinę po pierwszym żądaniu
dzień Północ czasu GMT bieżącego dnia 24 godziny po <StartTime> 24 godziny po pierwszym żądaniu
tydzień Północ GMT w niedzielę na koniec tygodnia Tydzień po: <StartTime> Tydzień po pierwszej prośbie
miesiąc O północy czasu GMT ostatniego dnia miesiąca Miesiąc (28 dni) po: <StartTime> Miesiąc (28 dni) po pierwszej prośbie
second

W przypadku elementu type="calendar" musisz podać wartość <StartTime>.

Tabela nie zawiera wartości typu rollingwindow. Limity w oknie ruchomym działają na zasadzie ustawienia rozmiaru „okna” limitu, np. okna godzinnego lub dziennego. Gdy nadejdzie nowe żądanie, zasady określą, czy w przeszłości w określonym „oknie” czasowym limit został przekroczony.

Możesz na przykład zdefiniować 2-godzinny okres, w którym można wysłać 1000 żądań. O godzinie 16:45 przychodzi nowe żądanie.Zasady obliczają limit na podstawie liczby żądań z ostatnich 2 godzin, czyli od 14:45. Jeśli w tym 2-godzinnym okresie limit przydziału nie został przekroczony, żądanie jest dozwolone.

Minutę później, o 16:46, pojawia się kolejna prośba. Teraz zasady obliczają liczbę limitów od godziny 14:46, aby sprawdzić, czy limit został przekroczony.

W przypadku typu rollingwindow licznik nigdy się nie resetuje, ale jest ponownie obliczany przy każdym żądaniu.

Informacje o licznikach limitów

Domyślnie zasada Quota utrzymuje jeden licznik, niezależnie od tego, ile razy odwołujesz się do niej w proxy interfejsu API. Nazwa licznika limitu zależy od atrybutu name zasad.

Załóżmy, że tworzysz zasadę dotyczącą limitu o nazwie MyQuotaPolicy z limitem 5 żądań i umieszczasz ją w kilku przepływach (A, B i C) w proxy interfejsu API. Mimo że jest używana w wielu procesach, ma jeden licznik, który jest aktualizowany przez wszystkie instancje zasady:

  • Wykonanie przepływu A -> Wykonanie zasady MyQuotaPolicy, a jej licznik = 1
  • Wykonanie przepływu B -> Wykonanie zasady MyQuotaPolicy, a jej licznik = 2
  • Wykonanie przepływu A -> wykonanie zasady MyQuotaPolicy, a jej licznik = 3
  • Wykonany zostaje przepływ C -> wykonana zostaje zasada MyQuotaPolicy, a jej licznik ma wartość 4.
  • Wykonanie przepływu A -> wykonanie zasady MyQuotaPolicy, a jej licznik = 5

Kolejne żądanie do dowolnego z tych 3 procesów zostanie odrzucone, ponieważ licznik limitu osiągnął swój limit.

Używanie tej samej zasady dotyczącej limitów w więcej niż 1 miejscu w przepływie serwera proxy interfejsu API może nieumyślnie spowodować szybsze wyczerpanie limitu niż oczekiwano. Jest to anty-wzorzec opisany w książce „The Book of Apigee Edge Antipatterns”.

Możesz też zdefiniować w proxy interfejsu API kilka zasad dotyczących limitów i używać różnych zasad w każdym przepływie. Każda zasada dotycząca limitu ma własny licznik oparty na atrybucie name zasady.

Możesz też użyć elementów <Class> lub <Identifier> w zasadach dotyczących limitów, aby zdefiniować w jednych zasadach wiele unikalnych liczników. Dzięki tym elementom pojedyncze zasady mogą utrzymywać różne liczniki na podstawie aplikacji wysyłającej żądanie, dewelopera aplikacji wysyłającego żądanie, identyfikatora klienta lub innego identyfikatora klienta itp. Więcej informacji o używaniu elementów <Class><Identifier> znajdziesz w przykładach powyżej.

Notacja czasu

Wszystkie godziny limitu są ustawione w strefie czasowej uniwersalnego czasu koordynowanego (UTC).

Notacja czasu przydziału jest zgodna z międzynarodowym standardem notacji daty określonym w normie ISO 8601.

Daty są definiowane jako rok, miesiąc i dzień w tym formacie: YYYY-MM-DD. Na przykład 2015-02-04 oznacza 4 lutego 2015 r.

Godzina jest określana w formacie hours:minutes:seconds. Na przykład 23:59:59 oznacza godzinę o sekundę przed północą.

Pamiętaj, że dostępne są 2 notacje: 00:00:0024:00:00, które pozwalają odróżnić 2 północe, które mogą być powiązane z jedną datą. Dlatego 2015-02-04 24:00:00 to ta sama data i godzina co 2015-02-05 00:00:00. Zwykle preferowany jest ten drugi zapis.

Pobieranie ustawień limitu z konfiguracji produktu API

Limity możesz ustawić w konfiguracjach produktów interfejsu API. Limity te nie wymuszają automatycznie limitu. Zamiast tego możesz odwołać się do ustawień limitu produktu w zasadach dotyczących limitów. Oto niektóre zalety ustawienia limitu produktu, do którego będą się odwoływać zasady dotyczące limitów:

  • Zasady dotyczące limitów mogą używać jednolitego ustawienia we wszystkich serwerach proxy interfejsu API w produkcie API.
  • Możesz wprowadzać zmiany w ustawieniu limitu w produkcie interfejsu API w czasie działania, a zasady limitów, które odwołują się do tej wartości, będą automatycznie aktualizować wartości limitów.

Więcej informacji o korzystaniu z ustawień limitów w produkcie interfejsu API znajdziesz w przykładzie „Dynamiczne limity” powyżej..

Informacje o konfigurowaniu produktów interfejsu API z limitami wykorzystania znajdziesz w artykule Tworzenie produktów interfejsu API.

Odwołanie do elementu

Poniżej znajdziesz elementy i atrybuty, które możesz skonfigurować w tych zasadach. Pamiętaj, że niektóre kombinacje elementów wykluczają się wzajemnie lub nie są wymagane. Przykłady konkretnych zastosowań znajdziesz w próbkach. Poniższe zmienne verifyapikey.VerifyAPIKey.apiproduct.* są dostępne domyślnie, gdy do sprawdzenia klucza interfejsu API aplikacji w żądaniu używana jest zasada weryfikacji klucza interfejsu API o nazwie „VerifyAPIKey”. Wartości zmiennych pochodzą z ustawień limitu w usłudze API, z którą jest powiązany klucz, zgodnie z opisem w sekcji Pobieranie ustawień limitu z konfiguracji usługi API.

<Quota async="false" continueOnError="false" enabled="true" name="Quota-3" type="calendar">
   <DisplayName>Quota 3</DisplayName>
   <Allow count="2000" countRef="verifyapikey.VerifyAPIKey.apiproduct.developer.quota.limit"/>
   <Allow>
      <Class ref="request.queryparam.time_variable">
        <Allow class="peak_time" count="5000"/>
        <Allow class="off_peak_time" count="1000"/>
      </Class>
   </Allow>
   <Interval ref="verifyapikey.VerifyAPIKey.apiproduct.developer.quota.interval">1</Interval>
   <TimeUnit ref="verifyapikey.VerifyAPIKey.apiproduct.developer.quota.timeunit">month</TimeUnit>
   <StartTime>2017-7-16 12:00:00</StartTime>
   <Distributed>false</Distributed>
   <Synchronous>false</Synchronous>
   <AsynchronousConfiguration>
      <SyncIntervalInSeconds>20</SyncIntervalInSeconds>
      <SyncMessageCount>5</SyncMessageCount>
   </AsynchronousConfiguration>
   <Identifier/>
   <MessageWeight/>
</Quota>

Atrybuty <Quota>

<Quota async="false" continueOnError="false" enabled="true" name="Quota-3" type="calendar">

Poniższe atrybuty są specyficzne dla tych zasad.

Atrybut Opis Domyślny Obecność
typ

Użyj tej opcji, aby określić, kiedy i w jaki sposób licznik limitu sprawdza wykorzystanie limitu. Więcej informacji znajdziesz w artykule Rodzaje zasad dotyczących limitów.

Jeśli pominiesz wartość type, licznik zacznie się od początku minuty/godziny/dnia/tygodnia/miesiąca.

Prawidłowe wartości:

  • calendar: skonfigurować limit na podstawie określonej godziny rozpoczęcia. Licznik Quota dla każdej aplikacji jest odświeżany na podstawie ustawionych przez Ciebie wartości <StartTime>, <Interval> i <TimeUnit>.
  • rollingwindow: skonfigurować limit, który do określania wykorzystania limitu używa „okna ruchomego”. Za pomocą elementu rollingwindow określasz rozmiar okna za pomocą elementów <Interval><TimeUnit>, np. 1 dzień. Gdy nadejdzie żądanie, Edge sprawdza dokładny czas jego otrzymania (np. 17:01), zlicza liczbę żądań, które nadeszły od tego czasu do 17:01 poprzedniego dnia (1 dzień), i określa, czy w tym przedziale czasu limit został przekroczony.
  • flexi: skonfiguruj limit, który spowoduje rozpoczęcie odliczania, gdy z aplikacji zostanie odebrana pierwsza wiadomość z prośbą, i zresetuje się na podstawie wartości <Interval>, <TimeUnit>.
kalendarz Opcjonalny

W tej tabeli opisano atrybuty wspólne dla wszystkich elementów nadrzędnych zasad:

Atrybut Opis Domyślny Obecność
name

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 możesz użyć elementu <DisplayName> do oznaczenia zasady jako edytor proxy interfejsu zarządzania z inną nazwą w języku naturalnym.

Nie dotyczy Wymagane
continueOnError

Ustaw jako false, aby w przypadku niepowodzenia zasady zwracany był błąd. To normalne w przypadku większości zasad.

Ustaw jako true, aby wykonywanie przepływu było kontynuowane nawet po zastosowaniu zasady niepowodzenie.

fałsz Opcjonalnie
enabled

Aby egzekwować zasadę, ustaw wartość true.

Aby wyłączyć zasadę, ustaw wartość false. Te zasady nie będą jest wymuszane nawet wtedy, gdy jest ono połączone z przepływem.

prawda Opcjonalnie
async

Ten atrybut został wycofany.

fałsz Wycofano

&lt;DisplayName&gt; element

Używaj oprócz atrybutu name do oznaczania zasady w edytor proxy interfejsu zarządzania z inną nazwą w języku naturalnym.

<DisplayName>Policy Display Name</DisplayName>
Domyślny

Nie dotyczy

Jeśli pominiesz ten element, atrybut name zasady otrzyma wartość .

Obecność Opcjonalnie
Typ Ciąg znaków

Element <Allow>

Określa limit liczby dla limitu. Jeśli licznik zasady osiągnie tę wartość, kolejne wywołania są odrzucane do momentu zresetowania licznika.

Poniżej przedstawiamy 3 sposoby ustawiania elementu <Allow>:

<Allow count="2000"/>
<Allow countRef="verifyapikey.VerifyAPIKey.apiproduct.developer.quota.limit"/>
<Allow count="2000" countRef="verifyapikey.VerifyAPIKey.apiproduct.developer.quota.limit"/>

Jeśli określisz zarówno parametr count, jak i countRef, pierwszeństwo będzie miał parametr countRef. Jeśli countRef nie zostanie rozpoznane w czasie działania, użyta zostanie wartość count.

Domyślnie: Nie dotyczy
Obecność: Opcjonalny
Typ: Liczba całkowita

Atrybuty

Atrybut Opis Domyślny Obecność
liczba

Użyj tego parametru, aby określić liczbę wiadomości w limicie.

Na przykład wartość atrybutu count wynosząca 100, Interval – 1 i TimeUnit – miesiąc określa limit 100 wiadomości miesięcznie.

2000 Opcjonalny
countRef

Użyj tej opcji, aby określić zmienną przepływu zawierającą liczbę wiadomości dla limitu. countRef ma pierwszeństwo przed atrybutem count.

brak Opcjonalny

Element <Allow>/<Class>

Element <Class> umożliwia warunkowe określanie wartości elementu <Allow> na podstawie wartości zmiennej przepływu. W przypadku każdego innego tagu podrzędnego <Allow> tagu <Class> zasady utrzymują inny licznik.

Aby użyć elementu <Class>, określ zmienną przepływu za pomocą atrybutu ref w tagu <Class>. Edge używa wartości zmiennej przepływu, aby wybrać jeden z <Allow>tagów podrzędnych i określić dozwoloną liczbę zasad. Edge dopasowuje wartość zmiennej przepływu do atrybutu class tagu <Allow>, jak pokazano poniżej:

<Allow>
  <Class ref="request.queryparam.time_variable">
    <Allow class="peak_time" count="5000"/>
    <Allow class="off_peak_time" count="1000"/>
  </Class>
</Allow>

W tym przykładzie bieżący licznik limitu jest określany przez wartość parametru zapytania time_variable przekazywanego z każdym żądaniem. Zmienna może mieć wartość peak_time lub off_peak_time. Jeśli parametr zapytania zawiera nieprawidłową wartość, zasady zwracają błąd przekroczenia limitu.

Domyślnie: Nie dotyczy
Obecność: Opcjonalny
Typ: Nie dotyczy

Atrybuty

Atrybut Opis Domyślny Obecność
ref

Służy do określania zmiennej przepływu zawierającej klasę limitu dla limitu.

brak Wymagane

Element <Allow>/<Class>/<Allow>

Element <Allow> określa limit licznika limitu zdefiniowanego przez element <Class>. W przypadku każdego innego tagu podrzędnego <Allow> tagu <Class> zasady utrzymują inny licznik.

Na przykład:

<Allow>
  <Class ref="request.queryparam.time_variable">
    <Allow class="peak_time" count="5000"/>
    <Allow class="off_peak_time" count="1000"/>
  </Class>
</Allow>

W tym przykładzie zasada dotycząca limitu utrzymuje 2 liczniki limitów o nazwach peak_timeoff_peak_time.

Domyślnie: Nie dotyczy
Obecność: Opcjonalny
Typ: Nie dotyczy

Atrybuty

Atrybut Opis Domyślny Obecność
klasa

Określa nazwę licznika limitu.

brak Wymagane
liczba Określa limit liczby. brak Wymagane

Element <Interval>

Użyj, aby określić liczbę całkowitą (np. 1, 2, 5, 60 itd.), która będzie powiązana z określonym przez Ciebie TimeUnit (minuta, godzina, dzień, tydzień lub miesiąc) w celu określenia przedziału czasu, w którym Edge oblicza wykorzystanie limitu.

Na przykład Interval wynoszący 24 z TimeUnit wynoszącym hour oznacza, że limit zostanie obliczony w ciągu 24 godzin.

<Interval ref="verifyapikey.VerifyAPIKey.apiproduct.developer.quota.interval">1</Interval>
Domyślnie: brak
Obecność: Wymagane
Typ: Liczba całkowita

Atrybuty

Atrybut Opis Domyślny Obecność
ref

Użyj, aby określić zmienną przepływu zawierającą przedział czasu dla limitu. ref ma pierwszeństwo przed wartością interwału określoną wprost. Jeśli podasz zarówno odwołanie, jak i wartość, pierwszeństwo ma odwołanie. Jeśli ref nie zostanie rozpoznany w czasie działania, użyta zostanie wartość.

brak Opcjonalny

Element <TimeUnit>

Użyj tej opcji, aby określić jednostkę czasu, do której odnosi się limit.

Na przykład Interval wynoszący 24 z TimeUnit wynoszącym hour oznacza, że limit zostanie obliczony w ciągu 24 godzin.

<TimeUnit ref="verifyapikey.VerifyAPIKey.apiproduct.developer.quota.timeunit">month</TimeUnit>
Domyślnie: brak
Obecność: Wymagane
Typ:

Ciąg tekstowy. Wybierz jedną z tych opcji: minute, hour, day, week lub month.

second

Atrybuty

Atrybut Opis Domyślny Obecność
ref Użyj, aby określić zmienną przepływu zawierającą jednostkę czasu dla limitu. ref ma pierwszeństwo przed wartością odstępu czasu określoną wprost. Jeśli ref nie zostanie rozpoznany w czasie działania, używana jest wartość. brak Opcjonalny

Element <StartTime>

Gdy parametr type ma wartość calendar,, określa datę i godzinę, od których licznik limitu zacznie zliczać żądania, niezależnie od tego, czy z jakichkolwiek aplikacji wpłynęły jakieś żądania.

Na przykład:

<StartTime>2017-7-16 12:00:00</StartTime>
Domyślnie: brak
Obecność: Wymagany, gdy wartość type to calendar.
Typ:

Ciąg znaków w formacie daty i godziny ISO 8601.

Element <Distributed>

Instalacja Edge może używać co najmniej 1 procesora wiadomości do przetwarzania żądań. Ustaw ten element na true, aby określić, że zasady mają utrzymywać centralny licznik i stale synchronizować go na wszystkich procesorach wiadomości. Procesory wiadomości mogą znajdować się w różnych strefach dostępności lub regionach.

Jeśli użyjesz wartości domyślnej false, możesz przekroczyć limit, ponieważ liczba każdego procesora wiadomości nie jest udostępniana:

<Distributed>true</Distributed>

Aby zagwarantować, że liczniki są zsynchronizowane i aktualizowane przy każdym żądaniu, ustaw wartości <Distributed><Synchronous> na „true”:

<Distributed>true</Distributed>
<Synchronous>true</Synchronous>
Domyślnie: fałsz
Obecność: Opcjonalny
Typ: Wartość logiczna

Element <Synchronous>

Ustaw wartość true, aby synchronicznie zaktualizować licznik limitu rozproszonego. Oznacza to, że aktualizacja licznika następuje w tym samym czasie, w którym sprawdzany jest limit w żądaniu wysyłanym do interfejsu API. Ustaw wartość true, jeśli nie chcesz zezwalać na żadne wywołania interfejsu API przekraczające limit.

Ustaw wartość false, aby zaktualizować licznik limitu asynchronicznie. Oznacza to, że niektóre wywołania interfejsu API przekraczające limit mogą zostać zrealizowane w zależności od tego, kiedy licznik limitu w centralnym repozytorium zostanie zaktualizowany asynchronicznie. Nie będziesz jednak odczuwać potencjalnego wpływu na wydajność związanego z aktualizacjami synchronicznymi.

Domyślny interwał aktualizacji asynchronicznej to 10 sekund. Aby skonfigurować to zachowanie asynchroniczne, użyj elementu AsynchronousConfiguration.

<Synchronous>false</Synchronous>
Domyślnie: fałsz
Obecność: Opcjonalny
Typ: Wartość logiczna

Element <AsynchronousConfiguration>

Konfiguruje interwał synchronizacji między rozproszonymi licznikami limitów, gdy element konfiguracji zasady <Synchronous> nie występuje lub występuje i ma wartość false.

Synchronizację możesz przeprowadzić po upływie określonego czasu lub po osiągnięciu określonej liczby wiadomości, używając elementów podrzędnych SyncIntervalInSeconds lub SyncMessageCount. Wykluczają się one wzajemnie. Na przykład

<AsynchronousConfiguration>
   <SyncIntervalInSeconds>20</SyncIntervalInSeconds>
</AsynchronousConfiguration>

lub

<AsynchronousConfiguration>
   <SyncMessageCount>5</SyncMessageCount>
</AsynchronousConfiguration>
Domyślnie: SyncIntervalInSeconds = 10 sekund
Obecność: Opcjonalny; ignorowany, gdy parametr <Synchronous> ma wartość true.
Typ:

Kompleks budowlany

Element <AsynchronousConfiguration>/<SyncIntervalInSeconds>

Użyj tej opcji, aby zastąpić domyślne zachowanie, w którym aktualizacje asynchroniczne są wykonywane po upływie 10 sekund.

<AsynchronousConfiguration>
   <SyncIntervalInSeconds>20</SyncIntervalInSeconds>
</AsynchronousConfiguration>

Odstęp czasu synchronizacji musi wynosić co najmniej 10 sekund, zgodnie z opisem w temacie Limity.

Domyślnie: 10
Obecność: Opcjonalny
Typ:

Liczba całkowita

Element <AsynchronousConfiguration>/<SyncMessageCount>

Określa liczbę żądań we wszystkich procesorach wiadomości Apigee między aktualizacjami limitu.

<AsynchronousConfiguration>
   <SyncMessageCount>5</SyncMessageCount>
</AsynchronousConfiguration>

Ten przykład określa, że liczba limitów jest aktualizowana co 5 żądań w każdym procesorze wiadomości Apigee Edge.

Domyślnie: nie dotyczy
Obecność: Opcjonalny
Typ:

Liczba całkowita

Element <Identifier>

Użyj elementu <Identifier>, aby skonfigurować zasadę tworzenia unikalnych liczników na podstawie zmiennej przepływu.

Możesz tworzyć unikalne liczniki dla cech zdefiniowanych przez zmienną przepływu. Możesz na przykład użyć adresu e-mail dewelopera, aby powiązać limit z określonym deweloperem. Do identyfikowania limitu możesz używać różnych zmiennych, zarówno niestandardowych, jak i zdefiniowanych wstępnie, np. tych dostępnych w ramach zasady weryfikacji klucza interfejsu API. Zobacz też dokumentację zmiennych.

Jeśli nie użyjesz tego elementu, zasady będą korzystać z jednego licznika, który będzie stosowany do limitu.

Ten element jest też omówiony w tym poście na forum społeczności Apigee: Identyfikator limitu w różnych zasadach.

<Identifier ref="verifyapikey.verify-api-key.client_id"/>
Domyślnie: Nie dotyczy
Obecność: Opcjonalny
Typ:

Ciąg znaków

Atrybuty

Atrybut Opis Domyślny Obecność
ref

Określa zmienną przepływu, która identyfikuje licznik do użycia w przypadku żądania. Identyfikator może być nagłówkiem HTTP, parametrem zapytania, parametrem formularza lub treścią wiadomości, która jest unikalna dla każdej aplikacji, użytkownika aplikacji, dewelopera aplikacji, produktu API lub innej cechy.

Najczęściej używanym identyfikatorem aplikacji jest <Identifier>.client_id client_id to inna nazwa klucza interfejsu API lub klucza klienta, który jest generowany dla aplikacji podczas rejestracji w organizacji w Apigee Edge. Możesz użyć tego identyfikatora, jeśli masz włączone zasady autoryzacji klucza interfejsu API lub OAuth dla interfejsu API.

W niektórych przypadkach ustawienia limitu muszą być pobierane, gdy nie jest dostępny żaden client_id, np. gdy nie ma zasad bezpieczeństwa. W takich sytuacjach możesz użyć zasady Access Entity, aby pobrać odpowiednie ustawienia produktu API, a następnie wyodrębnić wartości za pomocą zasady ExtractVariables i użyć wyodrębnionej zmiennej kontekstowej w zasadzie Quota. Więcej informacji znajdziesz w zasadach dotyczących dostępu do podmiotu.

Nie dotyczy Opcjonalny

Element <MessageWeight>

Użyj, aby określić wagę przypisaną do każdej wiadomości. Używaj wagi wiadomości, aby zwiększyć wpływ wiadomości z prośbami, które np. zużywają więcej zasobów obliczeniowych niż inne.

Na przykład chcesz, aby wiadomości POST były 2 razy bardziej „obciążające” lub droższe niż wiadomości GET. Dlatego w przypadku metody POST ustawiasz wartość MessageWeight na 2, a w przypadku metody GET – na 1. Możesz nawet ustawić wartość MessageWeight na 0, aby żądanie nie miało wpływu na licznik. W tym przykładzie, jeśli limit wynosi 10 wiadomości na minutę, a MessageWeight dla żądań POST to 2, limit zezwala na 5 żądań POST w dowolnym 10-minutowym przedziale czasu. Wszelkie dodatkowe żądania POST lub GET przed zresetowaniem licznika zostaną odrzucone.

Wartość reprezentującą MessageWeight musi być określona przez zmienną przepływu i może być wyodrębniona z nagłówków HTTP, parametrów zapytania, ładunku żądania XML lub JSON albo dowolnej innej zmiennej przepływu. Możesz na przykład ustawić go w nagłówku o nazwie weight:

<MessageWeight ref="message_weight"/>
Domyślnie: Nie dotyczy
Obecność: Opcjonalny
Typ:

Liczba całkowita

Zmienne przepływu

Gdy zasada dotycząca limitu zostanie wykonana, automatycznie wypełnią się te wstępnie zdefiniowane zmienne Flow: Więcej informacji o zmiennych przepływu znajdziesz w dokumentacji zmiennych.

Zmienne Typ Uprawnienia Opis
ratelimit.{policy_name}.allowed.count Długie Tylko do odczytu Zwraca dozwoloną liczbę limitów.
ratelimit.{policy_name}.used.count Długie Tylko do odczytu Zwraca bieżący limit wykorzystania w przedziale limitu.
ratelimit.{policy_name}.available.count Długie Tylko do odczytu Zwraca liczbę dostępnych limitów w przedziale limitu.
ratelimit.{policy_name}.exceed.count Długie Tylko do odczytu Zwraca wartość 1 po przekroczeniu limitu.
ratelimit.{policy_name}.total.exceed.count Długie Tylko do odczytu Zwraca wartość 1 po przekroczeniu limitu.
ratelimit.{policy_name}.expiry.time Długie Tylko do odczytu

Zwraca czas UTC w milisekundach, który określa, kiedy limit wygasa i rozpoczyna się nowy przedział limitu.

Gdy typ zasady dotyczącej limitu to rollingwindow, ta wartość jest nieprawidłowa, ponieważ interwał limitu nigdy nie wygasa.

ratelimit.{policy_name}.identifier Ciąg znaków Tylko do odczytu Zwraca odniesienie do identyfikatora (klienta) dołączone do zasad.
ratelimit.{policy_name}.class Ciąg znaków Tylko do odczytu Zwraca klasę powiązaną z identyfikatorem klienta.
ratelimit.{policy_name}.class.allowed.count Długie Tylko do odczytu Zwraca liczbę dozwolonych limitów zdefiniowaną w klasie.
ratelimit.{policy_name}.class.used.count Długie Tylko do odczytu Zwraca wykorzystany limit w ramach zajęć.
ratelimit.{policy_name}.class.available.count Długie Tylko do odczytu Zwraca liczbę dostępnych limitów w klasie.
ratelimit.{policy_name}.class.exceed.count Długie Tylko do odczytu Zwraca liczbę żądań, które przekraczają limit w klasie w bieżącym przedziale limitu.
ratelimit.{policy_name}.class.total.exceed.count Długie Tylko do odczytu Zwraca łączną liczbę żądań, które przekraczają limit w klasie we wszystkich przedziałach limitu, więc jest to suma wartości class.exceed.count we wszystkich przedziałach limitu.
ratelimit.{policy_name}.failed Wartość logiczna Tylko do odczytu

Określa, czy zasada nie została zastosowana (prawda lub fałsz).

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.FailedToResolveQuotaIntervalReference 500 Occurs if the <Interval> element is not defined within the Quota policy. This element is mandatory and used to specify the interval of time applicable to the quota. The time interval can be minutes, hours, days, weeks, or months as defined with the <TimeUnit> element.
policies.ratelimit.FailedToResolveQuotaIntervalTimeUnitReference 500 Occurs if the <TimeUnit> element is not defined within the Quota policy. This element is mandatory and used to specify the unit of time applicable to the quota. The time interval can be in minutes, hours, days, weeks, or months.
policies.ratelimit.InvalidMessageWeight 500 Occurs if the value of the <MessageWeight> element specified through a flow variable is invalid (a non-integer value).
policies.ratelimit.QuotaViolation 500 The quota limit was exceeded. N/A

Deployment errors

Error name Cause Fix
InvalidQuotaInterval If the quota interval specified in the <Interval> element is not an integer, then the deployment of the API proxy fails. For example, if the quota interval specified is 0.1 in the <Interval> element, then the deployment of the API proxy fails.
InvalidQuotaTimeUnit If the time unit specified in the <TimeUnit> element is unsupported, then the deployment of the API proxy fails. The supported time units are minute, hour, day, week, and month.
InvalidQuotaType If the type of the quota specified by the type attribute in the <Quota> element is invalid, then the deployment of the API proxy fails. The supported quota types are default, calendar, flexi, and rollingwindow.
InvalidStartTime If the format of the time specified in the <StartTime> element is invalid, then the deployment of the API proxy fails. The valid format is yyyy-MM-dd HH:mm:ss, which is the ISO 8601 date and time format. For example, if the time specified in the <StartTime> element is 7-16-2017 12:00:00 then the deployment of the API proxy fails.
StartTimeNotSupported If the <StartTime> element is specified whose quota type is not calendar type, then the deployment of the API proxy fails. The <StartTime> element is supported only for the calendar quota type. For example, if the type attribute is set to flexi or rolling window in the <Quota> element, then the deployment of the API proxy fails.
InvalidTimeUnitForDistributedQuota If the <Distributed> element is set to true and the <TimeUnit> element is set to second then the deployment of the API proxy fails. The timeunit second is invalid for a distributed quota.
InvalidSynchronizeIntervalForAsyncConfiguration If the value specified for the <SyncIntervalInSeconds> element within the <AsynchronousConfiguration> element in a Quota policy is less than zero, then the deployment of the API proxy fails.
InvalidAsynchronizeConfigurationForSynchronousQuota If the value of the <AsynchronousConfiguration> element is set to true in a Quota policy, which also has asynchronous configuration defined using the <AsynchronousConfiguration> element, then the deployment of the API proxy fails.

Fault variables

These variables are set when this policy triggers an error. 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 "QuotaViolation"
ratelimit.policy_name.failed policy_name is the user-specified name of the policy that threw the fault. ratelimit.QT-QuotaPolicy.failed = true

Example error response

{  
   "fault":{  
      "detail":{  
         "errorcode":"policies.ratelimit.QuotaViolation"
      },
      "faultstring":"Rate limit quota violation. Quota limit  exceeded. Identifier : _default"
   }
}

Example fault rule

<FaultRules>
    <FaultRule name="Quota Errors">
        <Step>
            <Name>JavaScript-1</Name>
            <Condition>(fault.name Matches "QuotaViolation") </Condition>
        </Step>
        <Condition>ratelimit.Quota-1.failed=true</Condition>
    </FaultRule>
</FaultRules>

Schematy

Powiązane artykuły

Zasady ResetQuota

Zasady SpikeArrest

Porównanie zasad dotyczących limitów, ochrony przed nagłymi wzrostami i jednoczesnych limitów szybkości