Во-первых, вот краткое описание того, как работает моя лямбда-функция:
Итак, в двух словах: SQS -> Lambda -> S3
В этом тесте: в очередь SQS было передано 100 сообщений, каждое из которых содержало в среднем 5 URI изображений. Каждое изображение имеет средний размер 10 МБ.
Я ожидал, что экземпляры Lambda будут непрерывно работать близко друг к другу, пока очередь SQS не опустеет. Вместо этого я увидел следующее:
Похоже, что функция Lambda запускается «вспышками» каждые 15 минут. Мое первое предположение состоит в том, что это то, что я установил в своей конфигурации при первом развертывании Lambda, но, к сожалению, я не совсем помню, каковы были эти первоначальные настройки. Я также, кажется, не могу ничего изменить сейчас, кроме настроек дросселирования и тайм-аута.
Есть идеи, что здесь происходит?
Из Управление параллелизмом для функции Lambda — AWS Lambda:
Когда функция зарезервировала параллелизм, никакая другая функция не может использовать этот параллелизм. Зарезервированный параллелизм также ограничивает максимальный параллелизм для функции и применяется к функции в целом, включая версии и псевдонимы.
Поскольку вы установили для Reserved Concurrency значение 4, только 4 функции будут выполняться параллельно.
Таким образом, похоже, что Lambda запускает 4 функции, ожидает завершения функции, а затем запускает следующую функцию. Я предполагаю, что ваша функция выполняется около 10-15 секунд, что приводит к поведению, которое вы видите.
Если у вас нет особой причины для использования зарезервированного параллелизма, я предлагаю вам удалить этот параметр.
Я бы порекомендовал просмотреть журналы в Amazon CloudWatch Logs (доступ к которым можно получить через вкладку «Мониторинг» в функции Lambda), чтобы лучше понять, что происходит.
Я понял, почему это происходит, но, к сожалению, нет другого решения, кроме как увеличить зарезервированный параллелизм.
Это связано с инициируемыми SQS лямбда-выражениями, которые работают с пониженной зарезервированной настройкой параллелизма. Короче говоря, каждый раз, когда SQS пытается доставить сообщения функции Lambda, одна или несколько пакетных доставок могут завершиться ошибкой из-за отсутствия доступных экземпляров Lambda, и эти сообщения в конечном итоге застревают в полете, где они остаются до тех пор, пока не будет достигнут тайм-аут видимости SQS. (что в моем случае составляет 15 минут). В этот момент цикл повторится. Если вы настроили DLQ для своего SQS, возможно, вы увидите, что некоторые сообщения окажутся там после того, как они не пройдут достаточное количество раз.
Смотрите эту статью для более подробного объяснения: https://medium.com/@zaccharles/lambda-concurrency-limits-and-sqs-triggers-dont-mix-well-sometimes-eb23d90122e0
Извините, я только что понял, что всплески происходят каждые 15 минут, а не секунд. Я исправил свой оригинальный пост, чтобы отразить это. График максимальной продолжительности предполагает, что мои функции выполняются менее чем за минуту, но график успешности сообщает только об успехе/неуспехе каждые 15 минут. Я также не вижу никаких изображений, загружаемых в корзину S3 между этими 15-минутными интервалами, и мне кажется, что в это время не выполняется никакой работы. Так почему же Lambda, кажется, сидит без дела и срабатывает только каждые 15 минут? Может ли это быть как-то связано с очередью SQS?