Вы просматриваете документацию Apigee Edge .
Перейдите в документацию Apigee X.info
Политика защиты от всплесков трафика (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 | Н/Д | Необходимый | Внутреннее имя политики. Значение атрибута При необходимости используйте элемент |
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>
Use in addition to the name attribute to label the policy in the
management UI proxy editor with a different, more natural-sounding name.
The <DisplayName> element is common to all policies.
| Default Value | n/a |
| Required? | Optional. If you omit <DisplayName>, the value of the
policy's name attribute is used |
| Type | String |
| Parent Element | <PolicyElement> |
| Child Elements | None |
The <DisplayName> element uses the following syntax:
Syntax
<PolicyElement> <DisplayName>policy_display_name</DisplayName> ... </PolicyElement>
Example
<PolicyElement> <DisplayName>My Validation Policy</DisplayName> </PolicyElement>
The <DisplayName> element has no attributes or child elements.
<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 . Если вы определяете и Например: <Rate ref="request.header.custom_rate">1pm</Rate> В этом примере, если клиент не передает заголовок "custom_rate", то скорость обработки запросов через API-прокси составляет 1 запрос в минуту для всех клиентов. Если клиент передает заголовок "custom_rate", то ограничение скорости становится равным 10 запросам в секунду для всех клиентов на прокси — до тех пор, пока не будет отправлен запрос без заголовка "custom_rate". Вы можете использовать Если вы указываете значение для | Необязательный | н/д |
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 ). |
Для получения более подробной информации см. справочник по переменным потока .
Ссылка на ошибку
This section describes the fault codes and error messages that are returned and fault variables that are set by Edge when this policy triggers an error. This information is important to know if you are developing fault rules to handle faults. To learn more, see What you need to know about policy errors and Handling faults.
Runtime errors
These errors can occur when the policy executes.
| Fault code | HTTP status | Cause | Fix |
|---|---|---|---|
policies.ratelimit.FailedToResolveSpikeArrestRate |
500 |
This error occurs if the reference to the variable containing the rate setting
within the <Rate> element cannot be resolved to a value within the Spike Arrest
policy. This element is mandatory and used to specify the spike arrest rate in
the form of intpm or intps. |
build |
policies.ratelimit.InvalidMessageWeight |
500 |
This error occurs if the value specified for the <MessageWeight> element through
a flow variable is invalid (a non-integer value). |
build |
policies.ratelimit.SpikeArrestViolation |
429 |
The rate limit was exceeded. |
Deployment errors
These errors can occur when you deploy a proxy containing this policy.
| Error name | Cause | Fix |
|---|---|---|
InvalidAllowedRate |
If the spike arrest rate specified in the <Rate> element of the Spike Arrest
Policy is not an integer or if the rate does not have ps or pm as a suffix,
then the deployment of the API proxy fails. |
build |
Fault variables
These variables are set when a runtime error occurs. For more information, see What you need to know about policy errors.
| Variables | Where | Example |
|---|---|---|
fault.name="fault_name" |
fault_name is the name of the fault, as listed in the Runtime errors table above. The fault name is the last part of the fault code. | fault.name Matches "SpikeArrestViolation" |
ratelimit.policy_name.failed |
policy_name is the user-specified name of the policy that threw the fault. | ratelimit.SA-SpikeArrestPolicy.failed = true |
Example error response
Shown below is an example error response:
{ "fault":{ "detail":{ "errorcode":"policies.ratelimit.SpikeArrestViolation" }, "faultstring":"Spike arrest violation. Allowed rate : 10ps" } }
Example fault rule
Shown below is an example fault rule to handle a SpikeArrestViolation fault:
<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.
Связанные темы
- Политика квот : Политика квот, ограничивающая трафик на отдельных клиентах.
- Ограничение скорости для обзора ограничений скорости
- Сравнение политики квотирования и политики предотвращения резкого увеличения количества сообщений о нарушениях.
- Рабочие примеры API-прокси