Ограничить количество отображаемых сообщений AWS SQS в секунду для вызовов AWS Lambda в секунду

Я реализую решение, которое включает SQS, который запускает функцию Lambda, которая использует сторонний API для выполнения некоторых операций. Этот сторонний API имеет ограничение на количество запросов в секунду, поэтому я хотел бы ограничить количество SQS-сообщений, обрабатываемых моей функцией Lambda, аналогичной скоростью.

Есть ли способ ограничить количество сообщений, отображаемых в SQS в секунду, или количество вызовов функции Lambda в секунду?

[отредактировано]

После некоторого понимания, данного в комментариях об AWS Kinesis: не существует экономичного решения, обрабатывающего параметры Kinesis Batch Window, Batch size и payload size, из-за поведения Kinesis, которое запускает выполнение лямбда, если ЛЮБОЙ из пороговых значений и достигается: * Учитывая N = максимальное количество запросов в секунду, которые я могу выполнить через сторонний api. * При настройке окна пакета = 1 секунда и размера пакета N, обратное предварительное задание должно запускать выполнение с более чем N_MAX запросами. * Конфигурация пакетной Windows = 1 секунда и размер пакета MAX_ALLOWED_VALUE, будет недостаточно производительным и также не гарантирует выполнение менее N выполнений в секунду.

Самым простым решением, которое я нашел, является создание лямбды с фиксированной скоростью выполнения в 1 секунду, которая считывает фиксированное количество сообщений N из SQS / Kinesis и записывает их в другой SQS / Kinesis, имея в качестве конечной точки другую лямбду.


person Basa    schedule 06.06.2020    source источник
comment
Вы можете использовать зарезервированный параллелизм, чтобы ограничить максимальное параллелизм лямбда-функции   -  person jellycsc    schedule 06.06.2020
comment
Если это не обязательно sqs, другой способ сделать это - kinesis с опцией batch window.   -  person Ersoy    schedule 06.06.2020


Ответы (2)


Это сложная ситуация.

Amazon SQS может запускать несколько функций AWS Lambda параллельно, поэтому нет централизованного контроля над скоростью выполнения запросов к стороннему API.

Из Управление параллелизмом для функции Lambda - AWS Lambda :

Чтобы гарантировать, что функция всегда может достичь определенного уровня параллелизма, вы можете настроить функцию с зарезервированным параллелизмом. Когда функция имеет зарезервированный параллелизм, никакая другая функция не может использовать этот параллелизм. Зарезервированный параллелизм также ограничивает максимальный параллелизм для функции и применяется к функции в целом, включая версии и псевдонимы.

Следовательно, параллелизм можно использовать для ограничения количества одновременного выполнения лямбда-функций, но это не обязательно соответствует «x вызовов API в секунду». Это будет зависеть от того, сколько времени займет выполнение лямбда-функции (например, 2 секунды) и сколько вызовов API она сделает за это время (например, 2 вызова API).

Может потребоваться ввести задержки либо внутри лямбда-функции (не очень хорошо, потому что вы все еще платите за выполнение функции во время ожидания), либо вне лямбда-функции ( запускать функции Lambda другим способом или даже выполнять обработку вне Lambda).

Самый простой (но не эффективный) способ:

  • Установите параллелизм 1.
  • Попросите лямбда-функцию повторить вызов API, если она отклонена.
person John Rotenstein    schedule 06.06.2020
comment
Я нахожусь в той же ситуации, и установка параллелизма на 1 сработала для меня. Мой подход состоит в том, чтобы вернуть сообщение с тайм-аутом видимости одинаково случайного типа, когда API становится насыщенным, чтобы он уравновешивал нагрузку на него. - person Samuel Prevost; 23.08.2020

Благодаря @John Rotenstein дал исчерпывающий и подробный ответ о части SQS.

Если ваш дизайн ограничен одним потребителем, вы можете заменить sqs потоками kinesis. Заменив его, вы можете использовать batch window параметр кинезиса, чтобы ограничить запросы, сделанные потребителем. Параметр пакетного окна используется для уменьшить количество вызовов

Lambda считывает записи из потока с фиксированной частотой (например, один раз в секунду для потоков данных Kinesis) и вызывает функцию с пакетом записей. Batch Window позволяет вам ждать до 300 секунд для создания пакета перед вызовом функции. Теперь функция вызывается, когда выполняется одно из следующих условий: размер полезной нагрузки достигает 6 МБ, окно пакета достигает максимального значения или размер пакета достигает максимального значения. С помощью Batch Window вы можете увеличить среднее количество записей, передаваемых в функцию при каждом вызове. Это полезно, когда вы хотите уменьшить количество вызовов и оптимизировать стоимость.

person Ersoy    schedule 07.06.2020