Почему AWS Lambda запускается «всплесками» каждые 15 минут?

Во-первых, вот краткое описание того, как работает моя лямбда-функция:

  1. Запускается сообщениями, поступающими в стандартную очередь SQS.
  2. Зарезервированный параллелизм установлен на 4
  3. Каждое сообщение SQS содержит URL-адреса списка изображений, которые функция Lambda передает в корзину S3.

Итак, в двух словах: SQS -> Lambda -> S3

В этом тесте: в очередь SQS было передано 100 сообщений, каждое из которых содержало в среднем 5 URI изображений. Каждое изображение имеет средний размер 10 МБ.

Я ожидал, что экземпляры Lambda будут непрерывно работать близко друг к другу, пока очередь SQS не опустеет. Вместо этого я увидел следующее:

Похоже, что функция Lambda запускается «вспышками» каждые 15 минут. Мое первое предположение состоит в том, что это то, что я установил в своей конфигурации при первом развертывании Lambda, но, к сожалению, я не совсем помню, каковы были эти первоначальные настройки. Я также, кажется, не могу ничего изменить сейчас, кроме настроек дросселирования и тайм-аута.

Есть идеи, что здесь происходит?

Стоит ли изучать PHP в 2023-2024 годах?
Стоит ли изучать PHP в 2023-2024 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
0
0
651
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

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

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

Поскольку вы установили для Reserved Concurrency значение 4, только 4 функции будут выполняться параллельно.

Таким образом, похоже, что Lambda запускает 4 функции, ожидает завершения функции, а затем запускает следующую функцию. Я предполагаю, что ваша функция выполняется около 10-15 секунд, что приводит к поведению, которое вы видите.

Если у вас нет особой причины для использования зарезервированного параллелизма, я предлагаю вам удалить этот параметр.

Извините, я только что понял, что всплески происходят каждые 15 минут, а не секунд. Я исправил свой оригинальный пост, чтобы отразить это. График максимальной продолжительности предполагает, что мои функции выполняются менее чем за минуту, но график успешности сообщает только об успехе/неуспехе каждые 15 минут. Я также не вижу никаких изображений, загружаемых в корзину S3 между этими 15-минутными интервалами, и мне кажется, что в это время не выполняется никакой работы. Так почему же Lambda, кажется, сидит без дела и срабатывает только каждые 15 минут? Может ли это быть как-то связано с очередью SQS?

user928112 12.12.2020 04:00

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

John Rotenstein 12.12.2020 09:40
Ответ принят как подходящий

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

Это связано с инициируемыми SQS лямбда-выражениями, которые работают с пониженной зарезервированной настройкой параллелизма. Короче говоря, каждый раз, когда SQS пытается доставить сообщения функции Lambda, одна или несколько пакетных доставок могут завершиться ошибкой из-за отсутствия доступных экземпляров Lambda, и эти сообщения в конечном итоге застревают в полете, где они остаются до тех пор, пока не будет достигнут тайм-аут видимости SQS. (что в моем случае составляет 15 минут). В этот момент цикл повторится. Если вы настроили DLQ для своего SQS, возможно, вы увидите, что некоторые сообщения окажутся там после того, как они не пройдут достаточное количество раз.

Смотрите эту статью для более подробного объяснения: https://medium.com/@zaccharles/lambda-concurrency-limits-and-sqs-triggers-dont-mix-well-sometimes-eb23d90122e0

Другие вопросы по теме