AWS лямбда и параллелизм Java

Известно, что AWS lambda может повторно использовать ранее созданные объекты обработчиков, и это действительно так (см. FAQ):

Вопрос: Будет ли AWS Lambda повторно использовать экземпляры функций?

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


Вопрос касается параллелизма Java. Если у меня есть класс для обработчика, скажите:

public class MyHandler {
    private Foo foo;
    public void handler(Map<String,String> request, Context context) {
       ...
    }
}

Итак, будет ли он потокобезопасным для доступа и работы с объектной переменной foo здесь или нет?

Другими словами: может ли AWS-лямбда одновременно использовать один и тот же объект для разных вызовов?

РЕДАКТИРОВАТЬ Моя функция обрабатывается на основе источника событий, особенно она вызывается методом API-шлюза.

РЕДАКТИРОВАТЬ-2 Такой вопрос возникает, когда вы хотите реализовать какой-то пул соединений с внешними ресурсами, поэтому я хочу сохранить соединение с внешним ресурсом как переменную объекта. Это на самом деле работает как хотелось бы, но я боюсь проблем с параллелизмом.

РЕДАКТИРОВАТЬ-3 Более конкретно мне интересно: могут ли экземпляры обработчиков лямбда-AWS совместно использовать общую кучу (память) или нет? Я должен указать эту дополнительную деталь, чтобы предотвратить ответы с перечислением очевидных и общеизвестных вещей о Java-потокобезопасных объектах.

Ответы

Ответ 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) в вашем коде завершены до выхода кода.

Как вы можете видеть, абсолютно никаких предупреждений о состоянии гонки между несколькими параллельными вызовами функции лямбда при попытке воспользоваться повторным использованием контейнера. Единственное замечание - "не полагайтесь на это!".

Ответ 2

Использование преимуществ многократного использования контекста исполнения определенно является практикой при работе с AWS Lambda (см. Рекомендации AWS Lambda). Но это не относится к параллельным выполнениям, так как для параллельного выполнения создается новый контейнер и, таким образом, новый контекст. Короче говоря, для одновременных выполнений, если один обработчик изменяет значение, другой не получит новое значение.