AWS Лямбда холодный старт проблема с пружинной загрузкой - PullRequest
0 голосов
/ 21 марта 2020

Я новичок в aws лямбде и перевожу свой проект, основанный на весенней загрузке 2.x, в лямбду. Но я борюсь с лямбда-холодным стартом и прогревом. Я попробовал несколько вещей, упомянутых в этой ссылке: https://github.com/awslabs/aws-serverless-java-container/wiki/Quick-start---Spring-Boot, но запуск приложения занимает около 45 секунд.

Что я пробовал:

  1. Asyn c инициализация по вышеуказанной ссылке. Это помогло немного, но недостаточно.

  2. Пропустить фазу инициализации лямбды. Это помогло уменьшить почти 8 секунд.

  3. Обеспеченный параллелизм, но, насколько я мог видеть, он тоже не помогает. Когда я видел логи, контекст весны инициализируется каждый раз, если какой-либо запрос приходит через 15-20 минут.

Время отклика моей лямбды в разных сценариях ios is:

1. 3008 MB memory/first request/ response time: ~25 secs.  
2. 3008 MB memory/2nd request immediately after 1st req/ response time: ~600ms.  
3. 1024 MB memory/1st req/ postman request times out.  
4. 1024 MB memory/2nd req immediately after 1st req/response time:  ~750ms.  
5. 1792 MB memory/1st req/ response time: ~27sec.  
6. 1792 MB memory/ 2nd req immediately after 1st req/response time:  ~650ms

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

Является ли это целесообразным подходом? Или есть лучший способ достижения этой цели?

Я не уверен, что AWS будет взимать плату в этом случае.

1 Ответ

1 голос
/ 21 марта 2020

5-минутное событие Cloudwatch должно составить около 8600 вызовов / месяц. Если вы выполнили даже 100000 звонков, это по-прежнему бесплатно, согласно калькулятору на https://aws.amazon.com/lambda/pricing/ с 3 ГБ памяти.

Чтобы настроить Cloudwatch для проверки связи с Lambda, начните с создания правила (Cloudwatch -> Правила), и он будет запускаться каждые 5 минут:

enter image description here

Затем запустите Lambda:

enter image description here

Моя лямбда в этом примере называется SnapshotHandler, и она принимает небольшой JSON объект. Обратите внимание, что это вызывает Lambda напрямую , а не через шлюз API. Это может или не может быть тем, что ожидает ваш лямбда-код, поэтому вам может потребоваться обновить.

Если вы хотите вызывать этот лямбда-код через HTTP / S API, вам необходимо настроить SNS topi c опубликовать sh событие Cloudwatch и заставить topi c SNS вызывать ваш API через HTTP. Это немного сложнее, но не страшно.

В общем, вы можете сделать это, но стоимость зависит от того, сколько "обычных" вызовов получает ваш API. При 1000000 звонках в месяц 3Гб / 800мс лямбда стоит около 33 долларов США. На 10000000 это почти 400 долларов США. Но если вы получаете столько звонков (в среднем около 230 в секунду), кажется маловероятным, что вам тоже потребуется сердцебиение.

...