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

Политика Spike Arrest защищает от скачков трафика с помощью элемента <Rate>
. Этот элемент ограничивает количество запросов, обрабатываемых API-прокси и отправляемых на бэкэнд, защищая от задержек производительности и простоев.
Элемент <SpikeArrest>
Определяет политику ареста Spike.
Значение по умолчанию | См. вкладку «Политика по умолчанию» ниже. |
Необходимый? | Необязательный |
Тип | Сложный объект |
Родительский элемент | н/д |
Дочерние элементы | <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 | Н/Д | Необходимый | Внутреннее имя политики. Значение атрибута При необходимости используйте элемент |
continueOnError | ЛОЖЬ | Необязательный | Установите значение «false», чтобы возвращать ошибку при сбое политики. Это ожидаемое поведение для большинства политик. Установите значение «true», чтобы выполнение потока продолжалось даже после сбоя политики. |
enabled | истинный | Необязательный | Установите значение «true», чтобы применить политику. Установите значение «false», чтобы «отключить» политику. Политика не будет применяться, даже если она остается присоединенной к потоку. |
async | ЛОЖЬ | Устаревший | Этот атрибут устарел. |
Примеры
В следующих примерах показаны некоторые способы использования политики Spike Arrest:
Пример 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>
Эффективная скорость составляет 300pm, что означает, что новый токен добавляется в ведро каждые 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>
Значение переменной потока должно быть в форме 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: http://community.apigee.com/questions/2807/how-does-the-edge-quota-policy-work-when-no-identi.html .
<MessageWeight>
Указывает вес, определенный для каждого сообщения. Вес сообщения изменяет влияние одного запроса на расчет скорости Spike Arrest. Вес сообщения может быть любой переменной потока, например, заголовком 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". Вы можете использовать Если вы указываете значение для | Необязательный | н/д |
<UseEffectiveCount>
Распределяет количество Spike Arrest по процессорам сообщений (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
, если элемент опущен в вашей политике Spike Arrest.
Значение по умолчанию | ЛОЖЬ |
Необходимый? | Необязательный |
Тип | Булев |
Родительский элемент | <SpikeArrest> |
Дочерние элементы | Никто |
В следующей таблице описаны атрибуты элемента <UseEffectiveCount>
:
Атрибут | Описание | По умолчанию | Присутствие |
---|---|---|---|
ref | Определяет переменную, содержащую значение <UseEffectiveCount> . Это может быть любая переменная потока, например параметр HTTP-запроса, заголовок или содержимое тела сообщения. Для получения дополнительной информации см. Справочник переменных потока . Вы также можете задать пользовательские переменные с помощью политики JavaScript или политики AssignMessage . | н/д | Необязательный |
Эффект <UseEffectiveCount>
зависит от его значения:
-
true
: Предел скорости скачков MP равен<Rate>
, деленный на текущее количество MP в одном модуле. Совокупный предел равен значению<Rate>
. Когда MP динамически добавляются (или удаляются), их индивидуальные пределы скорости скачков будут увеличиваться (или уменьшаться), но совокупный предел останется прежним. -
false
(это значение по умолчанию, если оно опущено): предел скорости скачков каждого MP — это просто значение его<Rate>
. Совокупный предел — это сумма скоростей всех MP. Когда MP добавляются (или удаляются), их индивидуальные пределы скорости скачков останутся прежними, но совокупный предел увеличится (или уменьшится).
В следующей таблице показано влияние <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 . | build |
policies.ratelimit.InvalidMessageWeight | 500 | Эта ошибка возникает, если значение, указанное для элемента <MessageWeight> через переменную потока, является недопустимым (нецелое значение). | build |
policies.ratelimit.SpikeArrestViolation | 429 | Превышен лимит скорости. |
Ошибки развертывания
Эти ошибки могут возникнуть при развертывании прокси-сервера, содержащего эту политику.
Название ошибки | Причина | Исправить |
---|---|---|
InvalidAllowedRate | Если частота блокировки пиков, указанная в элементе <Rate> политики ареста пиков, не является целым числом или если в качестве суффикса скорости нет ps или pm , то развертывание прокси-сервера API завершается неудачно. | build |
Переменные неисправности
Эти переменные устанавливаются при возникновении ошибки во время выполнения. Дополнительные сведения см. в разделе Что нужно знать об ошибках политики .
Переменные | Где | Пример |
---|---|---|
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 для превышения ограничения скорости, установленного политикой квоты или Spike Arrest, — 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.
Похожие темы
- Политика квот : Политика квот для ограничения трафика для отдельных клиентов.
- Ограничение скорости для обзора ограничения скорости
- Сравнение политик квот и SpikeArrest
- Рабочие образцы API-прокси