Вы просматриваете документацию Apigee Edge .
Перейдите в документацию Apigee X.info
Что
Используйте политику квот, чтобы настроить количество запросов, которые API-прокси разрешает отправлять в течение определенного периода времени, например, минуты, часа, дня, недели или месяца. Вы можете установить одинаковую квоту для всех приложений, обращающихся к API-прокси, или установить квоту на основе следующих параметров:
- Продукт, содержащий API-прокси.
- Приложение запрашивает API.
- Разработчик приложения
- Многие другие критерии
Не используйте квоты для защиты от общих всплесков трафика. Для этого используйте политику предотвращения всплесков трафика. См. политику предотвращения всплесков трафика .
Видео
В этих видеороликах представлено ознакомление с управлением квотами с помощью политики квотирования:
Вступление (Новый подход)
Вступление (Classic Edge)
Динамическая квота
Распределенные и синхронные
Вес сообщения
Календарь
Складное окно
Флекси
Условная квота
Переменные потока
Обработка ошибок
Образцы
Эти примеры правил политики иллюстрируют, как начинать и заканчивать периоды действия квот:
Более динамичная квота
<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-прокси, содержащий политику квот, использует политику проверки API-ключа (VerifyAPIKey) с именем verify-api-key для проверки API-ключа, переданного в запросе. Затем политика квот обращается к переменным потока из политики VerifyAPIKey для чтения значений квот, установленных для API-продукта. Дополнительную информацию о переменных потока VerifyAPIKey см. в разделе «Политика проверки API-ключа» .
Другой вариант — установить пользовательские атрибуты для отдельных разработчиков или приложений, а затем считать эти значения в политике квот. Например, вы хотите установить разные значения квот для каждого разработчика. В этом случае вы устанавливаете пользовательские атрибуты для разработчика, содержащие лимит, единицу времени и интервал. Затем вы ссылаетесь на эти значения в политике квот, как показано ниже:
<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> . Значение времени соответствует времени GMT, а не местному времени. Если для политики типа calendar не указано значение <StartTime> , 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-прокси. Например, вы можете разместить ее в предварительном потоке прокси, чтобы она выполнялась при каждом запросе. Или вы можете разместить ее в нескольких потоках в 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, совершаемых приложениями за определенный интервал времени. Используя политики квот, вы можете, например, ограничить приложения одним запросом в минуту или 10 000 запросами в месяц.
Например, если квота определена как 10 000 сообщений в месяц, ограничение скорости начинается после 10 000-го сообщения. Не имеет значения, было ли учтено 10 000 сообщений в первый или последний день этого периода; дополнительные запросы не допускаются до тех пор, пока счетчик квоты автоматически не обнулится в конце указанного временного интервала или пока квота не будет явно сброшена с помощью политики «Сброс квоты» .
Разновидность функции Quota, называемая SpikeArrest, предотвращает всплески трафика, которые могут быть вызваны внезапным увеличением использования, ошибками в работе клиентов или вредоносными атаками. Для получения дополнительной информации о SpikeArrest см. политику SpikeArrest .
Квоты применяются к отдельным 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 приложения в запросе используется политика проверки ключа API под названием "VerifyAPIKey". Значения переменных берутся из настроек квот продукта 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">
Следующие характеристики являются специфическими для данной политики.
| Атрибут | Описание | По умолчанию | Присутствие |
|---|---|---|---|
| тип | Используйте этот параметр, чтобы определить, когда и как счетчик квот проверяет использование квот. Дополнительную информацию см. в разделе «Типы политики квот» . Если не указать Допустимые значения включают:
| календарь | Необязательный |
В следующей таблице описаны атрибуты, общие для всех родительских элементов политики:
| Атрибут | Описание | По умолчанию | Присутствие |
|---|---|---|---|
name | Внутреннее имя политики. Значение атрибута При необходимости используйте элемент | Н/Д | Необходимый |
continueOnError | Установите значение Установите значение | ЛОЖЬ | Необязательный |
enabled | Установите значение Установите значение | истинный | Необязательный |
async | Этот атрибут устарел. | ЛОЖЬ | Устарело |
Элемент <DisplayName>
Используйте в дополнение к атрибуту name , чтобы пометить политику в редакторе прокси-сервера пользовательского интерфейса управления другим именем на естественном языке.
<DisplayName>Policy Display Name</DisplayName>
| По умолчанию | Н/Д Если вы опустите этот элемент, будет использовано значение атрибута |
|---|---|
| Присутствие | Необязательный |
| Тип | Нить |
<Разрешить> элемент
Указывает предельное значение для квоты. Если счетчик политики достигнет этого предельного значения, последующие вызовы будут отклоняться до тех пор, пока счетчик не сбросится.
Ниже показаны три способа установки элемента <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 .
| По умолчанию: | Н/Д |
| Присутствие: | Необязательный |
| Тип: | Целое число |
Атрибуты
| Атрибут | Описание | По умолчанию | Присутствие |
|---|---|---|---|
| считать | Используйте это для указания количества сообщений в рамках квоты. Например, значение атрибута | 2000 | Необязательный |
| countRef | Используется для указания переменной потока, содержащей количество сообщений для квоты. | никто | Необязательный |
<Allow>/<Class> элемент
Элемент <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>
| По умолчанию: | никто |
| Присутствие: | Необходимый |
| Тип: | Целое число |
Атрибуты
| Атрибут | Описание | По умолчанию | Присутствие |
|---|---|---|---|
| ссылка | Используется для указания переменной потока, содержащей интервал для квоты. | никто | Необязательный |
<элемент TimeUnit>
Используется для указания единицы времени, применимой к квоте.
Например, Interval в 24 с единицей TimeUnit в hour означает, что квота будет рассчитываться в течение 24 часов.
<TimeUnit ref="verifyapikey.VerifyAPIKey.apiproduct.developer.quota.timeunit">month</TimeUnit>
| По умолчанию: | никто |
| Присутствие: | Необходимый |
| Тип: | Строка. Выберите значение из диапазона: |
Атрибуты
| Атрибут | Описание | По умолчанию | Присутствие |
|---|---|---|---|
| ссылка | Используется для указания переменной потока, содержащей единицу времени для квоты. ref имеет приоритет над явно заданным значением интервала. Если 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> для настройки политики создания уникальных счетчиков на основе переменной потока.
Если этот элемент не используется, политика применяет единый счетчик, который применяется к квоте.
Этот элемент также обсуждается в следующем сообщении сообщества Apigee: Идентификатор квоты в разных политиках .
<Identifier ref="verifyapikey.verify-api-key.client_id"/>
| По умолчанию: | Н/Д |
| Присутствие: | Необязательный |
| Тип: | Нить |
Атрибуты
| Атрибут | Описание | По умолчанию | Присутствие |
|---|---|---|---|
| ссылка | Указывает переменную потока, которая определяет счетчик, используемый для запроса. Идентификатором может быть заголовок HTTP, параметр запроса, параметр формы или содержимое сообщения, уникальное для каждого приложения, пользователя приложения, разработчика приложения, продукта API или другой характеристики. Наиболее часто используемый В некоторых случаях, когда | Н/Д | Необязательный |
<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 в миллисекундах, определяющее момент истечения срока действия квоты и начала нового интервала квотирования. Если тип политики квотирования — |
| ratelimit.{policy_name}.identifier | Нить | Только для чтения | Возвращает идентификатор клиента, прикрепленный к политике. |
| 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> . | build |
policies.ratelimit.FailedToResolveQuotaIntervalTimeUnitReference | 500 | Происходит, если элемент <TimeUnit> не определен в политике квот. Этот элемент является обязательным и используется для указания единицы времени, применимой к квоте. Интервал времени может составлять минуты, часы, дни, недели или месяцы. | build |
policies.ratelimit.InvalidMessageWeight | 500 | Происходит, если значение элемента <MessageWeight> , указанное через переменную потока, недопустимо (нецелое значение). | build |
policies.ratelimit.QuotaViolation | 500 | Превышен лимит квоты. | Н/Д |
Ошибки развертывания
| Название ошибки | Причина | Исправить |
|---|---|---|
InvalidQuotaInterval | Если интервал квоты, указанный в элементе <Interval> , не является целым числом, развертывание прокси-сервера API завершается неудачно. Например, если в элементе <Interval> указан интервал квоты, равный 0,1, развертывание прокси-сервера API завершится неудачей. | build |
InvalidQuotaTimeUnit | Если единица времени, указанная в элементе <TimeUnit> , не поддерживается, развертывание прокси-сервера API завершается неудачно. Поддерживаемые единицы времени: minute , hour , day , week и month . | build |
InvalidQuotaType | Если тип квоты, указанный атрибутом type в элементе <Quota> , недействителен, развертывание прокси-сервера API завершается неудачно. Поддерживаемые типы квот: default , calendar , flexi и rollingwindow . | build |
InvalidStartTime | Если формат времени, указанный в элементе <StartTime> , недействителен, развертывание прокси-сервера API завершается неудачно. Допустимый формат — yyyy-MM-dd HH:mm:ss , который соответствует формату даты и времени ISO 8601 . Например, если время, указанное в элементе <StartTime> , — 7-16-2017 12:00:00 , то развертывание прокси-сервера API завершается неудачей. | build |
StartTimeNotSupported | Если указан элемент <StartTime> , тип квоты которого не является типом calendar , то развертывание прокси-сервера API завершается неудачей. Элемент <StartTime> поддерживается только для типа calendar квоты. Например, если в элементе <Quota> для атрибута type установлено значение flexi или rolling window , развертывание прокси-сервера API завершится сбоем. | build |
InvalidTimeUnitForDistributedQuota | Если для элемента <Distributed> установлено значение true , а для элемента <TimeUnit> установлено значение second , развертывание прокси-сервера API завершается неудачей. Параметр timeunit second недопустим для распределенной квоты. | build |
InvalidSynchronizeIntervalForAsyncConfiguration | Если значение, указанное для элемента <SyncIntervalInSeconds> в элементе <AsynchronousConfiguration> в политике квот, меньше нуля, развертывание прокси-сервера API завершается неудачей. | build |
InvalidAsynchronizeConfigurationForSynchronousQuota | Если для значения элемента <AsynchronousConfiguration> установлено значение true в политике квот, которая также имеет асинхронную конфигурацию, определенную с помощью элемента <AsynchronousConfiguration> , то развертывание прокси-сервера API завершается неудачно. | build |
Переменные неисправности
Эти переменные устанавливаются, когда эта политика вызывает ошибку. Дополнительные сведения см. в разделе Что нужно знать об ошибках политики .
| Переменные | Где | Пример |
|---|---|---|
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>Схемы
Связанные темы
, Вы просматриваете документацию Apigee Edge .
Перейдите в документацию Apigee X.info
Что
Используйте политику квот, чтобы настроить количество запросов, которые API-прокси разрешает отправлять в течение определенного периода времени, например, минуты, часа, дня, недели или месяца. Вы можете установить одинаковую квоту для всех приложений, обращающихся к API-прокси, или установить квоту на основе следующих параметров:
- Продукт, содержащий API-прокси.
- Приложение запрашивает API.
- Разработчик приложения
- Многие другие критерии
Не используйте квоты для защиты от общих всплесков трафика. Для этого используйте политику предотвращения всплесков трафика. См. политику предотвращения всплесков трафика .
Видео
В этих видеороликах представлено ознакомление с управлением квотами с помощью политики квотирования:
Вступление (Новый подход)
Вступление (Classic Edge)
Динамическая квота
Распределенные и синхронные
Вес сообщения
Календарь
Складное окно
Флекси
Условная квота
Переменные потока
Обработка ошибок
Образцы
Эти примеры правил политики иллюстрируют, как начинать и заканчивать периоды действия квот:
Более динамичная квота
<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-прокси, содержащий политику квот, использует политику проверки API-ключа (VerifyAPIKey) с именем verify-api-key для проверки API-ключа, переданного в запросе. Затем политика квот обращается к переменным потока из политики VerifyAPIKey для чтения значений квот, установленных для API-продукта. Дополнительную информацию о переменных потока VerifyAPIKey см. в разделе «Политика проверки API-ключа» .
Другой вариант — установить пользовательские атрибуты для отдельных разработчиков или приложений, а затем считать эти значения в политике квот. Например, вы хотите установить разные значения квот для каждого разработчика. В этом случае вы устанавливаете пользовательские атрибуты для разработчика, содержащие лимит, единицу времени и интервал. Затем вы ссылаетесь на эти значения в политике квот, как показано ниже:
<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>
For a Quota with type set to calendar , you must define an explicit <StartTime> value. The time value is the GMT time, not local time. If you do not provide a <StartTime> value for a policy of type calendar , Edge issues an error.
The Quota counter for each app is refreshed based on the <StartTime> , <Interval> , and <TimeUnit> values. For this example, the Quota begins counting at 10:30 am GMT on February 18, 2017, and refreshes every 5 hours. Therefore, the next refresh is at 3:30 pm GMT on February 18, 2017.
Access Counter
<Quota name="QuotaPolicy"> <Interval>5</Interval> <TimeUnit>hour</TimeUnit> <Allow count="99"/> </Quota>
An API proxy has access to the flow variables set by the Quota policy. You can access these flow variables in the API proxy to perform conditional processing, monitor the policy as it gets close to the quota limit, return the current quota counter to an app, or for other reasons.
Because access the flow variables for the policy is based on the policies name attribute, for the policy above named QuotaPolicy you access its flow variables in the form:
-
ratelimit.QuotaPolicy.allowed.count: Allowed count. -
ratelimit.QuotaPolicy.used.count: Current counter value. -
ratelimit.QuotaPolicy.expiry.time: UTC time when the counter resets.
There are many other flow variables that you can access, as described below.
For example, you can use the following AssignMessage policy to return the values of Quota flow variables as response headers:
<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>
Use this sample code to enforce a quota of 10,000 calls per one hour. The policy resets the quota counter at the top of each hour. If the counter reaches the 10,000-call quota before the end of the hour, calls beyond 10,000 are rejected.
For example, if the counter starts at 2017-07-08 07:00:00 , then it resets to 0 at 2017-07-08 08:00:00 (1 hour from the start time). If the first message is received at 2017-07-08 07:35:28 and the message count reaches 10,000 before 2017-07-08 08:00:00 , calls beyond that count are rejected until the count resets at the top of the hour.
The counter reset time is based on the combination of <Interval> and <TimeUnit> . For example, if you set <Interval> to 12 for a <TimeUnit> of hour, then the counter resets every twelve hours. You can set <TimeUnit> to minute, hour, day, week, or month.
You can reference this policy in multiple places in your API proxy. For example, you could place it on the Proxy PreFlow so it is executed on on every request. Or, you could place it on multiple flows in the API proxy. If you use this policy in multiple places in the proxy, it maintains a single counter that is updated by all instances of the policy.
Alternatively, you can define multiple Quota policies in your API proxy. Each Quota policy maintains its own counter, based on the name attribute of the policy.
Set identifier
<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>
By default, a Quota policy defines a single counter for the API proxy, regardless of the origin of a request. Alternatively, you can use the <Identifier> attribute with a Quota policy to maintain separate counters based on the value of the <Identifier> attribute.
For example, use the <Identifier> tag to define separate counters for every client ID. On a request to your proxy, the client app then passes a header containing the clientID , as shown in the example above.
You can specify any flow variable to the <Identifier> attribute. For example, you could specify that a query param named id contains the unique identifier:
<Identifier ref="request.queryparam.id"/>
If you use the VerifyAPIKey policy to validate the API key, or the OAuthV2 policies with OAuth tokens, you can use information in the API key or token to define individual counters for the same Quota policy. For example, the following <Identifier> tag uses the client_id flow variable of a VerifyAPIKey policy named verify-api-key :
<Identifier ref="verifyapikey.verify-api-key.client_id"></Identifier>
Each unique client_id value now defines its own counter in the Quota policy.
Сорт
<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>You can set Quota limits dynamically by using a class-based Quota count. In this example, the quota limit is determined by the value of the developer_segment header passed with each request. That variable can have a value of platinum or silver . If the header has an invalid value, the policy returns a quota violation error.
About the Quota policy
A Quota is an allotment of request messages that an API proxy can handle over a time period, such as minute, hour, day, week, or month. The policy maintains counters that tally the number of requests received by the API proxy. This capability enables API providers to enforce limits on the number of API calls made by apps over an interval of time. Using Quota policies you can, for example, limit apps to 1 request per minute, or to 10,000 requests per month.
For example, if a Quota is defined as 10,000 messages per month, rate-limiting begins after the 10,000th message. It doesn't matter whether 10,000 messages were counted on the first day or the last day of that period; no additional requests area allowed until the Quota counter automatically resets at the end of the specified time interval, or until the Quota is explicitly reset using Reset Quota policy .
A variation on Quota called SpikeArrest prevents traffic spikes (or bursts) that can be caused by a sudden increase in usage, buggy clients, or malicious attacks. For more information on SpikeArrest, see Spike Arrest policy .
Quotas apply to individual API proxies and are not distributed among API proxies. For example, if you have three API proxies in an API product, a single quota is not shared across all three even if all three use the same quota policy configuration.
Quota policy types
The Quota policy supports several different types of policies: default, calendar , flexi , and rollingwindow . Each type defines when the quota counter starts and when it resets, as shown in the following table:
| Time Unit | Default (or null) reset | calendar reset | flexi reset |
|---|---|---|---|
| минута | Start of next minute | One minute after <StartTime> | One minute after first request |
| час | Top of next hour | One hour after <StartTime> | One hour after first request |
| день | Midnight GMT of the current day | 24 hours after <StartTime> | 24 hours after first request |
| неделя | Midnight GMT Sunday at the end of the week | One week after <StartTime> | One week after first request |
| месяц | Midnight GMT of the last day of the month | One month (28 days) after <StartTime> | One month (28 days) after first request |
For type="calendar" , you must specify the value of <StartTime> .
The table does not list the value for the rollingwindow type. Rolling window quotas work by setting the size of a quota "window", such as a one hour or one day window. When a new request comes in, the policy determines if the quota has been exceeded in the past "window" of time.
For example, you define a two hour window that allows 1000 requests. A new request comes in at 4:45 PM.The policy calculates the quota count for the past two hour window, meaning the number of requests since 2:45 PM. If the quota limit has not been exceeded in that two-hour window, then the request is allowed.
One minute later, at 4:46 PM, another request comes in. Now the policy calculates the quota count since 2:46 PM to determine if the limit has been exceeded.
For the rollingwindow type, the counter never resets, but is recalculated on each request.
Understanding quota counters
By default, a Quota policy maintains a single counter, regardless of how many times you reference it in an API proxy. The name of the quota counter is based on the name attribute of the policy.
For example, you create a Quota policy named MyQuotaPolicy with a limit of 5 requests and place it on multiple flows (Flow A, B, and C) in the API proxy. Even though it is used in multiple flows, it maintains a single counter that is updated by all instances of the policy:
- Flow A is executed -> MyQuotaPolicy is executed and its counter = 1
- Flow B is executed -> MyQuotaPolicy is executed and its counter = 2
- Flow A is executed -> MyQuotaPolicy is executed and its counter = 3
- Flow C is executed -> MyQuotaPolicy is executed and its counter = 4
- Flow A is executed -> MyQuotaPolicy is executed and its counter = 5
The next request to any of the three flows is rejected because the quota counter has reached its limit.
Using the same Quota policy in more than one place in an API proxy flow, which can unintentionally cause Quota to run out faster than you expected, is an anti-pattern described in The Book of Apigee Edge Antipatterns .
Alternatively, you can define multiple Quota policies in your API proxy and use a different policy in each flow. Each Quota policy maintains its own counter, based on the name attribute of the policy.
Or, use the <Class> or <Identifier> elements in the Quota policy to define multiple, unique counters in a single policy. By using these elements, a single policy can maintain different counters based on the app making the request, the app developer making the request, a client ID or other client identifier, and more. See the examples above for more information on using the <Class> or <Identifier> elements.
Time notation
All Quota times are set to the Coordinated Universal Time (UTC) time zone.
Quota time notation follows the international standard date notation defined in International Standard ISO 8601 .
Dates are defined as year, month, and day, in the following format: YYYY-MM-DD . For example, 2015-02-04 represents February 4, 2015.
Time of day is defined as hours, minutes, and seconds in the following format: hours:minutes:seconds . For example, 23:59:59 represents the time one second before midnight.
Note that two notations, 00:00:00 and 24:00:00 , are available to distinguish the two midnights that can be associated with one date. Therefore 2015-02-04 24:00:00 is the same date and time as 2015-02-05 00:00:00 . The latter is usually the preferred notation.
Getting quota settings from the API product configuration
You can set quota limits in API product configurations. Those limits don't automatically enforce quota. Instead, you can reference product quota settings in a quota policy. Here are some advantages of setting a quota on the product for quota policies to reference:
- Quota policies can use a uniform setting across all API proxies in the API product.
- You can make runtime changes to the quota setting on an API product, and quota policies that reference the value automatically have updated quota values.
For more information on using quota settings from an API product, see the "Dynamic Quota" example above. .
For info on configuring API products with quota limits, see Create API products .
Ссылка на элемент
Following are elements and attributes you can configure on this policy. Note that some element combinations are mutually exclusive or not required. See the samples for specific usage. The verifyapikey.VerifyAPIKey.apiproduct.* variables below are available by default when a Verify API Key policy called "VerifyAPIKey" is used to check the app's API key in the request. The variable values come from the quota settings on the API product that the key is associated with, as described in Getting quota settings from the API product configuration .
<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> attributes
<Quota async="false" continueOnError="false" enabled="true" name="Quota-3" type="calendar">
Следующие характеристики являются специфическими для данной политики.
| Атрибут | Описание | По умолчанию | Присутствие |
|---|---|---|---|
| тип | Use to determine when and how the quota counter checks quota usage. See Quota policy types for more information. If you omit a Valid values include:
| календарь | Необязательный |
В следующей таблице описаны атрибуты, общие для всех родительских элементов политики:
| Атрибут | Описание | По умолчанию | Присутствие |
|---|---|---|---|
name | Внутреннее имя политики. Значение атрибута При необходимости используйте элемент | Н/Д | Необходимый |
continueOnError | Установите значение Установите значение | ЛОЖЬ | Необязательный |
enabled | Установите значение Установите значение | истинный | Необязательный |
async | Этот атрибут устарел. | ЛОЖЬ | Устарело |
Элемент <DisplayName>
Используйте в дополнение к атрибуту name , чтобы пометить политику в редакторе прокси-сервера пользовательского интерфейса управления другим именем на естественном языке.
<DisplayName>Policy Display Name</DisplayName>
| По умолчанию | Н/Д Если вы опустите этот элемент, будет использовано значение атрибута |
|---|---|
| Присутствие | Необязательный |
| Тип | Нить |
<Allow> element
Specifies the count limit for the quota. If the counter for the policy reaches this limit value, subsequent calls are rejected until the counter resets.
Shown below are three ways to set the <Allow> element:
<Allow count="2000"/>
<Allow countRef="verifyapikey.VerifyAPIKey.apiproduct.developer.quota.limit"/>
<Allow count="2000" countRef="verifyapikey.VerifyAPIKey.apiproduct.developer.quota.limit"/>
If you specify both count and countRef , then countRef gets the priority. If countRef does not resolve at runtime, then the value of count is used.
| По умолчанию: | Н/Д |
| Присутствие: | Необязательный |
| Тип: | Целое число |
Атрибуты
| Атрибут | Описание | По умолчанию | Присутствие |
|---|---|---|---|
| считать | Use to specify a message count for the quota. For example, a | 2000 | Необязательный |
| countRef | Use to specify a flow variable containing the message count for a quota. | никто | Необязательный |
<Allow>/<Class> element
The <Class> element lets you conditionalize the value of the <Allow> element based on the value of a flow variable. For each different <Allow> child tag of <Class> , the policy maintains a different counter.
To use the <Class> element, specify a flow variable using the ref attribute to the <Class> tag. Edge then uses the value of the flow variable to select one of the <Allow> child tags to determine the allowed count of the policy. Edge matches the value of the flow variable to the class attribute of the <Allow> tag, as shown below:
<Allow> <Class ref="request.queryparam.time_variable"> <Allow class="peak_time" count="5000"/> <Allow class="off_peak_time" count="1000"/> </Class> </Allow>
In this example, the current quota counter is determined by the value of the time_variable query param passed with each request. That variable can have a value of peak_time or off_peak_time . If the query param contains an invalid value, the policy returns a quota violation error.
| По умолчанию: | Н/Д |
| Присутствие: | Необязательный |
| Тип: | Н/Д |
Атрибуты
| Атрибут | Описание | По умолчанию | Присутствие |
|---|---|---|---|
| ссылка | Use to specify a flow variable containing the quota class for a quota. | никто | Необходимый |
<Allow>/<Class>/<Allow> element
The <Allow> element specifies the limit for a quota counter defined by the <Class> element. For each different <Allow> child tag of <Class> , the policy maintains a different counter.
Например:
<Allow> <Class ref="request.queryparam.time_variable"> <Allow class="peak_time" count="5000"/> <Allow class="off_peak_time" count="1000"/> </Class> </Allow>
In this example, the Quota policy maintains two quota counters named of peak_time and off_peak_time .
| По умолчанию: | Н/Д |
| Присутствие: | Необязательный |
| Тип: | Н/Д |
Атрибуты
| Атрибут | Описание | По умолчанию | Присутствие |
|---|---|---|---|
| сорт | Defines the name of the quota counter. | никто | Необходимый |
| считать | Specifies the quota limit for the counter. | никто | Необходимый |
<Interval> element
Use to specify an integer (for example, 1, 2, 5, 60, and so on) that will be paired with the TimeUnit you specify (minute, hour, day, week, or month) to determine a time period during which Edge calculates quota use.
For example, an Interval of 24 with a TimeUnit of hour means that the quota will be calculated over the course of 24 hours.
<Interval ref="verifyapikey.VerifyAPIKey.apiproduct.developer.quota.interval">1</Interval>
| По умолчанию: | никто |
| Присутствие: | Необходимый |
| Тип: | Целое число |
Атрибуты
| Атрибут | Описание | По умолчанию | Присутствие |
|---|---|---|---|
| ссылка | Use to specify a flow variable containing the interval for a quota. | никто | Необязательный |
<TimeUnit> element
Use to specify the unit of time applicable to the quota.
For example, an Interval of 24 with a TimeUnit of hour means that the quota will be calculated over the course of 24 hours.
<TimeUnit ref="verifyapikey.VerifyAPIKey.apiproduct.developer.quota.timeunit">month</TimeUnit>
| По умолчанию: | никто |
| Присутствие: | Необходимый |
| Тип: | String. Select from |
Атрибуты
| Атрибут | Описание | По умолчанию | Присутствие |
|---|---|---|---|
| ссылка | Use to specify a flow variable containing the time unit for a quota. ref takes precedence over an explicit interval value. If the ref does not resolve at runtime, then the value is used. | никто | Необязательный |
<StartTime> element
When type is set to calendar, specifies the date and time when the quota counter will begin counting, regardless of whether any requests have been received from any apps.
Например:
<StartTime>2017-7-16 12:00:00</StartTime>
| По умолчанию: | никто |
| Присутствие: | Required when type is set to calendar . |
| Тип: | String in ISO 8601 date and time format. |
<Distributed> element
An installation of Edge can use one or more Message Processors to process requests. Set this element to true to specify that the policy should maintain a central counter and continuously synchronize it across all Message Processors. The message processors can be across availability zones and/or regions.
If you use the default value of false , then you might exceed your quota because the count for each Message Processor is not shared:
<Distributed>true</Distributed>
To guarantee that the counters are synchronized, and updated on every request, set <Distributed> and <Synchronous> to true:
<Distributed>true</Distributed> <Synchronous>true</Synchronous>
| По умолчанию: | ЛОЖЬ |
| Присутствие: | Необязательный |
| Тип: | Логический |
<Synchronous> element
Set to true to update a distributed quota counter synchronously. This means that the update to the counter are made at the same time the quota is checked on a request to the API. Set to true if it is essential that you not allow any API calls over the quota.
Set to false to update the quota counter asynchronously. This means that it is possible that some API calls exceeding the quota will go through, depending on when the quota counter in the central repository is asynchronously updated. However, you will not face the potential performance impacts associated with synchronous updates.
The default asynchronous update interval is 10 seconds. Use the AsynchronousConfiguration element to configure this asynchronous behavior.
<Synchronous>false</Synchronous>
| По умолчанию: | ЛОЖЬ |
| Присутствие: | Необязательный |
| Тип: | Логический |
<AsynchronousConfiguration> element
Configures the synchronization interval amongst distributed quota counters when the policy configuration element <Synchronous> is either not present or present and set to false .
You can synchronize either after a time period or a message count, using either the SyncIntervalInSeconds or SyncMessageCount child elements. They are mutually exclusive. For example,
<AsynchronousConfiguration> <SyncIntervalInSeconds>20</SyncIntervalInSeconds> </AsynchronousConfiguration>
или
<AsynchronousConfiguration> <SyncMessageCount>5</SyncMessageCount> </AsynchronousConfiguration>
| По умолчанию: | SyncIntervalInSeconds = 10 seconds |
| Присутствие: | Optional; ignored when <Synchronous> is set to true . |
| Тип: | Сложный |
<AsynchronousConfiguration>/<SyncIntervalInSeconds> element
Use this to override the default behavior in which asynchronous updates are performed after an interval of 10 seconds.
<AsynchronousConfiguration> <SyncIntervalInSeconds>20</SyncIntervalInSeconds> </AsynchronousConfiguration>
The sync interval must be >= 10 seconds as described in the Limits topic.
| По умолчанию: | 10 |
| Присутствие: | Необязательный |
| Тип: | Целое число |
<AsynchronousConfiguration>/<SyncMessageCount> element
Specifies the number of requests across all Apigee message processors between quota updates.
<AsynchronousConfiguration> <SyncMessageCount>5</SyncMessageCount> </AsynchronousConfiguration>
This example specifies that the quota count is updated every 5 requests across each Apigee Edge message processor.
| По умолчанию: | н/д |
| Присутствие: | Необязательный |
| Тип: | Целое число |
<Identifier> element
Use the <Identifier> element to configure the policy to create unique counters based on a flow variable.
If you don't use this element, the policy uses a single counter that is applied against the quota.
This element is also discussed in the following Apigee Community post: Quota identifier across different policies .
<Identifier ref="verifyapikey.verify-api-key.client_id"/>
| По умолчанию: | Н/Д |
| Присутствие: | Необязательный |
| Тип: | Нить |
Атрибуты
| Атрибут | Описание | По умолчанию | Присутствие |
|---|---|---|---|
| ссылка | Specifies a flow variable that identifies the counter to use for the request. The identifier can be an HTTP header, query parameter, form parameter, or message content that is unique to each app, app user, app developer, API product, or other characteristic. The In some circumstances, Quota settings must be retrieved where no | Н/Д | Необязательный |
<MessageWeight> element
Use to specify the weight assigned to each message. Use message weight to increase impact of request messages that, for example, consume more computational resources than others.
For example, you want to count POST messages as being twice as "heavy" or expensive, as GET messages. Therefore, you set the MessageWeight to 2 for a POST and 1 for a GET. You can even set the MessageWeight to 0 so the request does not affect the counter. In this example, if the quota is 10 messages per minute and the MessageWeight for POST requests is 2 , then the quota will permits 5 POST requests in any 10 minute interval. Any additional request, POST or GET, before the counter resets are rejected.
A value representing MessageWeight must be specified by a flow variable, and can be extracted from HTTP headers, query parameters, an XML or JSON request payload, or any other flow variable. For example, you set it in a header named weight :
<MessageWeight ref="message_weight"/>
| По умолчанию: | Н/Д |
| Присутствие: | Необязательный |
| Тип: | Целое число |
Переменные потока
The following predefined Flow variables are automatically populated when a Quota policy executes. For more information about Flow variables, see Variables reference .
| Переменные | Тип | Разрешения | Описание |
|---|---|---|---|
| ratelimit.{policy_name}.allowed.count | Длинный | Только для чтения | Returns the allowed quota count |
| ratelimit.{policy_name}.used.count | Длинный | Только для чтения | Returns the current quota used within a quota interval |
| ratelimit.{policy_name}.available.count | Длинный | Только для чтения | Returns the available quota count in the quota interval |
| ratelimit.{policy_name}.exceed.count | Длинный | Только для чтения | Returns 1 after the quota is exceeded. |
| ratelimit.{policy_name}.total.exceed.count | Длинный | Только для чтения | Returns 1 after the quota is exceeded. |
| ratelimit.{policy_name}.expiry.time | Длинный | Только для чтения | Returns the UTC time in milliseconds which determines when the quota expires and new quota interval starts. When the Quota policy type is |
| ratelimit.{policy_name}.identifier | Нить | Только для чтения | Returns the (client) identifier reference attached to the policy |
| ratelimit.{policy_name}.class | Нить | Только для чтения | Returns the class associated with the client identifier |
| ratelimit.{policy_name}.class.allowed.count | Длинный | Только для чтения | Returns the allowed quota count defined in the class |
| ratelimit.{policy_name}.class.used.count | Длинный | Только для чтения | Returns the used quota within a class |
| ratelimit.{policy_name}.class.available.count | Длинный | Только для чтения | Returns the available quota count in the class |
| ratelimit.{policy_name}.class.exceed.count | Длинный | Только для чтения | Returns the count of requests that exceeds the limit in the class in the current quota interval |
| ratelimit.{policy_name}.class.total.exceed.count | Длинный | Только для чтения | Returns the total count of requests that exceeds the limit in the class across all quota intervals, so it is the sum of class.exceed.count for all quota intervals. |
| ratelimit.{policy_name}.failed | Логический | Только для чтения | Indicates whether or not the policy failed (true or false). |
Ссылка на ошибку
В этом разделе описаны коды ошибок и сообщения об ошибках, которые возвращаются, а также переменные ошибок, которые устанавливаются Edge, когда эта политика вызывает ошибку. Эту информацию важно знать, если вы разрабатываете правила обработки ошибок. Дополнительные сведения см. в разделах Что нужно знать об ошибках политики и Обработка ошибок .
Ошибки выполнения
Эти ошибки могут возникнуть при выполнении политики.
| Код неисправности | Статус HTTP | Причина | Исправить |
|---|---|---|---|
policies.ratelimit.FailedToResolveQuotaIntervalReference | 500 | Происходит, если элемент <Interval> не определен в политике квот. Этот элемент является обязательным и используется для указания интервала времени, применимого к квоте. Временной интервал может составлять минуты, часы, дни, недели или месяцы, как определено элементом <TimeUnit> . | build |
policies.ratelimit.FailedToResolveQuotaIntervalTimeUnitReference | 500 | Происходит, если элемент <TimeUnit> не определен в политике квот. Этот элемент является обязательным и используется для указания единицы времени, применимой к квоте. Интервал времени может составлять минуты, часы, дни, недели или месяцы. | build |
policies.ratelimit.InvalidMessageWeight | 500 | Происходит, если значение элемента <MessageWeight> , указанное через переменную потока, недопустимо (нецелое значение). | build |
policies.ratelimit.QuotaViolation | 500 | Превышен лимит квоты. | Н/Д |
Ошибки развертывания
| Название ошибки | Причина | Исправить |
|---|---|---|
InvalidQuotaInterval | Если интервал квоты, указанный в элементе <Interval> , не является целым числом, развертывание прокси-сервера API завершается неудачно. Например, если в элементе <Interval> указан интервал квоты, равный 0,1, развертывание прокси-сервера API завершится неудачей. | build |
InvalidQuotaTimeUnit | Если единица времени, указанная в элементе <TimeUnit> , не поддерживается, развертывание прокси-сервера API завершается неудачно. Поддерживаемые единицы времени: minute , hour , day , week и month . | build |
InvalidQuotaType | Если тип квоты, указанный атрибутом type в элементе <Quota> , недействителен, развертывание прокси-сервера API завершается неудачно. Поддерживаемые типы квот: default , calendar , flexi и rollingwindow . | build |
InvalidStartTime | Если формат времени, указанный в элементе <StartTime> , недействителен, развертывание прокси-сервера API завершается неудачно. Допустимый формат — yyyy-MM-dd HH:mm:ss , который соответствует формату даты и времени ISO 8601 . Например, если время, указанное в элементе <StartTime> , — 7-16-2017 12:00:00 , то развертывание прокси-сервера API завершается неудачей. | build |
StartTimeNotSupported | Если указан элемент <StartTime> , тип квоты которого не является типом calendar , то развертывание прокси-сервера API завершается неудачей. Элемент <StartTime> поддерживается только для типа calendar квоты. Например, если в элементе <Quota> для атрибута type установлено значение flexi или rolling window , развертывание прокси-сервера API завершится сбоем. | build |
InvalidTimeUnitForDistributedQuota | Если для элемента <Distributed> установлено значение true , а для элемента <TimeUnit> установлено значение second , развертывание прокси-сервера API завершается неудачей. Параметр timeunit second недопустим для распределенной квоты. | build |
InvalidSynchronizeIntervalForAsyncConfiguration | Если значение, указанное для элемента <SyncIntervalInSeconds> в элементе <AsynchronousConfiguration> в политике квот, меньше нуля, развертывание прокси-сервера API завершается неудачей. | build |
InvalidAsynchronizeConfigurationForSynchronousQuota | Если для значения элемента <AsynchronousConfiguration> установлено значение true в политике квот, которая также имеет асинхронную конфигурацию, определенную с помощью элемента <AsynchronousConfiguration> , то развертывание прокси-сервера API завершается неудачно. | build |
Переменные неисправности
Эти переменные устанавливаются, когда эта политика вызывает ошибку. Дополнительные сведения см. в разделе Что нужно знать об ошибках политики .
| Переменные | Где | Пример |
|---|---|---|
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>Схемы
Связанные темы
Comparing Quota, Spike Arrest, and Concurrent Rate Limit Policies