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> i <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, flexi i rollingwindow. 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> i <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:00 i 24: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ść Prawidłowe wartości:
|
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 Opcjonalnie możesz użyć elementu |
Nie dotyczy | Wymagane |
continueOnError |
Ustaw jako Ustaw jako |
fałsz | Opcjonalnie |
enabled |
Aby egzekwować zasadę, ustaw wartość Aby wyłączyć zasadę, ustaw wartość |
prawda | Opcjonalnie |
async |
Ten atrybut został wycofany. |
fałsz | Wycofano |
<DisplayName> 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 |
|---|---|
| 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 |
2000 | Opcjonalny |
| countRef |
Użyj tej opcji, aby określić zmienną przepływu zawierającą liczbę wiadomości dla limitu.
|
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_time i off_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. |
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: 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> i <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.
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 W niektórych przypadkach ustawienia limitu muszą być pobierane, gdy nie jest dostępny żaden |
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 |
| 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
W tej sekcji opisano kody błędów i komunikaty o błędach, które są zwracane, oraz zmienne błędów ustawiane przez Edge, gdy ta zasada wyzwala błąd. Warto o tym wiedzieć, jeśli rozwijasz reguły błędów, aby obsługi błędów. Więcej informacji znajdziesz w artykule Co musisz wiedzieć 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.FailedToResolveQuotaIntervalReference |
500 | Występuje, jeśli element <Interval> nie jest zdefiniowany w zasadzie dotyczącej limitów. Ten element
jest wymagany i służy do określania przedziału czasu obowiązującego w odniesieniu do limitu. Przedział czasu
mogą być minutami, godzinami, dniami, tygodniami lub miesiącami, zgodnie z definicją za pomocą elementu <TimeUnit>. |
build |
policies.ratelimit.FailedToResolveQuotaIntervalTimeUnitReference |
500 | Występuje, jeśli element <TimeUnit> nie jest zdefiniowany w zasadzie dotyczącej limitów. Ten element
jest obowiązkowy i służy do określania jednostki czasu mającej zastosowanie do limitu. Przedział czasu
mogą być wyrażone w minutach, godzinach, dniach, tygodniach lub miesiącach. |
build |
policies.ratelimit.InvalidMessageWeight |
500 | Występuje, jeśli wartość elementu <MessageWeight> określona za pomocą zmiennej przepływu
jest nieprawidłowa (nie jest liczbą całkowitą). |
build |
policies.ratelimit.QuotaViolation |
500 | Przekroczono limit. | Nie dotyczy |
Błędy wdrażania
| Nazwa błędu | Przyczyna | Napraw |
|---|---|---|
InvalidQuotaInterval |
Jeśli interwał limitu określony w elemencie <Interval> nie jest
liczba całkowita, wdrożenie serwera proxy interfejsu API się nie uda. Jeśli na przykład interwał limitu
określony to 0.1 w elemencie <Interval>, wdrożenie
Błąd serwera proxy interfejsu API.
|
build |
InvalidQuotaTimeUnit |
Jeśli jednostka czasu określona w elemencie <TimeUnit> nie jest obsługiwana,
wdrożenie serwera proxy interfejsu API się nie uda. Obsługiwane jednostki czasu to minute,
hour, day, week i month.
|
build |
InvalidQuotaType |
Jeśli typ limitu określony przez atrybut type w <Quota>
element jest nieprawidłowy, wdrożenie serwera proxy interfejsu API się nie uda.
obsługiwane typy limitów to default, calendar, flexi i rollingwindow.
|
build |
InvalidStartTime |
Jeśli format godziny określony w elemencie <StartTime> to
jest nieprawidłowy, wdrożenie serwera proxy interfejsu API się nie uda. Prawidłowy format to yyyy-MM-dd HH:mm:ss,
w formacie ISO 8601. Dla:
Jeśli na przykład czas określony w elemencie <StartTime> to
7-16-2017 12:00:00, wdrożenie serwera proxy interfejsu API się nie uda.
|
build |
StartTimeNotSupported |
Jeśli określono element <StartTime>, którego typ limitu jest inny niż
calendar, wdrożenie serwera proxy interfejsu API się nie uda. Element <StartTime> to
obsługiwane tylko w przypadku typu limitu calendar. Jeśli na przykład ustawiony jest atrybut type
do flexi lub rolling window w elemencie <Quota>, a następnie
nie uda się wdrożyć serwera proxy interfejsu API.
|
build |
InvalidTimeUnitForDistributedQuota |
Jeśli element <Distributed> ma wartość true, a element <TimeUnit> ma wartość
second, wdrożenie serwera proxy interfejsu API się nie uda. Jednostka czasu second jest nieprawidłowa dla pola
w przypadku rozproszonego limitu. |
build |
InvalidSynchronizeIntervalForAsyncConfiguration |
Jeśli wartość określona dla elementu <SyncIntervalInSeconds> w parametrze
<AsynchronousConfiguration> w zasadzie dotyczącej limitów ma wartość mniejszą niż 0, wartość
nie uda się wdrożyć serwera proxy interfejsu API. |
build |
InvalidAsynchronizeConfigurationForSynchronousQuota |
Jeśli wartość elementu <AsynchronousConfiguration> w zasadzie limitów jest ustawiona na true, która również
ma konfigurację asynchroniczną zdefiniowaną za pomocą elementu <AsynchronousConfiguration>, a następnie
nie uda się wdrożyć serwera proxy interfejsu API. |
build |
Zmienne błędów
Te zmienne są ustawiane, gdy ta zasada wywołuje błąd. 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 Błędy czasu działania powyżej. Nazwa błędu to ostatnia część kodu błędu. | fault.name Matches "QuotaViolation" |
ratelimit.policy_name.failed |
policy_name to określona przez użytkownika nazwa zasady, która spowodowała błąd. | ratelimit.QT-QuotaPolicy.failed = true |
Przykładowa odpowiedź na błąd
{ "fault":{ "detail":{ "errorcode":"policies.ratelimit.QuotaViolation" }, "faultstring":"Rate limit quota violation. Quota limit exceeded. Identifier : _default" } }
Przykładowa reguła błędu
<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>