AWS Lambda - статическая инициализация Java

Внутри лямбда-функции AWS (написанной на Java) я хочу использовать AsyncHttpClient (https://github.com/AsyncHttpClient/async-http-client). К сожалению, создание экземпляра этого объекта занимает около 500 мс (но мне он все еще нравится, пожалуйста, не советуйте мне менять http-клиент).

Я рассматривал создание AsyncHttpClient в блоке статической инициализации. Так что, возможно, он будет выполнен AWS один раз, а затем снимок будет клонирован для каждого выполнения AWS Lambda. Я прав ?

Когда статический блок выполняется в AWS Lambda?

  • Один раз и затем моментальный снимок клонируется при каждом вызове AWS Lambda.
  • либо статический блок выполняется для каждого выполнения Lambda отдельно (и это не поможет разместить там создание Http Client)

Спасибо за помощь

Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
В компьютерном программировании биты играют важнейшую роль в представлении и манипулировании данными на двоичном уровне. Побитовые операции...
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Приходилось ли вам сталкиваться с требованиями, в которых вас могли попросить поднять тревогу или выдать ошибку, когда метод Java занимает больше...
Полный курс Java для разработчиков веб-сайтов и приложений
Полный курс Java для разработчиков веб-сайтов и приложений
Получите сертификат Java Web и Application Developer, используя наш курс.
1
0
4 172
2

Ответы 2

«Снимок» среды выполнения Lambda никогда не делается. Однако существует концепция повторного использования контейнера. Блок статической инициализации будет вызываться при первом запуске функции в новом контейнере, и при каждом последующем выполнении Lambda, отправляемом в этот контейнер, можно будет пропустить этап инициализации. Каждый раз, когда Lambda запускает новый контейнер для вашей Lambda-функции, эта инициализация должна повторяться снова.

Я предлагаю прочитать этот пост в блоге AWS о повторном использовании контейнера Lambda.

Как объяснил Mark B, не существует такого понятия, как «моментальный снимок».

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

Контекст выполнения состоит из контейнера, JVM и экземпляр Singleton класса Java, в котором определена ваша функция-обработчик.

Поэтому я бы не рекомендовал выполнять «одноразовую» инициализацию в статическом блоке, а вместо этого в конструкторе вашего класса. Это значительно улучшит тестируемость вашего кода.

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