Политика квот

Вы просматриваете документацию Apigee Edge .
Перейдите к документации Apigee X.
информация

Что

Используйте политику квот, чтобы настроить количество сообщений запросов, которые прокси-сервер API разрешает за определенный период времени, например минуту, час, день, неделю или месяц. Вы можете установить одинаковую квоту для всех приложений, обращающихся к прокси-серверу API, или установить квоту на основе:

  • Продукт, содержащий прокси API
  • Приложение, запрашивающее API
  • Разработчик приложения
  • Многие другие критерии

Не используйте квоту для защиты от общего всплеска трафика. Для этого используйте политику Spike Arrest. См. политику пикового ареста .

Видео

Эти видеоролики знакомят с управлением квотами с помощью политики квот:

Введение (Новый край)

Введение (Классический край)

Динамическая квота

Распределенный и синхронный

Вес сообщения

Календарь

Роллинг окно

Гибкий

Условная квота

Переменные потока

Обработка ошибок

Образцы

Эти примеры кода политики иллюстрируют, как начинать и заканчивать периоды действия квоты следующим образом:

Более динамичная квота

<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>

Динамические квоты позволяют настроить единую политику квот, которая применяет различные параметры квот на основе информации, передаваемой в политику квот. Другой термин для настроек квоты в этом контексте — «План обслуживания». Динамическая квота проверяет «План обслуживания» приложений, а затем применяет эти настройки.

Примечание . Если вы указываете для элемента и значение, и ссылку, то ссылка получает приоритет. Если ссылка не разрешается во время выполнения, используется значение.

Например, при создании продукта API вы можете дополнительно установить разрешенный предел квоты, единицу времени и интервал. Однако установка этих значений в продукте API не требует их использования в прокси-сервере API. Вы также должны добавить политику квот к прокси-серверу API, который считывает эти значения. Дополнительные сведения см. в разделе Создание продуктов API .

В приведенном выше примере прокси-сервер API, содержащий политику квот, использует политику VerifyAPIKey с именемverify verify-api-key для проверки ключа API, переданного в запросе. Затем политика квот обращается к переменным потока из политики VerifyAPIKey, чтобы прочитать значения квоты, установленные для продукта API. Дополнительные сведения о переменных потока VerifyAPIKey см. в разделе Политика Verify API Key .

Другой вариант — установить настраиваемые атрибуты для отдельных разработчиков или приложений, а затем прочитать эти значения в политике квот. Например, вы хотите установить разные значения квот для каждого разработчика. В этом случае вы устанавливаете для разработчика пользовательские атрибуты, содержащие лимит, единицу времени и интервал. Затем вы ссылаетесь на эти значения в политике квот, как показано ниже:

<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>

В этом примере также используются переменные потока VerifyAPIKey для ссылки на настраиваемые атрибуты, установленные разработчиком.

Вы можете использовать любую переменную для установки параметров политики квот. Эти переменные могут быть получены из:

  • Переменные потока
  • Свойства продукта, приложения или разработчика API
  • Карта ключевых значений (KVM)
  • Заголовок, параметр запроса, параметр формы и т. д.

Для каждого прокси API вы можете добавить политику квот, которая либо ссылается на ту же переменную, что и все другие политики квот во всех других прокси, либо политика квот может ссылаться на переменные, уникальные для этой политики и прокси.

Время начала

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

Для квоты с type calendar необходимо определить явное значение <StartTime> . Значением времени является время по Гринвичу, а не местное время. Если вы не укажете значение <StartTime> для политики типа calendar , Edge выдаст ошибку.

Счетчик квоты для каждого приложения обновляется на основе значений <StartTime> , <Interval> и <TimeUnit> . В этом примере квота начинает отсчет в 10:30 по Гринвичу 18 февраля 2017 г. и обновляется каждые 5 часов. Таким образом, следующее обновление состоится в 15:30 по Гринвичу 18 февраля 2017 года.

Счетчик доступа

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

Прокси-сервер API имеет доступ к переменным потока, установленным политикой квот. Вы можете получить доступ к этим переменным потока в прокси-сервере API, чтобы выполнить условную обработку, отслеживать политику, когда она приближается к пределу квоты, возвращать текущий счетчик квоты в приложение или по другим причинам.

Поскольку доступ к переменным потока для политики основан на атрибуте name политики, для политики с именем QuotaPolicy , указанной выше, вы получаете доступ к ее переменным потока в форме:

  • ratelimit.QuotaPolicy.allowed.count : разрешенное количество.
  • ratelimit.QuotaPolicy.used.count : Текущее значение счетчика.
  • ratelimit.QuotaPolicy.expiry.time : время в формате UTC, когда счетчик сбрасывается.

Существует множество других переменных потока, к которым вы можете получить доступ, как описано ниже.

Например, вы можете использовать следующую политику AssignMessage для возврата значений переменных потока квоты в качестве заголовков ответа:

<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>

Первый запрос

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

Используйте этот пример кода, чтобы обеспечить соблюдение квоты в 10 000 вызовов в час. Политика сбрасывает счетчик квоты в начале каждого часа. Если счетчик достигает квоты в 10 000 вызовов до конца часа, вызовы, превышающие 10 000, отклоняются.

Например, если счетчик запускается в 2017-07-08 07:00:00 , то он сбрасывается до 0 в 2017-07-08 08:00:00 (1 час с момента начала). Если первое сообщение получено в 2017-07-08 07:35:28 и количество сообщений достигает 10 000 до 2017-07-08 08:00:00 , вызовы, превышающие это количество, отклоняются до тех пор, пока счетчик не обнулится в верхней части списка. час.

Время сброса счетчика основано на комбинации <Interval> и <TimeUnit> . Например, если вы установите для <Interval> значение 12 для <TimeUnit> часа, счетчик сбрасывается каждые двенадцать часов. Вы можете установить <TimeUnit> на минуту, час, день, неделю или месяц.

Вы можете ссылаться на эту политику в нескольких местах вашего прокси-сервера API. Например, вы можете поместить его в Proxy PreFlow, чтобы он выполнялся при каждом запросе. Или вы можете разместить его в нескольких потоках прокси-сервера API. Если вы используете эту политику в нескольких местах прокси-сервера, она поддерживает один счетчик, который обновляется всеми экземплярами политики.

Альтернативно вы можете определить несколько политик квот в своем прокси-сервере API. Каждая политика квот имеет собственный счетчик, основанный на атрибуте name политики.

Установить идентификатор

<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>

По умолчанию политика квот определяет один счетчик для прокси-сервера API, независимо от источника запроса. Альтернативно вы можете использовать атрибут <Identifier> с политикой квот для ведения отдельных счетчиков на основе значения атрибута <Identifier> .

Например, используйте тег <Identifier> , чтобы определить отдельные счетчики для каждого идентификатора клиента. При запросе к вашему прокси клиентское приложение затем передает заголовок, содержащий clientID , как показано в примере выше.

В атрибуте <Identifier> можно указать любую переменную потока. Например, вы можете указать, что параметр запроса с именем id содержит уникальный идентификатор:

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

Если вы используете политику VerifyAPIKey для проверки ключа API или политики OAuthV2 с токенами OAuth, вы можете использовать информацию в ключе или токене API для определения отдельных счетчиков для одной и той же политики квот. Например, следующий тег <Identifier> использует переменную потока client_id политики VerifyAPIKey с именемverify verify-api-key :

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

Каждое уникальное значение client_id теперь определяет свой собственный счетчик в политике квот.

Сорт

<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>

Вы можете установить ограничения квоты динамически, используя подсчет квот на основе классов. В этом примере предел квоты определяется значением заголовка developer_segment , передаваемого с каждым запросом. Эта переменная может иметь значение platinum или silver . Если заголовок имеет недопустимое значение, политика возвращает ошибку нарушения квоты.


О политике квотирования

Квота — это распределение сообщений с запросами, которые прокси-сервер API может обрабатывать в течение определенного периода времени, например минуты, часа, дня, недели или месяца. Политика поддерживает счетчики, которые подсчитывают количество запросов, полученных прокси-сервером API. Эта возможность позволяет поставщикам API устанавливать ограничения на количество вызовов API, выполняемых приложениями за определенный промежуток времени. Используя политики квот, вы можете, например, ограничить приложения до 1 запроса в минуту или до 10 000 запросов в месяц.

Например, если квота определена как 10 000 сообщений в месяц, ограничение скорости начинается после 10 000-го сообщения. Не имеет значения, было ли подсчитано 10 000 сообщений в первый или последний день этого периода; дополнительная область запросов не допускается до тех пор, пока счетчик квоты не будет автоматически сброшен в конце указанного интервала времени или пока квота не будет явно сброшена с помощью политики сброса квоты .

Вариант квоты под названием SpikeArrest предотвращает всплески (или всплески) трафика, которые могут быть вызваны внезапным увеличением использования, ошибками клиентов или злонамеренными атаками. Дополнительную информацию о SpikeArrest см. в разделе Политика Spike Arrest .

Квоты применяются к отдельным прокси API и не распределяются между прокси API. Например, если у вас есть три прокси-сервера API в продукте API, одна квота не будет использоваться всеми тремя, даже если все три используют одну и ту же конфигурацию политики квот.

Типы политики квот

Политика квот поддерживает несколько различных типов политик: по умолчанию, calendar , flexi и rollingwindow . Каждый тип определяет, когда счетчик квот запускается и когда он сбрасывается, как показано в следующей таблице:

Единица времени Сброс по умолчанию (или нулевой) сброс календаря гибкий сброс
минута Начало следующей минуты Через минуту после <StartTime> Через минуту после первого запроса
час Начало следующего часа Через час после <StartTime> Через час после первого запроса
день Полночь по Гринвичу текущего дня Через 24 часа после <StartTime> 24 часа после первого запроса
неделя Полночь по Гринвичу в воскресенье в конце недели Через неделю после <StartTime> Через неделю после первого запроса
месяц Полночь по Гринвичу последнего дня месяца Через месяц (28 дней) после <StartTime> Один месяц (28 дней) после первого запроса

Для type="calendar" необходимо указать значение <StartTime> .

В таблице не указано значение для типа rollingwindow . Квоты скользящего окна работают путем установки размера «окна» квоты, например окна в один час или один день. Когда поступает новый запрос, политика определяет, была ли превышена квота в прошлом «окне» времени.

Например, вы определяете двухчасовой интервал, позволяющий обрабатывать 1000 запросов. Новый запрос поступает в 16:45. Политика вычисляет количество квот за последние два часа, то есть количество запросов с 14:45. Если предел квоты не был превышен в течение этого двухчасового окна, запрос разрешается.

Через минуту, в 16:46, поступает еще один запрос. Теперь политика вычисляет количество квот с 14:46, чтобы определить, превышен ли лимит.

Для типа rollingwindow счетчик никогда не сбрасывается, а пересчитывается при каждом запросе.

Общие сведения о счетчиках квот

По умолчанию политика квот поддерживает один счетчик, независимо от того, сколько раз вы ссылаетесь на него в прокси-сервере API. Имя счетчика квот основано на атрибуте name политики.

Например, вы создаете политику квот с именем MyQuotaPolicy с ограничением в 5 запросов и размещаете ее в нескольких потоках (поток A, B и C) в прокси-сервере API. Несмотря на то, что он используется в нескольких потоках, он поддерживает один счетчик, который обновляется всеми экземплярами политики:

  • Выполняется поток A -> выполняется MyQuotaPolicy и его счетчик = 1.
  • Выполняется поток B -> выполняется MyQuotaPolicy и его счетчик = 2
  • Выполняется поток A -> выполняется MyQuotaPolicy и его счетчик = 3.
  • Выполняется поток C -> выполняется MyQuotaPolicy и его счетчик = 4.
  • Выполняется поток A -> выполняется MyQuotaPolicy и его счетчик = 5.

Следующий запрос к любому из трех потоков отклоняется, поскольку счетчик квот достиг своего предела.

Использование одной и той же политики квот в более чем одном месте в потоке прокси API, что может непреднамеренно привести к исчерпанию квоты быстрее, чем вы ожидали, является антишаблоном, описанным в Книге антишаблонов Apigee Edge .

Альтернативно вы можете определить несколько политик квот в своем прокси-сервере API и использовать разные политики в каждом потоке. Каждая политика квот имеет собственный счетчик, основанный на атрибуте name политики.

Или используйте элементы <Class> или <Identifier> в политике квот, чтобы определить несколько уникальных счетчиков в одной политике. Используя эти элементы, одна политика может поддерживать разные счетчики в зависимости от приложения, отправляющего запрос, разработчика приложения, отправляющего запрос, идентификатора клиента или другого идентификатора клиента и т. д. Дополнительные сведения об использовании элементов <Class> или <Identifier> см. в примерах выше.

Обозначение времени

Для всех времен квот установлено часовой пояс всемирного координированного времени (UTC).

Обозначение времени квоты соответствует международному стандарту обозначения даты, определенному в международном стандарте ISO 8601 .

Даты определяются как год, месяц и день в следующем формате: YYYY-MM-DD . Например, 2015-02-04 соответствует 4 февраля 2015 г.

Время суток определяется как часы, минуты и секунды в следующем формате: hours:minutes:seconds . Например, 23:59:59 представляет собой время за одну секунду до полуночи.

Обратите внимание, что доступны два обозначения: 00:00:00 и 24:00:00 , позволяющие различать две полуночи, которые могут быть связаны с одной датой. Следовательно, 2015-02-04 24:00:00 — это та же дата и время, что и 2015-02-05 00:00:00 . Последнее обычно является предпочтительным обозначением.

Получение настроек квоты из конфигурации продукта API

Вы можете установить ограничения квот в конфигурациях продукта API. Эти ограничения не приводят к автоматическому обеспечению соблюдения квоты. Вместо этого вы можете ссылаться на настройки квот продуктов в политике квот. Вот некоторые преимущества установки квоты на продукт, на которые можно ссылаться в политике квот:

  • Политики квот могут использовать единую настройку для всех прокси-серверов API в продукте API.
  • Вы можете вносить изменения во время выполнения в настройку квоты для продукта API, и политики квот, которые ссылаются на это значение, автоматически обновляют значения квот.

Дополнительную информацию об использовании настроек квоты из продукта API см. в примере «Динамическая квота» выше. .

Информацию о настройке продуктов API с ограничениями квот см. в разделе Создание продуктов API .

Ссылка на элемент

Ниже приведены элементы и атрибуты, которые вы можете настроить в этой политике. Обратите внимание, что некоторые комбинации элементов являются взаимоисключающими или необязательными. См. образцы для конкретного использования. verifyapikey.VerifyAPIKey.apiproduct.* приведенные ниже, доступны по умолчанию, когда политика проверки ключа API под названием «VerifyAPIKey» используется для проверки ключа API приложения в запросе. Значения переменных берутся из настроек квоты продукта API, с которым связан ключ, как описано в разделе Получение настроек квоты из конфигурации продукта 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>

Атрибуты <Квота>

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

Следующие атрибуты относятся только к этой политике.

Атрибут Описание По умолчанию Присутствие
тип

Используйте, чтобы определить, когда и как счетчик квот проверяет использование квоты. Дополнительные сведения см. в разделе Типы политик квот .

Если вы опустите значение type , счетчик начнется с начала минуты/часа/дня/недели/месяца.

Допустимые значения включают в себя:

  • calendar : настройте квоту на основе явного времени начала. Счетчик квоты для каждого приложения обновляется на основе установленных вами значений <StartTime> , <Interval> и <TimeUnit> .
  • rollingwindow : настройте квоту, которая использует «скользящее окно» для определения использования квоты. rollingwindow , вы определяете размер окна с помощью элементов <Interval> и <TimeUnit> ; например, 1 день. Когда поступает запрос, Edge смотрит на точное время запроса (скажем, 17:01), подсчитывает количество запросов, поступивших между этим моментом и 17:01 предыдущего дня (1 день), и определяет, есть ли квота. было превышено в течение этого окна.
  • flexi : настройте квоту, которая запустит счетчик при получении первого сообщения запроса от приложения и сбрасывает его на основе значений <Interval>, и <TimeUnit> .
календарь Необязательный

В следующей таблице описаны атрибуты, общие для всех родительских элементов политики:

Атрибут Описание По умолчанию Присутствие
name

Внутреннее имя политики. Значение атрибута name может содержать буквы, цифры, пробелы, дефисы, подчеркивания и точки. Это значение не может превышать 255 символов.

При необходимости используйте элемент <DisplayName> , чтобы пометить политику в редакторе прокси-сервера пользовательского интерфейса управления другим именем на естественном языке.

Н/Д Необходимый
continueOnError

Установите значение false , чтобы возвращать ошибку в случае сбоя политики. Это ожидаемое поведение для большинства политик.

Установите значение true , чтобы выполнение потока продолжалось даже после сбоя политики.

ЛОЖЬ Необязательный
enabled

Установите значение true , чтобы обеспечить соблюдение политики.

Установите значение false , чтобы отключить политику. Политика не будет применена, даже если она останется привязанной к потоку.

истинный Необязательный
async

Этот атрибут устарел.

ЛОЖЬ Устарело

Элемент <DisplayName>

Используйте в дополнение к атрибуту name , чтобы пометить политику в редакторе прокси-сервера пользовательского интерфейса управления другим именем на естественном языке.

<DisplayName>Policy Display Name</DisplayName>
По умолчанию

Н/Д

Если вы опустите этот элемент, будет использовано значение атрибута name политики.

Присутствие Необязательный
Тип Нить

Элемент <Разрешить>

Указывает ограничение количества для квоты. Если счетчик политики достигает этого предельного значения, последующие вызовы отклоняются до тех пор, пока счетчик не будет сброшен.

Ниже показаны три способа установки элемента <Allow> :

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

Если вы укажете и count , и countRef , то countRef получит приоритет. Если countRef не разрешается во время выполнения, используется значение count .

По умолчанию: Н/Д
Присутствие: Необязательный
Тип: Целое число

Атрибуты

Атрибут Описание По умолчанию Присутствие
считать

Используйте, чтобы указать количество сообщений для квоты.

Например, значение атрибута count 100, Interval 1 и TimeUnit месяца определяют квоту в 100 сообщений в месяц.

2000 г. Необязательный
countRef

Используйте для указания переменной потока, содержащей количество сообщений для квоты. countRef имеет приоритет над атрибутом count .

никто Необязательный

Элемент <Разрешить>/<Класс>

Элемент <Class> позволяет обуславливать значение элемента <Allow> на основе значения переменной потока. Для каждого дочернего тега <Allow> <Class> политика поддерживает отдельный счетчик.

Чтобы использовать элемент <Class> , укажите переменную потока, используя атрибут ref тега <Class> . Затем Edge использует значение переменной потока для выбора одного из дочерних тегов <Allow> , чтобы определить разрешенное количество политики. Edge сопоставляет значение переменной потока с атрибутом class тега <Allow> , как показано ниже:

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

В этом примере текущий счетчик квоты определяется значением параметра запроса time_variable , передаваемого с каждым запросом. Эта переменная может иметь peak_time или off_peak_time . Если параметр запроса содержит недопустимое значение, политика возвращает ошибку нарушения квоты.

По умолчанию: Н/Д
Присутствие: Необязательный
Тип: Н/Д

Атрибуты

Атрибут Описание По умолчанию Присутствие
ссылка

Используйте для указания переменной потока, содержащей класс квоты.

никто Необходимый

Элемент <Разрешить>/<Класс>/<Разрешить>

Элемент <Allow> определяет предел для счетчика квоты, определенного элементом <Class> . Для каждого дочернего тега <Allow> <Class> политика поддерживает отдельный счетчик.

Например:

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

В этом примере политика квот поддерживает два счетчика квот с peak_time и off_peak_time .

По умолчанию: Н/Д
Присутствие: Необязательный
Тип: Н/Д

Атрибуты

Атрибут Описание По умолчанию Присутствие
сорт

Определяет имя счетчика квот.

никто Необходимый
считать Указывает предел квоты для счетчика. никто Необходимый

Элемент <Интервал>

Используйте для указания целого числа (например, 1, 2, 5, 60 и т. д.), которое будет соединено с указанной вами единицей TimeUnit (минута, час, день, неделя или месяц), чтобы определить период времени, в течение которого Edge рассчитывает использование квоты.

Например, Interval 24 с TimeUnit в hour означает, что квота будет рассчитываться в течение 24 часов.

<Interval ref="verifyapikey.VerifyAPIKey.apiproduct.developer.quota.interval">1</Interval>
По умолчанию: никто
Присутствие: Необходимый
Тип: Целое число

Атрибуты

Атрибут Описание По умолчанию Присутствие
ссылка

Используйте для указания переменной потока, содержащей интервал для квоты. ref имеет приоритет над явным значением интервала. Если указаны и ссылка, и значение, то ссылка получает приоритет. Если ref не разрешается во время выполнения, используется значение.

никто Необязательный

Элемент <TimeUnit>

Используйте для указания единицы времени, применимой к квоте.

Например, Interval 24 с TimeUnit в hour означает, что квота будет рассчитываться в течение 24 часов.

<TimeUnit ref="verifyapikey.VerifyAPIKey.apiproduct.developer.quota.timeunit">month</TimeUnit>
По умолчанию: никто
Присутствие: Необходимый
Тип:

Нить. Выберите minute , hour , day , week или month .

Атрибуты

Атрибут Описание По умолчанию Присутствие
ссылка Используйте для указания переменной потока, содержащей единицу времени для квоты. ref имеет приоритет над явным значением интервала. Если ref не разрешается во время выполнения, используется значение. никто Необязательный

Элемент <StartTime>

Если type задано значение calendar, указывается дата и время, когда счетчик квоты начнет отсчет, независимо от того, были ли получены какие-либо запросы от каких-либо приложений.

Вы должны указать явное StartTime , если для type явно задано значение calendar, Вы не можете использовать ссылку на переменную потока. Если вы укажете значение StartTime , когда значение type не установлено, вы получите сообщение об ошибке.

Например:

<StartTime>2017-7-16 12:00:00</StartTime>
По умолчанию: никто
Присутствие: Требуется, если type установлен calendar .
Тип:

Строка в формате даты и времени ISO 8601 .

<Распределенный> элемент

Установка Edge может использовать один или несколько процессоров сообщений для обработки запросов. Установите для этого элемента значение true , чтобы указать, что политика должна поддерживать центральный счетчик и постоянно синхронизировать его между всеми процессорами сообщений. Обработчики сообщений могут находиться в разных зонах и/или регионах доступности.

Если вы используете значение по умолчанию false , вы можете превысить свою квоту, поскольку счетчик для каждого процессора сообщений не является общим:

<Distributed>true</Distributed>

Чтобы гарантировать, что счетчики синхронизируются и обновляются при каждом запросе, установите для <Distributed> и <Synchronous> значение true:

<Distributed>true</Distributed>
<Synchronous>true</Synchronous>
По умолчанию: ЛОЖЬ
Присутствие: Необязательный
Тип: логическое значение

Элемент <Синхронный>

Установите значение true , чтобы синхронно обновлять счетчик распределенных квот. Это означает, что обновление счетчика производится одновременно с проверкой квоты по запросу к API. Установите значение true , если важно не разрешать вызовы API сверх квоты.

Установите значение false , чтобы счетчик квот обновлялся асинхронно. Это означает, что возможно, что некоторые вызовы API, превышающие квоту, будут выполнены, в зависимости от того, когда счетчик квоты в центральном репозитории будет асинхронно обновляться. Однако вы не столкнетесь с потенциальным снижением производительности, связанным с синхронными обновлениями.

Интервал асинхронного обновления по умолчанию составляет 10 секунд. Используйте элемент AsynchronousConfiguration чтобы настроить это асинхронное поведение.

<Synchronous>false</Synchronous>
По умолчанию: ЛОЖЬ
Присутствие: Необязательный
Тип: логическое значение

Элемент <AsynchronousConfiguration>

Настраивает интервал синхронизации между счетчиками распределенных квот, когда элемент конфигурации политики <Synchronous> либо отсутствует, либо присутствует и имеет значение false .

Вы можете синхронизировать либо по истечении периода времени, либо по количеству сообщений, используя дочерние элементы SyncIntervalInSeconds или SyncMessageCount . Они взаимоисключающие. Например,

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

или

<AsynchronousConfiguration>
   <SyncMessageCount>5</SyncMessageCount>
</AsynchronousConfiguration>
По умолчанию: СинкИнтервалИнСекондс = 10 секунд
Присутствие: Необязательный; игнорируется, если для <Synchronous> установлено значение true .
Тип:

Сложный

Элемент <AsynchronousConfiguration>/<SyncIntervalInSeconds>

Используйте это, чтобы переопределить поведение по умолчанию, при котором асинхронные обновления выполняются через интервал в 10 секунд.

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

Интервал синхронизации должен составлять >= 10 секунд, как описано в разделе «Ограничения» .

По умолчанию: 10
Присутствие: Необязательный
Тип:

Целое число

Элемент <AsynchronousConfiguration>/<SyncMessageCount>

Указывает количество запросов между всеми процессорами сообщений Apigee между обновлениями квоты.

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

В этом примере указано, что счетчик квот обновляется каждые 5 запросов в каждом процессоре сообщений Apigee Edge.

По умолчанию: н/д
Присутствие: Необязательный
Тип:

Целое число

Элемент <Идентификатор>

Используйте элемент <Identifier> , чтобы настроить политику для создания уникальных счетчиков на основе переменной потока.

Вы можете создавать уникальные счетчики для характеристик, определенных переменной потока. Например, вы можете использовать адрес электронной почты разработчика, чтобы привязать квоту к конкретному разработчику. Для определения квоты можно использовать различные переменные, независимо от того, используете ли вы пользовательские переменные или предопределенные переменные, например те, которые доступны в политике проверки ключа API . См. также справочник по переменным .

Если вы не используете этот элемент, политика использует один счетчик, применяемый к квоте.

Этот элемент также обсуждается в следующем сообщении сообщества 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"/>
По умолчанию: Н/Д
Присутствие: Необязательный
Тип:

Нить

Атрибуты

Атрибут Описание По умолчанию Присутствие
ссылка

Указывает переменную потока, которая идентифицирует счетчик, используемый для запроса. Идентификатор может представлять собой HTTP-заголовок, параметр запроса, параметр формы или содержимое сообщения, уникальное для каждого приложения, пользователя приложения, разработчика приложения, продукта API или другой характеристики.

<Identifier> который чаще всего используется для уникальной идентификации приложений, — это client_id . client_id — это другое имя ключа API или потребительского ключа, который создается для приложения при его регистрации в организации в Apigee Edge. Вы можете использовать этот идентификатор, если вы включили ключ API или политику авторизации OAuth для своего API.

В некоторых случаях настройки квоты необходимо получить, если client_id недоступен, например, когда отсутствует политика безопасности. В таких ситуациях вы можете использовать политику объекта доступа для получения соответствующих настроек продукта API, затем извлечь значения с помощью ExtractVariables, а затем использовать извлеченную переменную контекста в политике квот. Дополнительные сведения см. в разделе Политика доступа к объектам .

Н/Д Необязательный

Элемент <MessageWeight>

Используйте для указания веса, присвоенного каждому сообщению. Используйте вес сообщения, чтобы увеличить влияние сообщений с запросами, которые, например, потребляют больше вычислительных ресурсов, чем другие.

Например, вы хотите считать сообщения POST вдвое более «тяжелыми» или дорогими, чем сообщения GET. Поэтому вы устанавливаете MessageWeight равным 2 для POST и 1 для GET. Вы даже можете установить для MessageWeight значение 0, чтобы запрос не влиял на счетчик. В этом примере, если квота составляет 10 сообщений в минуту, а MessageWeight для запросов POST равен 2 , то квота разрешает 5 запросов POST в любой 10-минутный интервал. Любой дополнительный запрос POST или GET до сброса счетчика отклоняется.

Значение, представляющее MessageWeight должно быть указано переменной потока и может быть извлечено из заголовков HTTP, параметров запроса, полезных данных запроса XML или JSON или любой другой переменной потока. Например, вы устанавливаете его в заголовке с именем weight :

<MessageWeight ref="message_weight"/>
По умолчанию: Н/Д
Присутствие: Необязательный
Тип:

Целое число

Переменные потока

Следующие предопределенные переменные потока автоматически заполняются при выполнении политики квот. Дополнительные сведения о переменных потока см. в разделе Справочник по переменным .

Переменные Тип Разрешения Описание
ratelimit.{policy_name}.allowed.count Длинный Только для чтения Возвращает разрешенное количество квот
ratelimit.{policy_name}.used.count Длинный Только для чтения Возвращает текущую квоту, использованную в пределах интервала квоты.
ratelimit.{policy_name}.available.count Длинный Только для чтения Возвращает доступное количество квот в интервале квот.
ratelimit.{policy_name}.exceed.count Длинный Только для чтения Возвращает 1 после превышения квоты.
ratelimit.{policy_name}.total.exceed.count Длинный Только для чтения Возвращает 1 после превышения квоты.
ratelimit.{policy_name}.expiry.time Длинный Только для чтения

Возвращает время в формате UTC в миллисекундах, которое определяет, когда истекает срок действия квоты и начинается новый интервал квоты.

Если тип политики квоты rollingwindow , это значение недопустимо, поскольку интервал квоты никогда не истекает.

предел скорости.{имя_политики}.идентификатор Нить Только для чтения Возвращает ссылку на идентификатор (клиента), прикрепленную к политике.
ratelimit.{policy_name}.class Нить Только для чтения Возвращает класс, связанный с идентификатором клиента
ratelimit.{policy_name}.class.allowed.count Длинный Только для чтения Возвращает разрешенное количество квот, определенное в классе.
ratelimit.{policy_name}.class.used.count Длинный Только для чтения Возвращает использованную квоту внутри класса
ratelimit.{policy_name}.class.available.count Длинный Только для чтения Возвращает доступное количество квот в классе
ratelimit.{policy_name}.class.exceed.count Длинный Только для чтения Возвращает количество запросов, превышающих лимит в классе в текущем интервале квоты.
ratelimit.{policy_name}.class.total.exceed.count Длинный Только для чтения Возвращает общее количество запросов, превышающих ограничение в классе во всех интервалах квоты, поэтому оно представляет собой сумму class.exceed.count для всех интервалов квоты.
ratelimit.{policy_name}.failed логическое значение Только для чтения

Указывает, произошла ли ошибка политики (истина или ложь).

Ссылка на ошибку

В этом разделе описаны коды ошибок и сообщения об ошибках, которые возвращаются, а также переменные ошибок, которые устанавливаются Edge, когда эта политика вызывает ошибку. Эту информацию важно знать, если вы разрабатываете правила обработки ошибок. Дополнительные сведения см. в разделах Что нужно знать об ошибках политики и Обработка ошибок .

Ошибки выполнения

Эти ошибки могут возникнуть при выполнении политики.

Код неисправности Статус HTTP Причина Исправить
policies.ratelimit.FailedToResolveQuotaIntervalReference 500 Происходит, если элемент <Interval> не определен в политике квот. Этот элемент является обязательным и используется для указания интервала времени, применимого к квоте. Временной интервал может составлять минуты, часы, дни, недели или месяцы, как определено элементом <TimeUnit> .
policies.ratelimit.FailedToResolveQuotaIntervalTimeUnitReference 500 Происходит, если элемент <TimeUnit> не определен в политике квот. Этот элемент является обязательным и используется для указания единицы времени, применимой к квоте. Временной интервал может составлять минуты, часы, дни, недели или месяцы.
policies.ratelimit.InvalidMessageWeight 500 Происходит, если значение элемента <MessageWeight> , указанное через переменную потока, недопустимо (нецелое значение).
policies.ratelimit.QuotaViolation 500 Превышен лимит квоты. Н/Д

Ошибки развертывания

Название ошибки Причина Исправить
InvalidQuotaInterval Если интервал квоты, указанный в элементе <Interval> , не является целым числом, развертывание прокси-сервера API завершается неудачно. Например, если в элементе <Interval> указан интервал квоты, равный 0,1, развертывание прокси-сервера API завершится сбоем.
InvalidQuotaTimeUnit Если единица времени, указанная в элементе <TimeUnit> , не поддерживается, развертывание прокси-сервера API завершается неудачно. Поддерживаемые единицы времени: minute , hour , day , week и month .
InvalidQuotaType Если тип квоты, указанный атрибутом type в элементе <Quota> , недействителен, развертывание прокси-сервера API завершается неудачно. Поддерживаемые типы квот: default , calendar , flexi и rollingwindow .
InvalidStartTime Если формат времени, указанный в элементе <StartTime> , недопустим, развертывание прокси-сервера API завершается неудачей. Допустимый формат — yyyy-MM-dd HH:mm:ss , который соответствует формату даты и времени ISO 8601 . Например, если время, указанное в элементе <StartTime> , — 7-16-2017 12:00:00 , то развертывание прокси-сервера API завершается неудачно.
StartTimeNotSupported Если указан элемент <StartTime> , тип квоты которого не является типом calendar , то развертывание прокси-сервера API завершается неудачно. Элемент <StartTime> поддерживается только для типа calendar квоты. Например, если в элементе <Quota> для атрибута type установлено значение flexi или rolling window , развертывание прокси-сервера API завершится сбоем.
InvalidTimeUnitForDistributedQuota Если для элемента <Distributed> установлено значение true , а для элемента <TimeUnit> установлено значение second , развертывание прокси-сервера API завершается неудачей. Параметр timeunit second недопустим для распределенной квоты.
InvalidSynchronizeIntervalForAsyncConfiguration Если значение, указанное для элемента <SyncIntervalInSeconds> в элементе <AsynchronousConfiguration> в политике квот, меньше нуля, развертывание прокси-сервера API завершается неудачей.
InvalidAsynchronizeConfigurationForSynchronousQuota Если для значения элемента <AsynchronousConfiguration> установлено значение true в политике квот, которая также имеет асинхронную конфигурацию, определенную с помощью элемента <AsynchronousConfiguration> , то развертывание прокси-сервера API завершается неудачей.

Переменные неисправности

Эти переменные устанавливаются, когда эта политика вызывает ошибку. Дополнительные сведения см. в разделе Что нужно знать об ошибках политики .

Переменные Где Пример
fault.name=" fault_name " fault_name — это имя ошибки, как указано в таблице ошибок времени выполнения выше. Имя неисправности — это последняя часть кода неисправности. fault.name Matches "QuotaViolation"
ratelimit. policy_name .failed policy_name — указанное пользователем имя политики, вызвавшей ошибку. ratelimit.QT-QuotaPolicy.failed = true

Пример ответа об ошибке

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

Пример правила неисправности

<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>

Схемы

Связанные темы

Сбросить политику квот

Политика SpikeArrest

Сравнение политик квот, пикового ареста и ограничения одновременных ставок