Вы просматриваете документацию 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 для всех интервалов квот. |
| ограничение скорости.{название_политики}.не удалось | Булевое значение | Только для чтения | Указывает, была ли выполнена политика неверно (истина или ложь). |
Ссылка на ошибку
В этом разделе описаны коды ошибок и сообщения об ошибках, которые возвращаются, а также переменные ошибок, которые устанавливаются 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>Схемы
Похожие темы
Сравнение политик квот, блокировки пиковых нагрузок и ограничения одновременной скорости