Политика SpikeArrest

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

Значок Spike Arrest в пользовательском интерфейсе Edge

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

<SpikeArrest> элемент

Определяет политику ареста с применением шипов.

Значение по умолчанию См. вкладку «Политика по умолчанию» ниже.
Необходимый? Необязательный
Тип Сложный объект
Родительский элемент н/д
Дочерние элементы <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>

Политика по умолчанию

В следующем примере показаны настройки по умолчанию, которые применяются при добавлении политики предотвращения скачков активности в ваш поток в пользовательском интерфейсе 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>

Значение переменной flow должно быть в формате int pm или int ps .

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

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 применялась в зависимости от клиента. Например, вы можете сгруппировать запросы по идентификатору разработчика, в этом случае запросы каждого разработчика будут учитываться в его собственном коэффициенте 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: Идентификатор квоты в рамках различных политик .

<MessageWeight>

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

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

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

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

  • int ps (количество запросов в секунду, сглаженное до интервалов в миллисекунды)
  • int pm (количество запросов в минуту, сглаженное до интервалов в секунды)

Значение 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-прокси составляет 1 запрос в минуту для всех клиентов. Если клиент передает заголовок "custom_rate", то ограничение скорости становится равным 10 запросам в секунду для всех клиентов на прокси — до тех пор, пока не будет отправлен запрос без заголовка "custom_rate".

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

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

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

<UseEffectiveCount>

Распределяет количество остановок всплесков активности между обработчиками сообщений (MP) при использовании групп автоматического масштабирования.

Синтаксис

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

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

В следующей таблице описаны атрибуты элемента <UseEffectiveCount> :

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

Эффект параметра <UseEffectiveCount> зависит от его значения:

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

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

Например, предположим, вы задали частоту 30 запросов в минуту (30 запросов в минуту). В ходе тестирования вы можете подумать, что сможете отправить 30 запросов за 1 секунду, если они поступят в течение минуты. Но политика не обеспечивает соблюдение этого параметра. Если подумать, 30 запросов за 1 секунду в некоторых средах могут считаться небольшим всплеском.

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

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

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

    Например, значение 10 пс сглаживается следующим образом:
    1000 миллисекунд (1 секунда) / 10 пс = 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> .

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

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

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

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

Для получения более подробной информации см. справочник по переменным потока .

Ссылка на ошибку

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

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

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

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

Превышен лимит скорости.

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

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

Название ошибки Причина Исправить
InvalidAllowedRate Если частота блокировки пиков, указанная в элементе <Rate> политики ареста пиков, не является целым числом или если в качестве суффикса скорости нет 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.

Связанные темы