Применение ограничения частоты арестов Apigee Spike

Я новичок в Apigee.

Я пытаюсь понять политику Spike Arrest.

Я просматриваю эту документацию:
http://apigee.com/docs/api-services/content/shield-apis-using-spikearrest
http://apigee.com/docs/api-services/content/policy-вложение-и-применение

Единственное, что я не могу понять наверняка, это то, применяется ли к ApiProxy политика Spike Arrest Policy, применяется ли ограничение скорости для каждого приложения Key/Client Dev или оно совместно используется всеми приложениями Keys/Client Dev?

Например, если у нас есть следующий конфиг:

<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
  <SpikeArrest async="false" continueOnError="false" enabled="true" name="spikearrest-1">
  <DisplayName>SpikeArrest-1</DisplayName>
  <FaultRules/>
  <Properties/>
  <Identifier ref="request.header.some-header-name"/>
  <MessageWeight ref="request.header.weight"/>
  <Rate>50ps</Rate>
</SpikeArrest>

И клиентские приложения для разработки:
1. DevApp1
2. DevApp2

Ограничение скорости в 50 пс распределяется между DevApp1 и DevApp2, или DevApp1 и DevApp2 получают ограничение в 50 пс каждый?

Спасибо,


person atkuzmanov    schedule 24.04.2014    source источник
comment
Согласно приведенной ниже ссылке, подсчет ведется для каждого пакета API и для каждого имени политики. Это означает, что счетчики не будут использоваться в разных пакетах, даже если идентификатор один и тот же. Пожалуйста, ознакомьтесь с этим ответом для получения дополнительной информации. stackoverflow.com/questions/21614059/. Итак, ваш сценарий ниже не должен быть проблемой, поскольку count независим.   -  person Diego    schedule 25.04.2014
comment
Спасибо @Диего! В настоящее время у меня есть эта проблема: stackoverflow.com/questions/21912316/ В В нашей организации есть 6 обработчиков сообщений (MP), и я предполагаю, что они работают строго по кругу. Если у меня скорость 15:00, что означает 1 попадание каждые 20 секунд, вместо 1 успешного попадания каждые 20 секунд я получаю 6 успешных попаданий в диапазоне 20 секунд, а затем ошибку Spikearrest, означающую попадание один раз в каждую MP. Это означает, что я получаю 6 за 20 секунд вместо 1. Есть ли способ синхронизировать аресты шипов между депутатами? ConcurrentRatelimit не помогает.   -  person atkuzmanov    schedule 25.04.2014


Ответы (2)


Вы можете использовать любую из предопределенных переменных: http://apigee.com/docs/api-services/api/variables-reference

Переменная, которая, вероятно, наиболее часто используется для Spike Arrest, это client.ip. Edge сделает доступными все элементы сообщения запроса. Если ваши клиенты добавляют client_id (также известный как ключ API) к запросу в качестве параметра запроса, например api.call.com?client_id=u34r8ur, тогда вы должны установить переменную в своем идентификаторе Spike Arrest Identifier следующим образом:

<Identifier ref="request.queryparam.client_id"/>

Или, если он находится в заголовке HTTP:

<Identifier ref="request.header.client_id"/>

Надеюсь, это поможет!

person ap-andrew    schedule 24.04.2014
comment
Для полноты, если вы хотите использовать client.ip, вы должны использовать: <Identifier ref="client.ip"/> - person ap-andrew; 24.04.2014
comment
это было чрезвычайно полезно, особенно пример с погодой, это параметр запроса или заголовок! Спасибо, я ценю это! Чего я до сих пор не могу понять, так это того, как сделать это условно на конечной точке прокси. Например, я хочу, чтобы App1 имел 5 пс, App2 — 5 пс, App3 — 1 пс, App4 — 2 пс — все это на конечной точке прокси. Если у меня есть только 25ps, то App2, например, может использовать все это и сделать ресурс недоступным для остальных, и я хочу избежать этого. Вы знаете, есть ли способ, которым я могу это сделать? - person atkuzmanov; 25.04.2014
comment
Можете ли вы описать на более высоком уровне, каковы ваши требования? Для вас может иметь смысл использовать другой подход, такой как квота, если ваша цель — контролировать потребление. - person ap-andrew; 25.04.2014
comment
Спасибо! Но мне нужен SpikeArrest. В настоящее время у меня есть эта проблема: stackoverflow.com/questions/21912316/ В В нашей организации есть 6 обработчиков сообщений (MP), и я предполагаю, что они работают строго по кругу. Если у меня скорость 15:00, что означает 1 попадание каждые 20 секунд, вместо 1 успешного попадания каждые 20 секунд я получаю 6 успешных попаданий в диапазоне 20 секунд, а затем ошибку Spikearrest, означающую попадание один раз в каждую MP. Это означает, что я получаю 6 за 20 секунд вместо 1. Есть ли способ синхронизировать аресты шипов между депутатами? ConcurrentRatelimit не помогает. - person atkuzmanov; 25.04.2014

Его для каждого приложения определяется вашим идентификатором.

person Srikanth    schedule 24.04.2014
comment
Большое спасибо за ваш быстрый ответ @Srikanth! Итак, на данный момент у нас есть настройка по умолчанию ‹Идентификатор ref=request.header.some-header-name/›. Это вообще что-то делает на данный момент, работает ли это? Или мне нужно установить что-то еще, а не request.header.some-header-name, например request.header.client_id? Я спрашиваю об этом, поскольку имя некоторого заголовка выглядит для меня как заполнитель, а не фактическая переменная. Также каков эффект/поведение некоторого имени заголовка, делает ли он вообще что-нибудь? - person atkuzmanov; 24.04.2014
comment
Идентификатор — это способ идентификации приложения. Это ключ к ограничению скорости. - person Srikanth; 24.04.2014
comment
Атанас, 'request.header.some-header-name' не работает - это просто попытка указать, что вы можете поместить любую переменную (предварительно определенную или пользовательскую), которая соответствует вашим требованиям. Мы обновим документ, чтобы сделать это более понятным. Спасибо. - person ap-andrew; 24.04.2014
comment
Спасибо @ap-andrew! Так какой из них функциональный? Я просматриваю справочник по переменным, чтобы попытаться определить, что использовать? Я не вижу там указанный client_id, это тоже не работает? - person atkuzmanov; 24.04.2014