Регулирование шлюза AWS API не работает должным образом

Я пытаюсь включить регулирование шлюза API, но оно работает не так, как ожидалось.

Я установил скорость регулирования метода по умолчанию на 1 запрос в секунду, а пакетный - на 1 запрос.

введите описание изображения здесь

Затем я создал цикл в своем коде, чтобы сделать 10 одновременных запросов к моей конечной точке API.

for (let i=0; i<10; i++) {
    axios.get(url);
}

Ожидаемый результат:

  • 1 успешный запрос
  • 9 задушенных запросов (ошибка HTTP 429)

Но на самом деле результат был противоположным:

  • 9 успешных запросов
  • 1 дросселированный запрос (ошибка HTTP 429)

Я повторил процесс, но сделал 20 одновременных запросов, и результат был:

  • 16 успешных запросов
  • 4 задушенных запроса (ошибка HTTP 429)

В журналах CloudWatch для этого метода API я обнаружил разные потоки журналов, каждый с разницей всего в несколько миллисекунд.

введите описание изображения здесь

Если я установил скорость на 0 запросов в секунду и пакет на 0 запросов, дросселирование работает, и ВСЕ запросы будут дросселированы. Но когда я устанавливаю для Rate и Bust значение 1, он не работает должным образом.

Почему так происходит? Мне нужно ограничить свой API только 1 запросом в секунду.


person Daniel Barral    schedule 28.07.2020    source источник
comment
Вы использовали тот же ключ API, когда тестировали регулирование? Эти ограничения применяются для каждого ключа API.   -  person Tasos P.    schedule 28.07.2020
comment
Также убедитесь, что при редактировании дросселирования разверните API на активном этапе, чтобы он вступил в силу.   -  person Deiv    schedule 28.07.2020
comment
Я не использую ключи API. Метод API является общедоступным.   -  person Daniel Barral    schedule 28.07.2020
comment
Если я изменю настройку дросселирования этапа, мне нужно будет повторно развернуть API?   -  person Daniel Barral    schedule 28.07.2020
comment
Это ваша проблема, это регулирование основано на планах использования с ключами api. @Cascader ответил правильно ниже   -  person Deiv    schedule 28.07.2020
comment
Итак, вы говорите, что невозможно ограничить общедоступные API без ключа api / плана использования? Тогда почему некоторые запросы возвращают HTTP 429 - слишком много запросов?   -  person Daniel Barral    schedule 29.07.2020
comment
У меня такая же проблема с rate limit и burst, она не работает должным образом. Вы нашли для этого решение? @DanielBarral   -  person Karthik Vadla    schedule 23.06.2021
comment
@KarthikVadla У меня не было стабильных результатов. Проверьте мой ответ ниже.   -  person Daniel Barral    schedule 24.06.2021


Ответы (2)


Есть два способа применить ограничения на вызовы API:

  1. Регулирование на уровне аккаунта
  2. регулирование на уровне API и на уровне стадии

Когда вам нужно применить регулирование на уровне API или на уровне стадии, вы должны использовать планы использования:

План использования определяет, кто может получить доступ к одному или нескольким развернутым этапам и методам API, а также сколько и как быстро они могут получить к ним доступ.

person Tasos P.    schedule 28.07.2020
comment
Итак, невозможно ограничить общедоступные API без ключа API / плана использования? Тогда почему некоторые из моих запросов возвращают HTTP 429 - слишком много запросов? - person Daniel Barral; 29.07.2020
comment
Это то, что задокументировано, но на самом деле вы можете установить дросселирование для любой общедоступной конечной точки, по крайней мере, для apigatewayv2: aws apigatewayv2 update-stage --api-id 4767ptc6kh --stage-name foo --route-settings '{"GET /proxy":{"ThrottlingBurstLimit":1,"ThrottlingRateLimit":1}}' И, как упоминалось выше, он работает не так, как ожидалось, потому что, похоже, существует несколько экземпляров шлюза API, которые не разделяют фильтры и работают независимо . - person ARA1307; 06.04.2021

Кажется, что регулирование AWS API Gateway не очень точное для небольших значений скорости / пакета.

Я полагаю, что существует несколько запущенных экземпляров шлюза API, и значения скорости и пакета в конечном итоге согласованы.

Однако документации по этому поводу я не нашел.

Когда я сделал первоначальный запрос и подождал 500 миллисекунд, прежде чем сделать остальные 99 запросов, результаты были менее неточными.

Пример:

axios.get(url);
setTimeout(function(){
    console.log("After 500 ms");
    for (let i=0; i<99; i++) {
        axios.get(url);
    }
}, 500);

Полученные результаты:

  • Однажды я получил 1 успех и 99 троттлов.
  • В другой раз я получил 12 успехов и 88 ударов.
  • В другой раз я получил 33 успеха и 67 ударов.

Однако добиться стабильных результатов сложно.

person Daniel Barral    schedule 29.07.2020