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

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

Что

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

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

Не используйте Квоту для защиты от общих пиков трафика. Для этого используйте политику Spike Arrest. См. политику 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-api-key для проверки ключа API, переданного в запросе. Затем политика квот обращается к переменным потока из политики VerifyAPIKey для чтения значений квот, установленных для продукта API. Подробнее о переменных потока VerifyAPIKey см. в разделе Политика ключа API Verify .

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

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

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

Счетчик квоты для каждого приложения обновляется на основе значений <StartTime> , <Interval> и <TimeUnit> . В этом примере квота начинает отсчет в 10:30 утра по Гринвичу 18 февраля 2017 года и обновляется каждые 5 часов. Таким образом, следующее обновление произойдет в 3: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-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 сообщений в первый или последний день этого периода; дополнительные запросы не допускаются до тех пор, пока счетчик квоты не будет автоматически сброшен в конце указанного временного интервала или пока квота не будет явно сброшена с помощью политики сброса квоты .

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

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

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

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

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

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

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

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

Минуту спустя, в 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, которое может непреднамеренно привести к более быстрому исчерпанию квоты, чем вы ожидали, является антипаттерном, описанным в книге «The Book of Apigee Edge Antipatterns» .

В качестве альтернативы вы можете определить несколько политик квот в вашем 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>

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

Следующие атрибуты являются специфичными для этой политики.

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

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

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

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

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

Элемент <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>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>
По умолчанию: SyncIntervalInSeconds = 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> для настройки политики для создания уникальных счетчиков на основе переменной потока.

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

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

Этот элемент также обсуждается в следующем сообщении сообщества 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 недоступен, например, когда не применяется политика безопасности. В таких ситуациях можно использовать политику Access Entity для извлечения соответствующих настроек продукта API, затем извлечь значения с помощью ExtractVariables, а затем использовать извлеченную контекстную переменную в политике квоты. Для получения дополнительной информации см. политику Access Entity .

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

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

Целое число

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

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

Переменные Тип Разрешения Описание
ограничение скорости.{имя_политики}.разрешено.количество Длинный Только для чтения Возвращает разрешенное количество квот
ограничение скорости.{имя_политики}.использовано.количество Длинный Только для чтения Возвращает текущую квоту, используемую в пределах интервала квоты.
ограничение скорости.{имя_политики}.доступно.количество Длинный Только для чтения Возвращает доступное количество квот в интервале квот.
ограничение скорости.{имя_политики}.превысить.количество Длинный Только для чтения Возвращает 1 после превышения квоты.
ограничение скорости.{имя_политики}.всего.превышает.количество Длинный Только для чтения Возвращает 1 после превышения квоты.
ограничение скорости.{имя_политики}.время_истечения_срока Длинный Только для чтения

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

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

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

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

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

В этом разделе описаны коды ошибок и сообщения об ошибках, которые возвращаются, а также переменные ошибок, которые устанавливаются 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

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