Операции AWS SQS в лямбда-выражении занимают слишком много времени при холодном запуске

У меня есть Lambda, использующая AWS Java SDK.

В обработчике этой лямбды у меня есть код, который выглядит так:

AmazonSQS sqs = AmazonSQSClientBuilder.defaultClient();
sqs.sendMessage( ... )

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

Однако при холодном запуске этот код выполняется около 20 секунд. На самом деле только первая строка, построитель клиента, занимает около 10 секунд.

Это ожидаемая производительность java API AWS SQS при холодном запуске?


person Vivek Maharajh    schedule 16.10.2019    source источник
comment
Вы имеете в виду холодный старт Лямбды?   -  person dmigo    schedule 17.10.2019
comment
Да, холодный запуск Lambda, для которого этот код является обработчиком. Тайм-аут шлюза API составляет 29 секунд для лямбда-выражений, и только эти две строки занимают 20 секунд, поэтому я сталкиваюсь с тайм-аутами.   -  person Vivek Maharajh    schedule 17.10.2019
comment
Ваша Lambda находится в VPC?   -  person stdunbar    schedule 17.10.2019
comment
Вы можете рассмотреть возможность отделения функции, вызываемой через шлюз API, от функции, фактически отправляющей сообщение, чтобы избежать этих тайм-аутов. Тем не менее, можете ли вы, чтобы эта лямбда вызывала вашу лямбда-функцию отправителя SQS асинхронно?   -  person andrewec    schedule 17.10.2019
comment
@stdunbar да, в VPC   -  person Vivek Maharajh    schedule 17.10.2019
comment
@andrewec, я думал, что цель SQS состоит в том, чтобы оградить разработчиков от этой потребности. Чтобы иметь возможность быстро поставить задание на потом и вернуться. Поэтому я думал, что просто неправильно его использую. Я попробовал асинхронную версию AmazonSQSClientBuilder. Создание построителя по-прежнему занимает 10 секунд. sendMessageAsync выполняется мгновенно, но, похоже, ничего не делает. Я не знаю, отменит ли лямбда, возвращающаяся до завершения sendMessage, его отмену.   -  person Vivek Maharajh    schedule 17.10.2019
comment
Конечно, но то, что я рекомендовал, на самом деле не стоит в очереди; вместо этого он просто начинает один. Отделение вызова SQS от функции, вызываемой из шлюза API, избавляет вас от 30-секундного тайм-аута, фактически не ускоряя выполнение функции. Читайте здесь: stackoverflow.com/ вопросы/39126606/   -  person andrewec    schedule 18.10.2019
comment
Что-то, что может быть проблемой: вы не сможете вернуть ответ на основе поведения SQS в API. Поэтому, если что-то пойдет не так, у вас не будет возможности отправить это обратно пользователю. Вот еще одна полезная информация в документации: docs.aws .amazon.com/en_pv/lambda/latest/dg/   -  person andrewec    schedule 18.10.2019
comment
Просто, чтобы обновить людей. Некоторое время назад я переключился на лямбда-выражения javascript, и это вообще не проблема. Оказывается, java sdk немного недолюблен.   -  person Vivek Maharajh    schedule 23.06.2021


Ответы (1)


Вы можете создать триггер «подогрева» в облачных часах, который вызывает вашу лямбду каждые 5–15 минут, чтобы поддерживать ее в тепле. Вы получаете миллион бесплатных звонков каждый месяц на лямбда, так что это не должно сильно вас беспокоить. Вот как такие библиотеки, как zappa, сохраняют ваши API в тепле, так что это хорошо зарекомендовавшая себя практика.

Вы можете прочитать больше здесь.

person Ninad Gaikwad    schedule 17.10.2019
comment
Спасибо, это достойный обходной путь. В идеале я хотел бы посмотреть, смогу ли я ускорить холодный запуск, поскольку помещение элемента в очередь кажется, что это не должно занимать 20 секунд. - person Vivek Maharajh; 17.10.2019
comment
Даже при холодном старте 20 секунд кажутся неоправданно долгими. Можете ли вы попробовать распечатать что-нибудь на консоли, как только будет вызвана лямбда, чтобы увидеть, сколько времени занимает теплый или холодный запуск? Разница обычно не более 2-3 секунд. Возможно, ваши настройки SQS задерживают немедленную отправку сообщения? - person Ninad Gaikwad; 17.10.2019
comment
Да, я тоже думал, что 20 секунд неразумно. Лямбде требуется всего 3 секунды, чтобы начать выполнение (выгрузить банку и т. д.). Я дважды проверил настройки SQS, и все по умолчанию, никаких длинных опросов или задержек. - person Vivek Maharajh; 17.10.2019
comment
Какой язык программирования вы используете? Вы пробовали запускать код локально? - person Ninad Gaikwad; 18.10.2019
comment
Джава. Нет, я не настроил локальное развертывание для своего стека. - person Vivek Maharajh; 18.10.2019
comment
Я только когда-либо реализовывал SQS с использованием Python. Он добавляет около 100 элементов в мою очередь всего за несколько секунд. Может просто дело в языке. - person Ninad Gaikwad; 18.10.2019
comment
Это точно. Нет проблем, когда я использую лямбда-выражения javascript. - person Vivek Maharajh; 23.06.2021