Ответ 1
Может ли AWMS лямбда использовать один и тот же объект одновременно для разных вызовов?
Могут ли экземпляры обработчиков AWS lambda использовать общую кучу (память) или нет?
Сильное, определенное НЕТ. Экземпляры обработчиков AWS Lambda не могут делиться файлами (в /tmp
).
Контейнер AWS Lambda не может использоваться повторно для двух или более одновременных вызовов функции Lambda, поскольку это нарушит требование изоляции:
Вопрос: Как AWS Lambda изолирует мой код?
Каждая функция AWS Lambda работает в своей изолированной среде с собственными ресурсами и видом файловой системы.
Раздел "Как работает AWS Lambda Run My Code? Модель контейнера" в официальном описании того, как работают функции лямбда-функций:
После выполнения функции Lambda, AWS Lambda поддерживает контейнер в течение некоторого времени в ожидании другого вызова функции Lambda. Фактически, служба замораживает контейнер после завершения функции Lambda и оттаивает контейнер для повторного использования, если AWS Lambda выбирает повторное использование контейнера, когда снова активируется функция Lambda. Этот подход повторного использования контейнера имеет следующие последствия:
Любые объявления в вашем коде функции Lambda остаются инициализированными, обеспечивая дополнительную оптимизацию при повторном вызове функции. Например, если ваша функция Lambda устанавливает соединение с базой данных, вместо восстановления соединения исходное соединение используется в последующих вызовах. Вы можете добавить логику в свой код, чтобы проверить, существует ли соединение до его создания.
Каждый контейнер предоставляет некоторое дисковое пространство в каталоге /tmp. Содержимое каталога остается, когда контейнер заморожен, обеспечивая переходный кеш, который может использоваться для нескольких вызовов. Вы можете добавить дополнительный код, чтобы проверить, хранятся ли в кеше данные, которые вы сохранили.
Фоновые процессы или обратные вызовы, инициированные вашей функцией Lambda, которые не были завершены, когда функция завершила возобновление, если AWS Lambda решит повторно использовать контейнер. Вы должны убедиться, что все фоновые процессы или обратные вызовы (в случае Node.js) в вашем коде завершены до выхода кода.
Как вы можете видеть, абсолютно никаких предупреждений о состоянии гонки между несколькими параллельными вызовами функции лямбда при попытке воспользоваться повторным использованием контейнера. Единственное замечание - "не полагайтесь на это!".