Вы просматриваете документацию Apigee Edge .
Перейти к документации Apigee X. info
Что
Используйте политику квот, чтобы настроить количество сообщений-запросов, которые API-прокси разрешает обрабатывать в течение определённого периода времени, например, минуты, часа, дня, недели или месяца. Вы можете установить квоту одинаковой для всех приложений, обращающихся к API-прокси, или установить её на основе:
- Продукт, содержащий API-прокси
- Приложение запрашивает API
- Разработчик приложения
- Многие другие критерии
Не используйте квоту для защиты от пиков общего трафика. Для этого используйте политику Spike Arrest. См. раздел «Политика Spike Arrest» .
Видео
В этих видеороликах показано управление квотами с помощью политики квот:
Вступление (New 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, содержащий политику квот, использует политику 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), а не местное. Если значение <StartTime> для политики типа calendar не указано, Edge выдаст ошибку.
Счётчик квоты для каждого приложения обновляется на основе значений <StartTime> , <Interval> и <TimeUnit> . В этом примере отсчёт квоты начинается в 10:30 по Гринвичу 18 февраля 2017 года и обновляется каждые 5 часов. Таким образом, следующее обновление произойдёт в 15:30 по Гринвичу 18 февраля 2017 года.
Счетчик доступа
<Quota name="QuotaPolicy"> <Interval>5</Interval> <TimeUnit>hour</TimeUnit> <Allow count="99"/> </Quota>
Прокси-сервер API имеет доступ к переменным потока, заданным политикой квот. Вы можете получить доступ к этим переменным потока в прокси-сервере API для выполнения условной обработки, отслеживания политики по мере приближения к пределу квоты, возврата текущего счетчика квоты приложению или для других целей.
Поскольку доступ к переменным потока для политики основан на атрибуте name политики, для политики с указанным выше именем QuotaPolicy доступ к ее переменным потока осуществляется в форме:
-
ratelimit.QuotaPolicy.allowed.count: Разрешенное количество. -
ratelimit.QuotaPolicy.used.count: Текущее значение счетчика. -
ratelimit.QuotaPolicy.expiry.time: время UTC, когда счетчик сбрасывается.
Существует множество других переменных потока, к которым вы можете получить доступ, как описано ниже.
Например, вы можете использовать следующую политику AssignMessage для возврата значений переменных потока квот в качестве заголовков ответа:
<AssignMessage async="false" continueOnError="false" enabled="true" name="ReturnQuotaVars"> <AssignTo createNew="false" type="response"/> <Set> <Headers> <Header name="QuotaLimit">{ratelimit.QuotaPolicy.allowed.count}</Header> <Header name="QuotaUsed">{ratelimit.QuotaPolicy.used.count}</Header> <Header name="QuotaResetUTC">{ratelimit.QuotaPolicy.expiry.time}</Header> </Headers> </Set> <IgnoreUnresolvedVariables>false</IgnoreUnresolvedVariables> </AssignMessage>
Первый запрос
<Quota name="MyQuota"> <Interval>1</Interval> <TimeUnit>hour</TimeUnit> <Allow count="10000"/> </Quota>
Используйте этот пример кода для установки квоты в 10 000 вызовов в час. Политика сбрасывает счётчик квоты в начале каждого часа. Если счётчик достигает квоты в 10 000 вызовов до окончания часа, вызовы, превышающие 10 000, отклоняются.
Например, если счётчик начинается в 2017-07-08 07:00:00 , то он обнуляется в 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, выполняемых приложениями за определённый период времени. С помощью политик квот можно, например, ограничить количество запросов для приложений одним запросом в минуту или 10 000 запросов в месяц.
Например, если квота установлена на уровне 10 000 сообщений в месяц, ограничение скорости начнётся после 10 000-го сообщения. Неважно, были ли 10 000 сообщений подсчитаны в первый или последний день этого периода; дополнительные запросы не допускаются до тех пор, пока счётчик квоты не будет автоматически сброшен по истечении указанного периода или пока квота не будет явно сброшена с помощью политики сброса квоты .
SpikeArrest, разновидность квоты, предотвращает скачки трафика, которые могут быть вызваны резким увеличением нагрузки, ошибками в работе клиентов или вредоносными атаками. Подробнее о SpikeArrest см. в разделе «Политика Spike Arrest» .
Квоты применяются к отдельным прокси-серверам API и не распределяются между ними. Например, если в одном продукте API есть три прокси-сервера API, одна квота не будет распределена между всеми тремя, даже если все три используют одинаковую конфигурацию политики квот.
Типы политики квот
Политика квот поддерживает несколько различных типов политик: default, calendar , flexi и rollingwindow . Каждый тип определяет время запуска и сброса счётчика квот, как показано в следующей таблице:
| Единица времени | Сброс по умолчанию (или нулевой) | сброс календаря | гибкий сброс |
|---|---|---|---|
| минута | Начало следующей минуты | Через минуту после <StartTime> | Через минуту после первого запроса |
| час | Начало следующего часа | Через час после <StartTime> | Через час после первого запроса |
| день | Полночь по Гринвичу текущего дня | 24 часа после <StartTime> | 24 часа после первого запроса |
| неделя | Полночь по Гринвичу в воскресенье в конце недели | Через неделю после <StartTime> | Через неделю после первого запроса |
| месяц | Полночь по Гринвичу последнего дня месяца | Один месяц (28 дней) после <StartTime> | Один месяц (28 дней) после первого запроса |
Для type="calendar" необходимо указать значение <StartTime> .
В таблице не указано значение для типа rollingwindow . Квоты 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, которое может непреднамеренно привести к более быстрому исчерпанию квоты, чем ожидалось, является антипаттерном, описанным в книге 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">
Следующие атрибуты являются специфичными для этой политики.
| Атрибут | Описание | По умолчанию | Присутствие |
|---|---|---|---|
| тип | Используйте этот параметр, чтобы определить, когда и как счётчик квот будет проверять использование квоты. Подробнее см. в разделе «Типы политики квот» . Если не указать Допустимые значения включают:
| календарь | Необязательный |
В следующей таблице описаны атрибуты, общие для всех родительских элементов политики:
| Атрибут | Описание | По умолчанию | Присутствие |
|---|---|---|---|
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 не разрешён во время выполнения, используется это значение. | никто | Необязательный |
Элемент <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"/>
| По умолчанию: | Н/Д |
| Присутствие: | Необязательный |
| Тип: | Целое число |
Переменные потока
Следующие предопределенные переменные Flow автоматически заполняются при выполнении политики квот. Подробнее о переменных Flow см. в разделе «Справочник переменных» .
| Переменные | Тип | Разрешения | Описание |
|---|---|---|---|
| ограничение_скорости.{название_политики}.разрешено.количество | Длинный | Только для чтения | Возвращает разрешенное количество квот |
| ограничение_скорости.{название_политики}.использование.количество | Длинный | Только для чтения | Возвращает текущую квоту, используемую в пределах интервала квоты. |
| ограничение скорости.{название_политики}.доступно.количество | Длинный | Только для чтения | Возвращает доступное количество квот в интервале квот. |
| ограничение скорости.{название_политики}.превысить.количество | Длинный | Только для чтения | Возвращает 1 после превышения квоты. |
| ограничение_скорости.{название_политики}.всего.превышения.количество | Длинный | Только для чтения | Возвращает 1 после превышения квоты. |
| ограничение скорости.{название_политики}.expiry.time | Длинный | Только для чтения | Возвращает время UTC в миллисекундах, которое определяет момент истечения срока действия квоты и начала нового интервала квоты. Если тип политики квоты — |
| ограничение скорости.{название_политики}.идентификатор | Нить | Только для чтения | Возвращает ссылку на идентификатор (клиента), прикрепленную к политике. |
| ограничение скорости.{название_политики}.класс | Нить | Только для чтения | Возвращает класс, связанный с идентификатором клиента. |
| ограничение_скорости.{название_политики}.класс.разрешено.количество | Длинный | Только для чтения | Возвращает разрешенное количество квот, определенное в классе |
| ограничение_скорости.{название_политики}.класс.использование.количество | Длинный | Только для чтения | Возвращает использованную квоту внутри класса |
| ограничение скорости.{название_политики}.класс.доступный.количество | Длинный | Только для чтения | Возвращает доступное количество квот в классе |
| ограничение скорости.{имя_политики}.класс.превысить.количество | Длинный | Только для чтения | Возвращает количество запросов, превышающих лимит в классе в текущем интервале квоты. |
| ограничение_скорости.{имя_политики}.класс.всего.превышения.количество | Длинный | Только для чтения | Возвращает общее количество запросов, превышающих лимит в классе по всем интервалам квот, поэтому оно представляет собой сумму class.exceed.count для всех интервалов квот. |
| ограничение скорости.{название_политики}.не удалось | Булевое значение | Только для чтения | Указывает, была ли выполнена политика неверно (истина или ложь). |
Ссылка на ошибку
This section describes the fault codes and error messages that are returned and fault variables that are set by Edge when this policy triggers an error. This information is important to know if you are developing fault rules to handle faults. To learn more, see What you need to know about policy errors and Handling faults.
Runtime errors
These errors can occur when the policy executes.
| Fault code | HTTP status | Cause | Fix |
|---|---|---|---|
policies.ratelimit.FailedToResolveQuotaIntervalReference |
500 | Occurs if the <Interval> element is not defined within the Quota policy. This element
is mandatory and used to specify the interval of time applicable to the quota. The time interval
can be minutes, hours, days, weeks, or months as defined with the <TimeUnit> element. |
build |
policies.ratelimit.FailedToResolveQuotaIntervalTimeUnitReference |
500 | Occurs if the <TimeUnit> element is not defined within the Quota policy. This element
is mandatory and used to specify the unit of time applicable to the quota. The time interval
can be in minutes, hours, days, weeks, or months. |
build |
policies.ratelimit.InvalidMessageWeight |
500 | Occurs if the value of the <MessageWeight> element specified through a flow variable
is invalid (a non-integer value). |
build |
policies.ratelimit.QuotaViolation |
500 | The quota limit was exceeded. | N/A |
Deployment errors
| Error name | Cause | Fix |
|---|---|---|
InvalidQuotaInterval |
If the quota interval specified in the <Interval> element is not
an integer, then the deployment of the API proxy fails. For example, if the quota interval
specified is 0.1 in the <Interval> element, then the deployment of the
API proxy fails.
|
build |
InvalidQuotaTimeUnit |
If the time unit specified in the <TimeUnit> element is unsupported,
then the deployment of the API proxy fails. The supported time units are minute,
hour, day, week, and month.
|
build |
InvalidQuotaType |
If the type of the quota specified by the type attribute in the <Quota>
element is invalid, then the deployment of the API proxy fails. The
supported quota types are default, calendar, flexi, and rollingwindow.
|
build |
InvalidStartTime |
If the format of the time specified in the <StartTime> element is
invalid, then the deployment of the API proxy fails. The valid format is yyyy-MM-dd HH:mm:ss,
which is the ISO 8601 date and time format. For
example, if the time specified in the <StartTime> element is
7-16-2017 12:00:00 then the deployment of the API proxy fails.
|
build |
StartTimeNotSupported |
If the <StartTime> element is specified whose quota type is not
calendar type, then the deployment of the API proxy fails. The <StartTime> element is
supported only for the calendar quota type. For example, if the type attribute is set
to flexi or rolling window in the <Quota> element, then the
deployment of the API proxy fails.
|
build |
InvalidTimeUnitForDistributedQuota |
If the <Distributed> element is set to true and the <TimeUnit> element is set to
second then the deployment of the API proxy fails. The timeunit second is invalid for
a distributed quota. |
build |
InvalidSynchronizeIntervalForAsyncConfiguration |
If the value specified for the <SyncIntervalInSeconds> element within the
<AsynchronousConfiguration> element in a Quota policy is less than zero, then the
deployment of the API proxy fails. |
build |
InvalidAsynchronizeConfigurationForSynchronousQuota |
If the value of the <AsynchronousConfiguration> element is set to true in a Quota policy, which also
has asynchronous configuration defined using the <AsynchronousConfiguration> element, then
the deployment of the API proxy fails. |
build |
Fault variables
These variables are set when this policy triggers an error. For more information, see What you need to know about policy errors.
| Variables | Where | Example |
|---|---|---|
fault.name="fault_name" |
fault_name is the name of the fault, as listed in the Runtime errors table above. The fault name is the last part of the fault code. | fault.name Matches "QuotaViolation" |
ratelimit.policy_name.failed |
policy_name is the user-specified name of the policy that threw the fault. | ratelimit.QT-QuotaPolicy.failed = true |
Example error response
{ "fault":{ "detail":{ "errorcode":"policies.ratelimit.QuotaViolation" }, "faultstring":"Rate limit quota violation. Quota limit exceeded. Identifier : _default" } }
Example fault rule
<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>Схемы
Похожие темы
Сравнение политик квот, блокировки пиковых нагрузок и ограничения одновременной скорости