Правила SpikeArrest

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

Значок Spike Arrest в интерфейсе Edge

Правило Spike Arrest защищает от скачков трафика с помощью элемента <Rate>. Этот элемент ограничивает количество запросов, обрабатываемых прокси-сервером API и отправляемых в бэкенд, чтобы предотвратить снижение производительности и простои.

Элемент <SpikeArrest>

Определяет правило Spike Arrest.

Значение по умолчанию Вкладка Правила по умолчанию приведена ниже.
Обязательно? Необязательно
Тип Объект Complex
Родительский элемент –
Дочерние элементы <Identifier>
<MessageWeight>
<Rate> (обязательно)
<UseEffectiveCount>

Синтаксис

Элемент <SpikeArrest> имеет следующий синтаксис:

<SpikeArrest
  continueOnError="[false|true]"
  enabled="[true|false]"
  name="policy_name"
>
  <DisplayName>display_name</DisplayName>
  <Properties/>
  <Identifier ref="flow_variable"/>
  <MessageWeight ref="flow_variable"/>
  <Rate ref="flow_variable">rate[pm|ps]</Rate>
  <UseEffectiveCount>[false|true]</UseEffectiveCount>
</SpikeArrest>

Правило по умолчанию

В следующем примере показаны настройки по умолчанию, которые задаются при добавлении правила Spike Arrest в поток в интерфейсе Edge:

<SpikeArrest async="false" continueOnError="false" enabled="true" name="Spike-Arrest-1">
  <DisplayName>Spike Arrest-1</DisplayName>
  <Properties/>
  <Identifier ref="request.header.some-header-name"/>
  <MessageWeight ref="request.header.weight"/>
  <Rate>30ps</Rate>
  <UseEffectiveCount>true</UseEffectiveCount>
</SpikeArrest>

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

Атрибут По умолчанию Необходимый? Описание
name Н/Д Необходимый

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

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

continueOnError ЛОЖЬ Необязательный Установите значение «false», чтобы возвращать ошибку при сбое политики. Это ожидаемое поведение для большинства политик. Установите значение «true», чтобы выполнение потока продолжалось даже после сбоя политики.
enabled истинный Необязательный Установите значение «true», чтобы применить политику. Установите значение «false», чтобы «отключить» политику. Политика не будет применяться, даже если она остается присоединенной к потоку.
async ЛОЖЬ Устаревший Этот атрибут устарел.

Примеры

Ниже приведены примеры использования правила "Защита от скачков".

Пример 1

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

<SpikeArrest name="Spike-Arrest-1">
  <Rate>5ps</Rate>
</SpikeArrest>

Согласно правилу, разрешается отправлять не более одного запроса каждые 200 миллисекунд (1000/5).

Пример 2

В следующем примере задана скорость 300 символов в минуту:

<SpikeArrest async="false" continueOnError="false" enabled="true" name="SpikeArreast">
  <DisplayName>SpikeArreast</DisplayName>
  <Rate>300pm</Rate>
</SpikeArrest>

Эффективная скорость составляет 300 запросов в минуту, то есть новый токен добавляется в корзину каждые 200 миллисекунд. Размер сегмента всегда составляет 10% от значения messagesPerPeriod. Таким образом, при значении messagesPerPeriod, равном 300, размер сегмента составляет 30 токенов.

Пример 3

В следующем примере запросы ограничены до 12 в минуту (один запрос каждые пять секунд, или 60/12):

<SpikeArrest name="Spike-Arrest-1">
  <Rate>12pm</Rate>
  <Identifier ref="client_id" />
  <MessageWeight ref="request.header.weight" />
</SpikeArrest>

Кроме того, элемент <MessageWeight> принимает пользовательское значение (заголовок weight), которое корректирует вес сообщений для определенных приложений или клиентов. Это позволяет дополнительно контролировать ограничение скорости для объектов, идентифицированных с помощью элемента <Identifier>.

Пример 4

В следующем примере показано, как настроить Spike Arrest на поиск значения времени выполнения, заданного в запросе, который передается как переменная потока request.header.runtime_rate:

<SpikeArrest name="Spike-Arrest-1">
  <Rate ref="request.header.runtime_rate" />
</SpikeArrest>

Значение переменной потока должно быть в формате intpm или intps.

Чтобы попробовать этот пример, выполните запрос, похожий на следующий:

curl http://myorg-myenv.apigee.net/price -H 'runtime_rate:30ps'

Ссылка на дочерний элемент

В этом разделе описаны дочерние элементы <SpikeArrest>.

<DisplayName>

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

Элемент <DisplayName> используется во всех правилах.

Значение по умолчанию –
Обязательно? Необязательное поле. Если вы не укажете <DisplayName>, будет использовано значение атрибута name правила.
Тип Строка
Родительский элемент <PolicyElement>
Дочерние элементы Нет

Элемент <DisplayName> имеет следующий синтаксис:

Синтаксис

<PolicyElement>
  <DisplayName>policy_display_name</DisplayName>
  ...
</PolicyElement>

Пример

<PolicyElement>
  <DisplayName>My Validation Policy</DisplayName>
</PolicyElement>

У элемента <DisplayName> нет атрибутов или дочерних элементов.

<Identifier>

Позволяет выбрать способ группировки запросов, чтобы правило Spike Arrest можно было применять на основе клиента. Например, вы можете сгруппировать запросы по идентификатору разработчика. В этом случае запросы каждого разработчика будут учитываться при расчете его собственной доли запросов, отклоненных из-за скачков трафика, а не всех запросов к прокси-серверу.

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

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

Значение по умолчанию –
Обязательно? Необязательно
Тип Строка
Родительский элемент <SpikeArrest>
Дочерние элементы Нет

Синтаксис

<SpikeArrest
  continueOnError="[false|true]"
  enabled="[true|false]"
  name="policy_name"
>
  <Identifier ref="flow_variable"/>
</SpikeArrest>
        

Пример 1

В приведенном ниже примере применяется правило Spike Arrest для идентификатора разработчика.

<SpikeArrest name="Spike-Arrest-1">
  <Identifier ref="developer.id"/>
  <Rate>42pm</Rate/>
</SpikeArrest>

В таблице ниже описаны атрибуты элемента <Identifier>.

Атрибут Описание По умолчанию Тип поля
ref Определяет переменную, по которой функция Spike Arrest группирует входящие запросы. Вы можете использовать любую переменную потока, чтобы указать уникального клиента, например те, которые доступны с правилом VerifyAPIKey. Вы также можете задать пользовательские переменные с помощью правила JavaScript или правила AssignMessage. – Обязательно

Этот элемент также обсуждается в следующем сообщении на форуме Apigee: Quota Identifier Across Different Policies.

<MessageWeight>

Указывает вес, заданный для каждого сообщения. Вес сообщения влияет на то, как один запрос учитывается при расчете показателя Spike Arrest. Вес сообщения может быть любой переменной потока, например заголовком HTTP, параметром запроса, параметром формы или содержимым тела сообщения. Вы также можете использовать специальные переменные с помощью правила JavaScript или правила AssignMessage.

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

Например, если значение параметра Spike Arrest <Rate> равно 10pm, а приложение отправляет запросы с весом 2, то от этого клиента разрешено получать только пять сообщений в минуту, поскольку каждый запрос считается как два.

Значение по умолчанию –
Обязательно? Необязательно
Тип Целое число
Родительский элемент <SpikeArrest>
Дочерние элементы Нет

Синтаксис

<SpikeArrest
  continueOnError="[false|true]"
  enabled="[true|false]"
  name="policy_name"
>
  <MessageWeight ref="flow_variable"/>
</SpikeArrest>

Пример 1

В следующем примере запросы ограничены 12 в минуту (один запрос каждые пять секунд, или 60/12):

<SpikeArrest name="Spike-Arrest-1">
  <Rate>12pm</Rate>
  <Identifier ref="client_id" />
  <MessageWeight ref="request.header.weight" />
</SpikeArrest>

В этом примере <MessageWeight> принимает специальное значение (заголовок weight в запросе), которое корректирует веса сообщений для определенных клиентов. Это позволяет дополнительно контролировать ограничение скорости для объектов, которые идентифицируются с помощью элемента <Identifier>.

В таблице ниже описаны атрибуты элемента <MessageWeight>.

Атрибут Описание Тип поля По умолчанию
ref Определяет переменную потока, которая содержит вес сообщения для определенного клиента. Это может быть любая переменная потока, например параметр запроса HTTP, заголовок или содержимое тела сообщения. Дополнительную информацию можно найти в справочнике по переменным потока. Вы также можете задать собственные переменные с помощью правила JavaScript или правила AssignMessage. Обязательно Н/Д

<Rate>

Указывает скорость, с которой нужно ограничивать пики трафика, задавая количество запросов, разрешенных в минуту или секунду. Вы также можете использовать этот элемент вместе с <Identifier> и <MessageWeight>, чтобы плавно регулировать трафик во время выполнения, принимая значения от клиента.

Значение по умолчанию –
Обязательно? Обязательно
Тип Целое число
Родительский элемент <SpikeArrest>
Дочерние элементы Нет

Синтаксис

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

  • Статическое значение, которое вы указываете в теле элемента <Rate>.
  • Значение переменной, которое может быть передано клиентом. Имя переменной потока можно указать с помощью атрибута ref.
<SpikeArrest
  continueOnError="[false|true]"
  enabled="[true|false]"
  name="policy_name"
>
  <Rate ref="flow_variable">rate[pm|ps]</Rate>
</SpikeArrest>

Допустимые значения параметра rate (определенные как значение переменной или в теле элемента) должны соответствовать следующему формату:

  • intps (количество запросов в секунду, сглаженное по интервалам в миллисекундах)
  • intpm (количество запросов в минуту, сглаженное по интервалам в секундах)

Значение int должно быть положительным целым числом, отличным от нуля.

Пример 1

В приведенном ниже примере задана скорость пять запросов в секунду.

<SpikeArrest name="Spike-Arrest-1">
  <Rate>5ps</Rate>
</SpikeArrest>

Согласно правилу, разрешается отправлять не более одного запроса каждые 200 миллисекунд (1000/5).

Пример 2

В примере ниже задано ограничение в 12 запросов в минуту:

<SpikeArrest async="false" continueOnError="false" enabled="true" name="SpikeArreast">
  <DisplayName>SpikeArreast</DisplayName>
  <Rate>300pm</Rate>
</SpikeArrest>

В этом примере правило ограничивает частоту до одного запроса каждые пять секунд (60/12).

В таблице ниже описаны атрибуты элемента <Rate>.

Атрибут Описание Тип поля По умолчанию
ref Определяет переменную потока, которая задает скорость. Это может быть любая переменная потока, например параметр HTTP-запроса, заголовок или содержимое тела сообщения, или значение, например KVM. Дополнительную информацию можно найти в справочнике по переменным потока.

Вы также можете использовать специальные переменные с помощью правила JavaScript или правила AssignMessage.

Если вы зададите и ref, и тело этого элемента, будет применено значение ref, и оно будет иметь приоритет, когда переменная потока задана в запросе. (Обратная ситуация возникает, когда переменная, указанная в ref, не задана в запросе.)

Пример:

<Rate ref="request.header.custom_rate">1pm</Rate>

В этом примере, если клиент не передает заголовок custom_rate, то для прокси-сервера API устанавливается ограничение в один запрос в минуту для всех клиентов. Если клиент передает заголовок custom_rate, то для всех клиентов на прокси-сервере устанавливается ограничение в 10 запросов в секунду, пока не будет отправлен запрос без заголовка custom_rate.

Вы можете использовать <Identifier>, чтобы группировать запросы и применять специальные тарифы для разных типов клиентов.

Если вы укажете значение для ref, но не зададите ставку в теле элемента <Rate> и клиент не передаст значение, то правило Spike Arrest выдаст ошибку.

Необязательно –
В таблице ниже описаны атрибуты Rate, определяющие поведение при ограничении трафика.
Атрибут Описание
messagesPerPeriod Указывает количество сообщений, разрешенных за определенный период. Например, если правило настроено на 10 запросов в секунду, значение messagesPerPeriod будет равно 10.
periodInMicroseconds Определяет период времени в микросекундах, за который рассчитывается значение messagesPerPeriod. Для конфигурации "10ps" это значение будет равно 1 000 000, что эквивалентно одной секунде.
maxBurstMessageCount Максимальное количество запросов, которые можно разрешить мгновенно или в течение короткого периода времени в начале нового интервала.

<UseEffectiveCount>

Распределяет количество срабатываний функции Spike Arrest между процессорами сообщений при использовании групп с автомасштабированием.

Синтаксис

<SpikeArrest
  continueOnError="[false|true]"
  enabled="[true|false]"
  name="policy_name"
>
  <UseEffectiveCount>[false|true]</UseEffectiveCount>
</SpikeArrest>

Пример 1

В приведенном ниже примере для параметра <UseEffectiveCount> устанавливается значение true.

<SpikeArrest name='Spike-Arrest-1'>
  <Rate>40ps</Rate>
  <UseEffectiveCount>true</UseEffectiveCount>
</SpikeArrest>

Элемент <UseEffectiveCount> необязателен. Если элемент отсутствует в правиле Spike Arrest, по умолчанию используется значение false.

Значение по умолчанию False
Обязательно? Необязательно
Тип Логическое значение
Родительский элемент <SpikeArrest>
Дочерние элементы Нет

В таблице ниже описаны атрибуты элемента <UseEffectiveCount>.

Атрибут Описание По умолчанию Тип поля
ref Определяет переменную, которая содержит значение <UseEffectiveCount>. Это может быть любая переменная потока, например параметр запроса HTTP, заголовок или содержимое тела сообщения. Дополнительную информацию можно найти в справочнике по переменным потока. Вы также можете задать собственные переменные с помощью правила JavaScript или правила AssignMessage. – Необязательно

Действие переменной <UseEffectiveCount> зависит от ее значения:

  • true: ограничение скорости скачков для MP – это <Rate>, деленное на текущее количество MP в том же пакете. Общий лимит – <Rate>. При динамическом добавлении или удалении точек доступа к интернету индивидуальные ограничения скорости передачи данных для них будут увеличиваться или уменьшаться, но общее ограничение останется прежним.
  • false: ограничение скорости для каждого MP – это просто значение его свойства <Rate>. Общий лимит – это сумма скоростей всех поставщиков контента. При добавлении или удалении МП лимит скорости для каждого из них остается прежним, но общий лимит увеличивается или уменьшается.

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

Например, если вы введете значение 30pm (30 запросов в минуту), При тестировании вы можете подумать, что можно отправить 30 запросов за одну секунду, если они приходят в течение минуты. Однако правила применяются не так. Если подумать, 30 запросов за одну секунду в некоторых случаях можно считать мини-пиком.

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

    Например, если указано значение 30pm, то сглаживание будет выполняться следующим образом:
    60 секунд (1 минута) / 30pm = интервалы в 2 секунды, или 1 запрос разрешен каждые 2 секунды. Второй запрос, отправленный в течение двух секунд после первого, будет отклонен. Кроме того, 31-й запрос в течение минуты будет отклонен.

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

    Например, если задано значение 10ps, то интервал между запросами будет рассчитываться следующим образом:
    1000 миллисекунд (1 секунда) / 10ps = 100 миллисекунд, то есть разрешен 1 запрос каждые 100 миллисекунд. Второй запрос, отправленный в течение 100 мс после первого, будет отклонен. Кроме того, не будет выполнен 11-й запрос за одну секунду.

В таблице ниже показано, как параметр <UseEffectiveCount> влияет на эффективный лимит скорости для каждого MP:

Значение <UseEffectiveCount>
false false false true true true
Количество депутатов 8 4 2 8 4 2
Значение <Rate> 10 10 10 40 40 40
Эффективная цена за мегапиксель 10 10 10 5 10 20
Общий лимит 80 40 20 40* 40* 40*
* Как в <Rate>.

В этом примере обратите внимание, что при уменьшении количества МП с 4 до 2 и значении <UseEffectiveCount>, равном false, эффективная ставка за МП остается прежней (10). Но если <UseEffectiveCount> равно true, то эффективная цена за МП увеличивается с 10 до 20, когда количество МП уменьшается с 4 до 2.

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

При выполнении правила Spike Arrest заполняется следующая переменная потока:

Переменная Тип Разрешение Описание
ratelimit.policy_name.failed Логическое значение Только чтение Указывает, не удалось ли применить правило (true или false).

Дополнительную информацию можно найти в справочнике по переменным потока.

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

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

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

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

Код ошибки Статус HTTP Причина Исправить
policies.ratelimit.FailedToResolveSpikeArrestRate 500 Эта ошибка возникает, если ссылку на переменную, содержащую настройку скорости, в элементе <Rate> не удается преобразовать в значение в правиле Spike Arrest. Этот обязательный элемент используется для указания скорости подавления пиков в формате intpm или intps.
policies.ratelimit.InvalidMessageWeight 500 Эта ошибка возникает, если значение, указанное для элемента <MessageWeight> с помощью переменной потока, является недопустимым (не целым числом).
policies.ratelimit.SpikeArrestViolation 429

Превышено ограничение на частоту запросов.

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

Эти ошибки могут возникать при развертывании прокси-сервера, содержащего это правило.

Название ошибки Причина Исправить
InvalidAllowedRate Если указанное в элементе <Rate> правила Spike Arrest значение частоты не является целым числом или не имеет суффикса ps или pm, развертывание прокси-сервера API завершится неудачей.

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

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

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

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

Ниже приведен пример ответа с ошибкой:

{  
   "fault":{  
      "detail":{  
         "errorcode":"policies.ratelimit.SpikeArrestViolation"
      },
      "faultstring":"Spike arrest violation. Allowed rate : 10ps"
   }
}

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

Ниже приведен пример правила обработки ошибок для ошибки SpikeArrestViolation:

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

Текущий код статуса HTTP для превышения ограничения скорости, заданного правилом квоты или защиты от пиковых нагрузок, – 429 (Слишком много запросов). Чтобы изменить код статуса HTTP на 500 (Внутренняя ошибка сервера), задайте для свойства features.isHTTPStatusTooManyRequestEnabled значение false, используя API Обновление свойств организации.

Пример:

curl -u email:password -X POST -H "Content-type:application/xml" http://api.enterprise.apigee.com/v1/organizations/myorg -d \
"<Organization type="trial" name="MyOrganization">
    <Properties>
        <Property name="features.isHTTPStatusTooManyRequestEnabled">true</Property>
        . . .
    </Properties>
</Organization>"

Схемы

Каждый тип правил определяется схемой XML (.xsd). Схемы правил доступны на GitHub.

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