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

Политика Spike Arrest защищает от скачков трафика с помощью элемента <Rate>
. Этот элемент регулирует количество запросов, обрабатываемых прокси-сервером API и отправляемых на серверную часть, защищая от задержек производительности и простоев.
Как работает Spike Arrest
Думайте о Spike Arrest как о способе общей защиты от скачков трафика, а не как о способе ограничения трафика определенным количеством запросов. Ваши API и серверная часть могут обрабатывать определенный объем трафика, а политика Spike Arrest помогает сглаживать трафик до желаемого общего объема.
Поведение Spike Arrest во время выполнения отличается от того, что вы могли бы ожидать от введенных вами буквальных значений в минуту или в секунду.
Например, предположим, что вы вводите скорость 15:00 (30 запросов в минуту). При тестировании вы могли бы подумать, что можете отправить 30 запросов за 1 секунду, если они приходят в течение минуты. Но это не то, как политика обеспечивает соблюдение настроек. Если подумать, 30 запросов в течение 1 секунды в некоторых средах можно считать небольшим скачком.
Что тогда происходит на самом деле? Чтобы предотвратить скачкообразное поведение, Spike Arrest сглаживает количество разрешенных полных запросов, разделяя ваши настройки на более мелкие интервалы:
- Поминутные ставки сглаживаются до полных запросов, разрешенных с интервалом в несколько секунд .
Например, 15:00 сглаживается следующим образом:
60 секунд (1 минута) / 30 часов вечера = 2-секундные интервалы или разрешен 1 запрос каждые 2 секунды. Второй запрос в течение 2 секунд завершится неудачей. Кроме того, 31-й запрос в течение минуты завершится неудачей. - Посекундные ставки сглаживаются до полных запросов, разрешенных с интервалом в миллисекунды .
Например, 10ps сглаживается следующим образом:
1000 миллисекунд (1 секунда) / 10 пс = интервалы в 100 миллисекунд или разрешен 1 запрос каждые 100 миллисекунд. Второй запрос в течение 100 мс завершится неудачей. Кроме того, 11-й запрос в течение секунды завершится неудачей.
И еще: 1 запрос * количество процессоров сообщений.
По умолчанию Spike Arrest не распространяется, если вы не включите <UseEffectiveCount>
. Это означает, что количество запросов не синхронизируется между MP. При наличии более чем одного процессора сообщений, особенно с циклической конфигурацией, каждый из них независимо обрабатывает собственное регулирование Spike Arrest. При использовании одного процессора сообщений скорость 30 вечера сглаживает трафик до 1 запроса каждые 2 секунды (60/30). При использовании двух процессоров сообщений (по умолчанию для облака Edge) это число удваивается до 2 запросов каждые 2 секунды. Поэтому умножьте рассчитанное количество полных запросов за интервал на количество процессоров сообщений, чтобы получить общий коэффициент арестов.
Разница между пиковым арестом и квотой
Политика квот настраивает количество сообщений с запросами, которые клиентскому приложению разрешено отправлять в API в течение часа, дня, недели или месяца. Политика квот устанавливает ограничения на потребление клиентских приложений, поддерживая распределенный счетчик, который подсчитывает входящие запросы.
Используйте Quota для обеспечения соблюдения бизнес-контрактов или соглашений об уровне обслуживания с разработчиками и партнерами, а не для оперативного управления трафиком. Используйте Spike Arrest для защиты от внезапных всплесков трафика API. См. также «Сравнение политик квот, пикового ареста и ограничения одновременных ставок» .
Видео
В этих видеороликах показано, как защитить ваши API от скачков трафика с помощью политики Spike Arrest:
Элемент <SpikeArrest>
Определяет политику Spike Arrest.
Значение по умолчанию | См. вкладку «Политика по умолчанию» ниже. |
Необходимый? | Необязательный |
Тип | Сложный объект |
Родительский элемент | н/д |
Дочерние элементы | <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:
В следующем примере устанавливается скорость пять в секунду:
<SpikeArrest name="Spike-Arrest-1"> <Rate>5ps</Rate> </SpikeArrest>
Политика сглаживает скорость до одного запроса каждые 200 миллисекунд (1000/5).
В следующем примере устанавливается скорость 12 в минуту:
<SpikeArrest name="Spike-Arrest-1"> <Rate>12pm</Rate> </SpikeArrest>
В этом примере политика сглаживает скорость до одного запроса каждые пять секунд (60/12).
В следующем примере количество запросов ограничено 12 в минуту (разрешен один запрос каждые пять секунд или 60/12):
<SpikeArrest name="Spike-Arrest-1"> <Rate>12pm</Rate> <Identifier ref="client_id" /> <MessageWeight ref="request.header.weight" /> </SpikeArrest>
Кроме того, элемент <MessageWeight>
принимает пользовательское значение (заголовок weight
), которое регулирует вес сообщения для конкретных приложений или клиентов. Это обеспечивает дополнительный контроль над регулированием для сущностей, идентифицируемых с помощью элемента <Identifier>
.
В следующем примере 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>
не имеет атрибутов или дочерних элементов.
<DisplayName>
Используйте в дополнение к атрибуту name
, чтобы пометить политику в редакторе прокси-сервера пользовательского интерфейса управления другим, более естественным именем.
Элемент <DisplayName>
является общим для всех политик.
Значение по умолчанию | н/д |
Необходимый? | Необязательный. Если вы опустите <DisplayName> , будет использовано значение атрибута name политики. |
Тип | Нить |
Родительский элемент | < PolicyElement > |
Дочерние элементы | Никто |
Элемент <DisplayName>
использует следующий синтаксис:
<PolicyElement> <DisplayName>policy_display_name </DisplayName> ... </PolicyElement>
<PolicyElement> <DisplayName>My Validation Policy</DisplayName> </PolicyElement>
Элемент <DisplayName>
не имеет атрибутов или дочерних элементов.
<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>
В следующем примере применяется политика 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>
Указывает вес, определенный для каждого сообщения. Вес сообщения изменяет влияние одного запроса на вычисление частоты пиковых арестов. Весом сообщения может быть любая переменная потока, например заголовок 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>
В следующем примере количество запросов ограничено 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 должно быть положительным целым числом, отличным от нуля.
В следующем примере устанавливается скорость пять запросов в секунду:
<SpikeArrest name="Spike-Arrest-1"> <Rate>5ps</Rate> </SpikeArrest>
Политика сглаживает скорость до одного запроса каждые 200 миллисекунд (1000/5).
В следующем примере устанавливается скорость 12 запросов в минуту:
<SpikeArrest name="Spike-Arrest-1"> <Rate>12pm</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>
Распределяет количество пиковых арестов по процессорам сообщений (MP) при использовании групп автоматического масштабирования.
<SpikeArrest continueOnError="[false|true]" enabled="[true|false]" name="policy_name " > <UseEffectiveCount>[false|true]</UseEffectiveCount> </SpikeArrest>
В следующем примере для <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 добавляются (или удаляются), их индивидуальные ограничения скорости всплеска останутся прежними, но совокупный лимит увеличится (или уменьшится).
В следующей таблице показано влияние <UseEffectiveCount>
на эффективный предел скорости каждого MP:
Значение <UseEffectiveCount> | ||||||
---|---|---|---|---|---|---|
false | false | false | true | true | true | |
количество депутатов | 8 | 4 | 2 | 8 | 4 | 2 |
Значение <Rate> | 10 | 10 | 10 | 40 | 40 | 40 |
Эффективная ставка на MP | 10 | 10 | 10 | 5 | 10 | 20 |
Совокупный лимит | 80 | 40 | 20 | 40* | 40* | 40* |
* То же, что <Rate> . |
В этом примере обратите внимание, что когда количество MP уменьшается с 4 до 2, а <UseEffectiveCount>
имеет значение false
, эффективная ставка на MP остается прежней (10). Но когда <UseEffectiveCount>
имеет значение true
, эффективная ставка на МП увеличивается с 10 до 20, когда количество МП уменьшается с 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 для превышения ограничения скорости, установленного политикой квоты или пикового ареста, — 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-прокси