Антипаттерн: настройка нераспределенной квоты

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

Apigee Edge позволяет настроить количество разрешенных запросов к прокси API за определенный период времени с помощью правила квоты.

Антипаттерн

Запрос к прокси-серверу API может быть обработан одним или несколькими распределенными компонентами Edge, которые называются процессорами сообщений. Если для обработки запросов API настроено несколько процессоров сообщений, квота, скорее всего, будет превышена, поскольку каждый процессор сообщений ведет собственный "счет" обработанных им запросов.

Рассмотрим пример. Рассмотрим следующее правило квоты для прокси API:

<!-- /antipatterns/examples/1-6.xml -->
<Quota name="CheckTrafficQuota">
  <Interval>1</Interval>
  <TimeUnit>hour</TimeUnit>
  <Allow count="100"/>
</Quota>

Приведенная выше конфигурация позволяет отправлять до 100 запросов в час.

Однако на практике, когда запросы к API обрабатываются несколькими процессорами сообщений, происходит следующее:

На иллюстрации выше:

  • Правило квоты настроено так, чтобы разрешать 100 запросов в час.
  • Запросы к прокси API обрабатываются двумя процессорами сообщений.
  • Каждый Message Processor поддерживает собственную переменную для подсчета квоты – quota_count_mp1 и quota_count_mp2 – для отслеживания количества обрабатываемых запросов.
  • Таким образом, каждый Message Processor будет обрабатывать 100 запросов к API. В результате будет обработано 200 запросов вместо 100.

Результат

В такой ситуации квота не выполняет свою функцию и может негативно повлиять на работу внутренних серверов, обрабатывающих запросы.

Бэкенд-серверы могут:

  • быть перегружен из-за неожиданно большого входящего трафика;
  • перестать отвечать на новые запросы к API, что приведет к ошибкам 503;

Рекомендации

Рекомендуем задать для элемента <Distributed> значение true в правиле квоты, чтобы для отслеживания запросов API во всех процессорах сообщений использовался общий счетчик. Элемент <Distributed> можно задать так, как показано в фрагменте кода ниже:

<!-- /antipatterns/examples/1-7.xml -->
<Quota name="CheckTrafficQuota">
  <Interval>1</Interval>
  <TimeUnit>hour</TimeUnit>
  <Distributed>true</Distributed>
  <Allow count="100"/>
</Quota>