Политика SpikeArrest

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

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

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

Элемент <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>

This element has the following attributes that are common to all policies:

Attribute Default Required? Description
name N/A Required

The internal name of the policy. The value of the name attribute can contain letters, numbers, spaces, hyphens, underscores, and periods. This value cannot exceed 255 characters.

Optionally, use the <DisplayName> element to label the policy in the management UI proxy editor with a different, natural-language name.

continueOnError false Optional Set to "false" to return an error when a policy fails. This is expected behavior for most policies. Set to "true" to have flow execution continue even after a policy fails.
enabled true Optional Set to "true" to enforce the policy. Set to "false" to "turn off" the policy. The policy will not be enforced even if it remains attached to a flow.
async   false Deprecated This attribute is deprecated.

Примеры

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

Пример 1

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

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

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

Пример 2

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

<SpikeArrest name="Spike-Arrest-1">
  <Rate>12pm</Rate>
</SpikeArrest>

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

Пример 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>

Указывает вес, определенный для каждого сообщения. Вес сообщения изменяет влияние одного запроса на вычисление частоты пиковых арестов. Весом сообщения может быть любая переменная потока, например заголовок 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 name="Spike-Arrest-1">
  <Rate>12pm</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> и клиент не передает значение, политика Spike Arrest выдает ошибку.

Необязательный н/д

<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 если элемент исключен из вашей политики 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 ).

Дополнительные сведения см. в разделе Справочник по переменным потока .

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

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.
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).
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.

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.

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