Политики в отношении квот

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

Что

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

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

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

Видео

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

Введение (новая версия Edge)

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

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

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

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

Календарь

Скользящее окно

Flexi

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

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

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

Примеры

В приведенных ниже примерах кода показано, как начинать и заканчивать периоды квоты, используя:

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

<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>. Значение времени указано по Гринвичу, а не по местному времени. Если вы не укажете значение <StartTime> для правила типа calendar, Edge выдаст ошибку.

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

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

<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 можно возвращать значения переменных потока Quota в виде заголовков ответа:

<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 звонков до конца часа, звонки сверх этого количества будут отклонены.

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

Время сброса счетчика определяется сочетанием значений <Interval> и <TimeUnit>. Например, если для параметра <Interval> задано значение 12, а для параметра <TimeUnit> – "час", счетчик будет сбрасываться каждые 12 часов. Вместо <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>

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

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

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

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

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

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

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

Класс

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

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

Типы правил в отношении квот

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

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

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

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

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

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

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

Счетчики квот

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

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

  • Выполняется поток А -> выполняется MyQuotaPolicy, счетчик = 1
  • Выполняется поток B -> выполняется MyQuotaPolicy, счетчик = 2
  • Выполняется поток А -> выполняется 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 приложения в запросе используется правило Verify API Key с названием 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>

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

Ниже перечислены атрибуты, относящиеся к этим правилам.

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

Используется, чтобы определить, когда и как счетчик квоты проверяет использование квоты. Подробнее о типах правил в отношении квот…

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

Действительные значения:

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

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

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

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

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

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

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

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

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

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

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

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

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

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

Элемент <DisplayName>

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

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

Н/Д

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

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

Элемент <Allow>

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

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

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

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

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

Атрибуты

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

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

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

2000 Необязательно
countRef

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

Нет Необязательно

Элемент <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. Если параметр запроса содержит недопустимое значение, правило возвращает ошибку нарушения квоты.

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

Атрибуты

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

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

Нет Обязательно

Элемент <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.

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

Атрибуты

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

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

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

Элемент <Interval>

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

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

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

Атрибуты

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

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

Нет Необязательно

Элемент <TimeUnit>

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

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

<TimeUnit ref="verifyapikey.VerifyAPIKey.apiproduct.developer.quota.timeunit">month</TimeUnit>
По умолчанию: Нет
Присутствие Обязательно
Тип:

Строка. Выберите один из вариантов: minute, hour, day, week или month.

Атрибуты

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

Элемент <StartTime>

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

Пример:

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

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

Элемент <Distributed>

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

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

<Distributed>true</Distributed>

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

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

Элемент <Synchronous>

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

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

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

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

Элемент <AsynchronousConfiguration>

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

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

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

или

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

Территория с ограниченным доступом

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

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

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

Интервал синхронизации должен быть не менее 10 секунд, как описано в разделе Ограничения.

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

Целое число

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

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

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

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

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

Целое число

Элемент <Identifier>

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

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

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

Этот элемент также обсуждается в следующем сообщении сообщества Apigee: Quota identifier across different policies.

<Identifier ref="verifyapikey.verify-api-key.client_id"/>
По умолчанию: Н/Д
Присутствие Необязательно
Тип:

Строка

Атрибуты

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

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

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

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

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

Элемент <MessageWeight>

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

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

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

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

Целое число

Переменные процесса

При выполнении правила квоты автоматически заполняются следующие предопределенные переменные потока. Подробнее о переменных потока…

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

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

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

ratelimit.{policy_name}.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 Логическое значение Только чтение

Указывает, не удалось ли применить правило (true или false).

Справочник по ошибкам

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

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

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

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

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

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

Переменные ошибок

Эти переменные задаются, когда правило вызывает ошибку. Подробнее о нарушениях правил…

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

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

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

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

<FaultRules>
    <FaultRule name="Quota Errors">
        <Step>
            <Name>JavaScript-1</Name>
            <Condition>(fault.name Matches "QuotaViolation") </Condition>
        </Step>
        <Condition>ratelimit.Quota-1.failed=true</Condition>
    </FaultRule>
</FaultRules>

Схемы

Статьи по теме

Правила ResetQuota

Правила в отношении функции SpikeArrest

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