Zasady dotyczące limitów

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

Co

Za pomocą zasady dotyczącej limitu ustalisz liczbę wiadomości z żądaniem, które serwer proxy interfejsu API zezwala wysyłać w określonym przedziale czasu, np. w ciągu minuty, godziny, dnia, tygodnia lub miesiąca. Możesz ustawić ten limit na taki sam dla wszystkich aplikacji uzyskujących dostęp do proxy interfejsu API, albo możesz ustawić go na podstawie:

  • Produkt, który zawiera serwer proxy interfejsu API
  • Aplikacja wysyłająca żądanie do interfejsu API
  • Deweloper aplikacji
  • wiele innych kryteriów.

Nie używaj limitu do ochrony przed ogólnymi wzrostami ruchu. W tym celu użyj zasady Spike Arrest. Zapoznaj się z zasadami dotyczącymi zatrzymywania treści.

Filmy

Te filmy wprowadzają zarządzanie limitem na podstawie zasad dotyczących limitu:

Wprowadzenie (Nowy Edge)

Wprowadzenie (Edge klasyczny)

Limit dynamiczny

Rozproszone i synchroniczne

Waga wiadomości

Kalendarz

Okno ruchome

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ęcej informacji o limitach dynamicznych

<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 jednej zasady dotyczącej limitu, która narzuca różne ustawienia limitu na podstawie informacji przekazywanych do tej zasady. Innym terminem na określenie ustawień limitu w tym kontekście jest „Plan usług”. Dynamiczna kwota sprawdza „Plan usługi” aplikacji, a następnie stosuje te ustawienia.

Uwaga: jeśli określisz zarówno wartość, jak i odniesienie elementu, pierwszeństwo ma odniesienie. Jeśli odwołanie nie zostanie rozwiązane w czasie wykonywania kodu, zostanie użyta wartość.

Podczas tworzenia produktu interfejsu API możesz opcjonalnie ustawić dozwoloną ilość limitu, jednostkę czasu i interwał. Ustawienie tych wartości w usłudze interfejsu API nie wymusza ich używania w interfejsie API proxy. Musisz też dodać do serwera proxy interfejsu API politykę 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 korzysta z zasady o nazwie verify-api-key, która weryfikuje klucz interfejsu API przekazany w żądaniu. Następnie zasada dotycząca limitu dostępności uzyskuje dostęp do zmiennych przepływu z zasady VerifyAPIKey, aby odczytać wartości limitu dostępności ustawione w usłudze interfejsu API. Więcej informacji o przepływie danych w procesie weryfikacji klucza interfejsu API znajdziesz w zasadach dotyczących weryfikacji klucza interfejsu API.

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

<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żywamy też zmiennych procesu VerifyAPIKey, aby odwoływać się do atrybutów niestandardowych określonych dla dewelopera.

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

  • Zmienne przepływu
  • Właściwości usługi API, aplikacji lub dewelopera
  • mapa klucz-wartość (KVM);
  • nagłówek, parametr zapytania, parametr formularza itp.

Do każdego serwera proxy interfejsu API możesz dodać zasady dotyczące limitu, które odwołują się do tej samej zmiennej co wszystkie inne zasady dotyczące limitu w przypadku pozostałych serwerów proxy lub do zmiennych unikalnych dla tych zasad 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 wartością type równą calendar musisz zdefiniować jawną wartość <StartTime>. Wartość czasu to czas GMT, a nie lokalny. Jeśli nie podasz wartości <StartTime> dla zasady typu calendar, Edge wyświetli 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ę odliczać 18 lutego 2017 r. o godzinie 10:30 czasu GMT i odświeża się co 5 godzin. Dlatego następne odświeżenie nastąpi 18 lutego 2017 r. o godz. 15:30 czasu GMT.

Licznik dostępu

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

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

Ponieważ dostęp do zmiennych przepływu dla zasady jest oparty na atrybucie name zasad, w przypadku zasady o nazwie QuotaPolicy możesz uzyskać dostęp do jej zmiennych przepływu w tej 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, do których możesz uzyskać dostęp, jak opisano poniżej.

Możesz na przykład użyć tej zasady przypisywania wiadomości, aby zwracać wartości zmiennych przepływu limitu jako nagłówków 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>

Pierwsze żądanie

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

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

Jeśli np. licznik zaczyna się od 2017-07-08 07:00:00, to wraca do 0 o 2017-07-08 08:00:00 (1 godzinę od czasu rozpoczęcia). Jeśli pierwsza wiadomość została odebrana o 2017-07-08 07:35:28, a liczba wiadomości osiągnie 10 tys. przed 2017-07-08 08:00:00, połączenia powyżej tej liczby będą odrzucane, dopóki ich liczba nie zostanie zresetowana na początku godziny.

Czas zresetowania licznika zależy od kombinacji reguł <Interval><TimeUnit>. Jeśli np. ustawisz wartość <Interval> na 12, a <TimeUnit> na godzinę, 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 tej zasady w kilku miejscach w swoim interfejsie proxy API. Możesz na przykład umieścić ją w prefiltrze proxy, aby była wykonywana przy każdej prośbie. Możesz też umieścić go w kilku przepływach w serwerze proxy API. Jeśli używasz tej zasady w kilku miejscach w proxy, w przypadku każdego wystąpienia zasady jest używany jeden licznik.

Możesz też zdefiniować w proxy interfejsu API kilka zasad dotyczących limitu. Każda polityka dotycząca limitu ma własny licznik oparty na atrybucie name tej polityki.

Ustaw identyfikator

<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 definiuje jeden licznik dla serwera proxy interfejsu API niezależnie od źródła żądania. Możesz też użyć atrybutu <Identifier> z zasadą dotyczącą limitu, aby utrzymać osobne liczniki na podstawie wartości atrybutu <Identifier>.

Na przykład za pomocą tagu <Identifier> możesz zdefiniować osobne liczniki dla każdego identyfikatora klienta. W żądaniu wysłanym do serwera proxy aplikacja klienta przekazuje nagłówek zawierający wartość clientID, jak pokazano w przykładzie powyżej.

W atrybucie <Identifier> możesz podać 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 API używasz zasady VerifyAPIKey lub zasad OAuthV2 z tokenami OAuth, możesz użyć informacji z klucza API lub tokena, aby zdefiniować osobne liczniki dla tej samej zasady dotyczącej limitu. Na przykład tag <Identifier> używa zmiennej przepływu client_id z zasady o nazwie VerifyAPIKey o nazwie verify-api-key:

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

Każda niepowtarzalna 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 limitów możesz ustawiać dynamicznie, korzystając z liczby limitów na podstawie klasy. W tym przykładzie limit kwoty jest określany przez wartość nagłówka developer_segmentprzekazanego z każdym żądaniem. Ta zmienna może mieć wartość platinum lub silver. Jeśli nagłówek ma nieprawidłową wartość, zasada zwraca błąd naruszenia limitu.


Zasady dotyczące limitów

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

Jeśli na przykład limit wynosi 10 tys. wiadomości miesięcznie, ograniczanie szybkości rozpoczyna się po wysłaniu 10 tysięcznego wiadomości. Nie ma znaczenia,czy 10 tys. wiadomości zostało zliczonych pierwszego dnia czy ostatniego dnia tego okresu. Nie można wysyłać dodatkowych żądań, dopóki licznik limitu nie zostanie automatycznie zresetowany na koniec podanego przedziału czasu lub dopóki limit nie zostanie wyraźnie zresetowany za pomocą zasad resetowania limitu.

Różnica w przypadku limitu zwana SpikeArrest zapobiega nagłym wzrostom (lub skokom) natężenia ruchu, które mogą być spowodowane nagłym wzrostem wykorzystania, błędnymi klientami lub atakami złośliwymi. Więcej informacji o SpikeArrest znajdziesz w zasadach dotyczących SpikeArrest.

Limity dotyczą poszczególnych serwerów proxy interfejsu API i nie są rozkładane na nie. Jeśli np. masz 3 serwery proxy API w ramach usługi interfejsu API, jeden limit nie jest udostępniany wszystkim 3 serwerom, nawet jeśli wszystkie 3 serwery korzystają z tej samej konfiguracji zasady dotyczącej 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 się odliczać i kiedy się resetuje, jak pokazano w tabeli poniżej:

Jednostka czasu Domyślny (lub pusty) reset resetowanie kalendarza flexi reset
minuta Początek następnej minuty 1 minuta po: <StartTime> 1 minuta po pierwszym żądaniu
godzina Początek następnej godziny 1 godzinę po: <StartTime> 1 godzinę po pierwszym żądaniu
dzień Północ czasu uniwersalnego według Greenwich w bieżącym dniu. 24 godziny po: <StartTime> 24 godziny po pierwszym żądaniu
tydzień Niedziela o północy GMT na koniec tygodnia 1 tydzień po: <StartTime> Tydzień po pierwszym żądaniu
miesiąc Północ czasu GMT ostatniego dnia miesiąca miesiąc (28 dni) po: <StartTime> miesiąc (28 dni) od wysłania pierwszej prośby.

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

Tabela nie zawiera wartości typu rollingwindow. Okno kumulacyjne limity działają poprzez ustawienie rozmiaru „okna” limitu, np. 1 godziny lub 1 dnia. Gdy wpłynie nowe żądanie, zasady określają, czy w ostatnim „oknie” czasowym nie przekroczono limitu.

Możesz na przykład zdefiniować 2-godzinne okno, w którym dozwolisz na 1000 żądań. Nowe żądanie przychodzi o 16:45.Polityka oblicza limit na podstawie liczby żądań w ciągu ostatnich 2 godzin, czyli od 14:45. Jeśli w tym 2-godzinnym oknie nie przekroczysz limitu, żądanie zostanie zaakceptowane.

Minutę później, o 16:46, przychodzi kolejna prośba. Teraz zasada oblicza liczbę limitów od godziny 14:46, aby ustalić, czy limit został przekroczony.

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

Liczniki limitów

Domyślnie zasada dotycząca limitu korzysta z jednego licznika niezależnie od tego, ile razy jest ona wywoływana w interfejsie API. Nazwa licznika limitu jest tworzona na podstawie atrybutu name w regułach.

Na przykład tworzysz politykę dotyczącą limitu o nazwie MyQuotaPolicy z limitem 5 żądań i umieszczasz ją w wielu przepływach (przepływ A, B i C) w interfejsie proxy API. Chociaż jest używany w kilku przepływach danych, utrzymuje jeden licznik, który jest aktualizowany przez wszystkie wystąpienia zasad:

  • Przepływ A jest wykonywany -> MyQuotaPolicy jest wykonywany i jego licznik = 1
  • Wykonywanie przepływu B -> zasada MyQuotaPolicy jest wykonywana i jej licznik = 2
  • Przepływ A jest wykonywany -> MyQuotaPolicy jest wykonywany, a jego licznik = 3.
  • Przepływ C jest wykonywany -> MyQuotaPolicy jest wykonywany i jego licznik = 4
  • Przepływ A jest wykonywany > MyQuotaPolicy jest wykonywany i jego licznik = 5

Kolejne żądanie do dowolnego z tych 3 przepływów jest odrzucane, ponieważ licznik limitu osiągnął swój limit.

Używanie tej samej polityki dotyczącej limitów w więcej niż 1 miejscu w przepływie zapory API, co może nieumyślnie spowodować wyczerpanie limitu szybciej niż się spodziewasz, to antywzorzec opisany w książce The Book of Apigee Edge Antipatterns (Książka o antywzorcach Apigee Edge).

Możesz też zdefiniować w serwerze proxy interfejsu API wiele zasad dotyczących limitów i stosować inną zasadę w każdej ścieżce. Każda polityka dotycząca limitu ma własny licznik oparty na atrybucie name tej polityki.

Możesz też użyć elementów <Class> lub <Identifier> w zasadzie dotyczącej limitu, aby zdefiniować w jednej zasadzie wiele unikalnych liczników. Dzięki tym elementom jedna zasada może 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> lub <Identifier> znajdziesz w przykładach powyżej.

Notacja czasu

Wszystkie limity czasowe są ustawione na uniwersalny czas koordynowany (UTC).

Notacja czasu w przypadku limitu jest zgodna z międzynarodowym standardem ISO 8601.

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

Godzina jest definiowana jako liczba godzin, minut i sekund w tym formacie: hours:minutes:seconds. Na przykład 23:59:59 oznacza czas 1 sekunda przed północą.

Pamiętaj, że do rozróżnienia 2 północy, które mogą być powiązane z 1 datą, dostępne są 2 notacje: 00:00:0024:00:00. Dlatego 2015-02-04 24:00:00 ma tę samą datę i godzinę co 2015-02-05 00:00:00. Druga z nich jest zwykle preferowaną notacją.

Pobieranie ustawień limitu w ramach konfiguracji produktu interfejsu API

Limity limitów możesz ustawiać w konfiguracjach usług API. Te limity nie powodują automatycznego stosowania limitu. Zamiast tego możesz użyć ustawień limitu dla produktu w zasadach dotyczących limitu. Oto kilka zalet ustawienia limitu dla usługi na potrzeby zasad dotyczących limitów:

  • Zasady dotyczące limitów mogą używać jednolitych ustawień we wszystkich serwerach proxy interfejsu API w danym interfejsie API.
  • Możesz wprowadzać zmiany ustawień limitu w czasie wykonywania w przypadku usługi interfejsu API, a zasady dotyczące limitu, które odwołują się do tej wartości, będą automatycznie aktualizować wartości limitu.

Więcej informacji o używaniu ustawień limitu w usłudze interfejsu API znajdziesz w przykładzie „Dynamiczny limit” powyżej.

Informacje o konfigurowaniu usług interfejsu API z ograniczeniami dotyczącymi limitów znajdziesz w artykule Tworzenie usług interfejsu API.

Element referencyjny

Poniżej znajdziesz elementy i atrybuty, które możesz skonfigurować w ramach tej zasady. Pamiętaj, że niektóre kombinacje elementów wykluczają się wzajemnie lub nie są wymagane. Zapoznaj się ze wzorami dotyczącymi konkretnego zastosowania. Poniższe zmienne verifyapikey.VerifyAPIKey.apiproduct.* są domyślnie dostępne, gdy w żądaniu używana jest zasada weryfikacji klucza API o nazwie „VerifyAPIKey” do sprawdzania klucza API aplikacji. Wartości zmiennych pochodzą z ustawień limitu usługi interfejsu API, z którą powiązany jest klucz, zgodnie z opisem w artykule Pobieranie ustawień limitu z konfiguracji usługi interfejsu 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">

Te atrybuty są związane z tymi zasadami.

Atrybut Opis Domyślny Obecność
typ

Określa, kiedy i jak licznik limitu sprawdza wykorzystanie limitu. Więcej informacji znajdziesz w zasadach dotyczących limitów.

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

Prawidłowe wartości:

  • calendar: skonfiguruj limit na podstawie dokładnego czasu rozpoczęcia. Licznik limitu dla każdej aplikacji jest odświeżany na podstawie ustawionych wartości <StartTime>, <Interval> i <TimeUnit>.
  • rollingwindow: skonfiguruj limit, który używa „przesuwającego się okna” do określania wykorzystania limitu. W przypadku funkcji rollingwindow rozmiar okna określasz za pomocą elementów <Interval><TimeUnit>, np. 1 dzień. Gdy przychodzi żądanie, Edge sprawdza dokładny czas jego wysłania (np. 17:01), zlicza żądania, które zostały wysłane między tą godziną a 17:01 poprzedniego dnia (1 dzień), i określa, czy w tym czasie nie przekroczono limitu.
  • flexi: skonfiguruj limit, który powoduje, że licznik rozpoczyna odliczanie po otrzymaniu pierwszej wiadomości z aplikacji i resetuje 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 dla tej zasady osiągnie tę wartość, kolejne wywołania będą odrzucane, dopóki licznik się nie wyzeruje.

Poniżej znajdziesz 3 sposoby ustawienia 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 rozwiązany w czasie wykonywania kodu, zostanie użyta wartość count.

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

Atrybuty

Atrybut Opis Domyślny Obecność
liczba

Użyj tego pola, aby określić liczbę wiadomości dla limitu.

Na przykład wartość atrybutu count 100, Interval 1, a TimeUnit miesiąc określają limit 100 wiadomości miesięcznie.

2000 Opcjonalny
countRef

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

brak Opcjonalny

Element <Allow>/<Class>

Element <Class> umożliwia warunkowe nadawanie wartości elementom <Allow> na podstawie wartości zmiennej przepływu. W przypadku każdego tagu podrzędnego <Allow> elementu <Class> zasada używa innego licznika.

Aby użyć elementu <Class>, wskaż zmienną przepływu, używając atrybutu ref w tagu <Class>. Następnie Edge używa wartości zmiennej przepływu, aby wybrać jeden z tagów podrzędnych <Allow>, który 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. Ta zmienna może mieć wartość peak_time lub off_peak_time. Jeśli parametr zapytania zawiera nieprawidłową wartość, zasady zwracają błąd naruszenia limitu.

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

Atrybuty

Atrybut Opis Domyślny Obecność
ref

Użyj tego parametru, aby określić zmienną przepływu zawierającą klasę limitu dla limitu.

brak Wymagane

<Allow>/<Class>/<Allow> element

Element <Allow> określa limit dla licznika limitu określonego przez element <Class>. W przypadku każdego innego tagu podrzędnego <Allow> elementu <Class> zasada utrzymuje 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 korzysta z 2 liczników limitu 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 kwoty dla licznika. brak Wymagane

Element <Interval>

Użyj tego parametru, aby określić liczbę całkowitą (np. 1, 2, 5, 60 itd.), która zostanie połączona z określonym parametrem TimeUnit (minuty, godziny, dni, tygodnie lub miesiące), aby określić przedział czasu, w którym Edge oblicza wykorzystanie limitu.

Na przykład Interval 24TimeUnit 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

Służy do określenia zmiennej przepływu zawierającej interwał dla limitu. ref ma pierwszeństwo przed jawną wartością przedziału. Jeśli podano zarówno odwołanie, jak i wartość, odwołanie ma pierwszeństwo. Jeśli ref nie zostanie rozwiązany w czasie wykonywania kodu, zostanie użyta wartość.

brak Opcjonalny

Element <TimeUnit>

Użyj tego pola, aby określić jednostkę czasu obowiązującą w przypadku limitu.

Na przykład Interval 24TimeUnit 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 minute, hour, day, week lub month.

Atrybuty

Atrybut Opis Domyślny Obecność
ref Użyj tego polecenia, aby określić zmienną przepływu zawierającą jednostkę czasu dla limitu. ref ma pierwszeństwo przed jawną wartością odstępu. Jeśli ref nie zostanie rozwiązane w czasie wykonywania, zostanie użyta wartość. brak Opcjonalny

Element <StartTime>

Gdy wartość type jest ustawiona na calendar,, określa datę i godzinę, od której licznik limitu zacznie się odliczać, niezależnie od tego, czy aplikacje wysłały jakieś żądania.

Na przykład:

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

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

Element <Distributed>

Instalacja przeglądarki Edge może używać co najmniej 1 procesora wiadomości do przetwarzania żądań. Ustaw ten element na true, aby określić, że zasada powinna utrzymywać centralny licznik i ciągle go synchronizować we wszystkich procesorach wiadomości. Przetwarzanie wiadomości może odbywać 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 dla każdego procesora wiadomości nie jest współdzielona:

<Distributed>true</Distributed>

Aby mieć pewność, że liczniki są synchronizowane i aktualizowane przy każdym żądaniu, ustaw wartości <Distributed><Synchronous> na prawda:

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

Element <Synchronous>

Ustaw na true, aby zsynchronizować zliczanie rozproszonego limitu. Oznacza to, że zliczanie jest aktualizowane w tym samym czasie, gdy sprawdzany jest limit w żądaniu wysyłanym do interfejsu API. Ustaw na true, jeśli chcesz, aby żadne wywołania interfejsu API nie przekraczały limitu.

Aby zaktualizować licznik limitu asynchronicznie, ustaw wartość false. Oznacza to, że niektóre wywołania interfejsu API, które przekraczają limit, mogą być realizowane, w zależności od tego, kiedy licznik limitu w repozytorium centralnym jest aktualizowany asynchronicznie. Nie będziesz jednak mieć do czynienia z potencjalnymi problemami z wydajnością związanymi z aktualizacjami synchronicznymi.

Domyślny asynchroniczny interwał aktualizacji 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 rozłożonymi na wiele serwerów licznikami limitu, gdy element konfiguracji zasad <Synchronous> jest nieobecny lub obecny i ustawiony na false.

Synchronizację możesz wykonać 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. Te opcje wzajemnie się wykluczają. Na przykład

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

lub

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

Kompleks budowlany

Element <AsynchronousConfiguration>/<SyncIntervalInSeconds>

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

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

Interval synchronizacji musi wynosić co najmniej 10 sekund, zgodnie z opisem w artykule Limity.

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

Liczba całkowita

<AsynchronousConfiguration>/<SyncMessageCount> element

Określa liczbę żądań w ramach wszystkich procesorów wiadomości Apigee między aktualizacjami limitu.

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

W tym przykładzie określamy, że limit jest aktualizowany co 5 żądań w przypadku każdego procesora wiadomości Apigee Edge.

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

Liczba całkowita

Element <Identifier>

Aby skonfigurować zasady w celu tworzenia unikalnych liczników na podstawie zmiennej przepływu, użyj elementu <Identifier>.

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 konkretnym deweloperem. Do identyfikowania limitu możesz używać różnych zmiennych, niezależnie od tego, czy używasz zmiennych niestandardowych, czy wstępnie zdefiniowanych, takich jak te dostępne w zasadach dotyczących klucza weryfikacyjnego interfejsu API. Zobacz też dokumentację dotyczącą zmiennych.

Jeśli nie używasz tego elementu, zasada używa jednego licznika, który jest stosowany w przypadku limitu.

Ten element jest również omawiany w tym poście w społeczności Apigee: http://community.apigee.com/questions/2807/how-does-the-edge-quota-policy-work-when-no-identi.html.

<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 prośbie. 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 interfejsu API lub innej cechy.

<Identifier> najczęściej używany do jednoznacznego identyfikowania aplikacji to client_id. client_id to inna nazwa klucza interfejsu API lub klucza konsumenta, który jest generowany dla aplikacji po zarejestrowaniu jej w organizacji w usłudze Apigee Edge. Możesz użyć tego identyfikatora, jeśli masz włączony klucz API lub zasady autoryzacji OAuth dla interfejsu API.

W niektórych okolicznościach ustawienia limitu muszą być pobierane, gdy nie ma dostępnego elementu client_id, np. gdy nie ma zasad bezpieczeństwa. W takich przypadkach możesz użyć zasady dostępu do obiektu, aby pobrać odpowiednie ustawienia usługi API, a następnie wyodrębnić wartości za pomocą funkcji ExtractVariables i użyć wyodrębnionej zmiennej kontekstu w zasadach dotyczących limitu. Więcej informacji znajdziesz w zasadach dotyczących podmiotu dostępu.

Nie dotyczy Opcjonalny

Element <MessageWeight>

Użyj tego pola, aby określić wagę przypisaną do każdej wiadomości. Użyj wagi wiadomości, aby zwiększyć wpływ wiadomości żądania, które na przykład zużywa więcej zasobów obliczeniowych niż inne.

Możesz na przykład uznać, że żądania POST są dwa razy „cięższe” lub droższe niż żądania GET. Dlatego w przypadku metody POST ustawiasz wartość MessageWeight na 2, a w przypadku metody GET – na 1. Możesz nawet ustawić wartość parametru MessageWeight na 0, aby prośba nie wpływała na licznik. W tym przykładzie, jeśli limit wynosi 10 wiadomości na minutę, a MessageWeight dla żądań POST wynosi 2, limit będzie zezwalać na 5 żądań POST w dowolnym 10-minutowym interwale. Każde dodatkowe żądanie POST lub GET przed zresetowaniem licznika zostanie odrzucone.

Wartość reprezentująca MessageWeight musi być określona przez zmienną przepływu. Można ją wyodrębnić z nagłówków HTTP, parametrów zapytania, ładunku żądania XML lub JSON albo dowolnej innej zmiennej przepływu. Na przykład w nagłówku o nazwie weight:

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

Liczba całkowita

Zmienne przepływu

Gdy zadziała reguła dotycząca limitu, automatycznie wypełnią się te wstępnie zdefiniowane zmienne przepływu: Więcej informacji o zmiennych w Flow znajdziesz w artykule Informacje o zmiennych.

Zmienne Typ Uprawnienia Opis
ratelimit.{policy_name}.allowed.count Długie Tylko do odczytu Zwraca dozwoloną liczbę kont
ratelimit.{policy_name}.used.count Długie Tylko do odczytu Zwraca bieżącą ilość miejsca na dysku używaną w ramach 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 1 po przekroczeniu limitu.
ratelimit.{policy_name}.total.exceed.count Długie Tylko do odczytu Zwraca 1 po przekroczeniu limitu.
ratelimit.{policy_name}.expiry.time Długie Tylko do odczytu

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

Gdy typ zasad dotyczących limitu wynosi rollingwindow, ta wartość jest nieprawidłowa, ponieważ interwał limitu nigdy nie wygasa.

ratelimit.{policy_name}.identifier Ciąg znaków Tylko do odczytu Zwraca odwołanie do identyfikatora (klienta) powiązanego z zasadami
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 dozwoloną liczbę jednostek dostępnych w ramach limitu określonego w klasie.
ratelimit.{policy_name}.class.used.count Długie Tylko do odczytu Zwraca wykorzystany limit w ramach klasy.
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 interwale limitu
ratelimit.{policy_name}.class.total.exceed.count Długie Tylko do odczytu Zwraca łączną liczbę żądań, które przekraczają limit na zajęciach, w przypadku wszystkich interwałów limitu, czyli jest to suma wartości class.exceed.count dla wszystkich interwałów limitu.
ratelimit.{policy_name}.failed Wartość logiczna Tylko do odczytu

Wskazuje, czy zasada się nie powiodła (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>.
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.
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ą).
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.
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.
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.
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.
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.
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.
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.
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.

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>

Schematy

Powiązane artykuły

Resetowanie zasad dotyczących limitu kwoty

SpikeArrest policy

Porównanie zasad dotyczących limitów, ograniczania dostępu w przypadku nagłego wzrostu ruchu i limitów współbieżnego dostępu