Il est connu qu'AWS lambda mai réutilise les premiers objets de gestionnaires créés, et il le fait vraiment (voir FAQ ):
Q: Est-ce qu'AWS Lambda réutilisera les instances de fonction?
Pour améliorer les performances, AWS Lambda peut choisir de conserver une instance de votre fonction et de la réutiliser pour servir une demande ultérieure, plutôt que de créer une nouvelle copie. Votre code ne doit pas supposer que cela se produira toujours.
La question concerne Java
concurrence. Si j'ai une classe pour un gestionnaire, dites:
public class MyHandler {
private Foo foo;
public void handler(Map<String,String> request, Context context) {
...
}
}
donc, sera-t-il thread-safe pour accéder et travailler avec la variable objet foo
ici ou non?
En d'autres termes: AWS lambda peut-il utiliser le même objet simultanément pour différents appels?
[~ # ~] edit [~ # ~] Ma fonction est traitée sur une source basée sur un événement, en particulier elle est invoquée par une méthode API Gateway.
EDIT-2 Ce type de question se pose lorsque vous souhaitez implémenter une sorte de pool de connexions à des ressources externes, donc je veux garder la connexion à l'extérieur ressource en tant que variable d'objet. Cela fonctionne comme vous le souhaitez, mais j'ai peur des problèmes de concurrence.
EDIT-3 Plus précisément, je me demande: les instances de gestionnaires d'AWS lambda peuvent-elles partager un tas commun (mémoire) ou pas ? Je dois spécifier ces détails supplémentaires afin d'éviter les réponses avec une liste de choses évidentes et connues sur Java objets thread-safe.
AWS lambda peut-il utiliser le même objet simultanément pour différents appels?
Les instances de gestionnaires d'AWS lambda peuvent-elles partager un tas (mémoire) commun ou non?
Un NON fort et défini. Les instances de gestionnaires d'AWS Lambda ne peuvent même pas partager de fichiers (dans /tmp
).
Un conteneur AWS Lambda peut ne pas être réutilisé pour deux appels simultanés ou plus d'une fonction Lambda, car cela romprait l'exigence d'isolement:
Q: Comment AWS Lambda isole-t-il mon code?
Chaque fonction AWS Lambda s'exécute dans son propre environnement isolé , avec ses propres ressources et vue du système de fichiers.
La section "Comment AWS Lambda exécute mon code? Le modèle de conteneur" dans la description officielle de comment fonctionnent les fonctions lambda indique :
Après l'exécution d'une fonction Lambda, AWS Lambda gère le conteneur pendant un certain temps en prévision d'un autre appel de la fonction Lambda. En effet, le service fige le conteneur une fois la fonction Lambda terminée et décongèle le conteneur pour réutilisation, si AWS Lambda choisit de réutiliser le conteneur lorsque la fonction Lambda est à nouveau invoquée. Cette approche de réutilisation des conteneurs a les implications suivantes:
Toutes les déclarations dans votre code de fonction Lambda restent initialisées, offrant une optimisation supplémentaire lorsque la fonction est à nouveau invoquée. Par exemple, si votre fonction Lambda établit une connexion à la base de données, au lieu de rétablir la connexion, la connexion d'origine est utilisée dans les appels suivants. Vous pouvez ajouter de la logique dans votre code pour vérifier si une connexion existe déjà avant d'en créer une.
Chaque conteneur fournit de l'espace disque dans le répertoire/tmp. Le contenu du répertoire reste lorsque le conteneur est gelé, fournissant un cache transitoire qui peut être utilisé pour plusieurs appels. Vous pouvez ajouter du code supplémentaire pour vérifier si le cache contient les données que vous avez stockées.
Les processus en arrière-plan ou les rappels initiés par votre fonction Lambda qui ne se terminaient pas à la fin de la fonction reprennent si AWS Lambda choisit de réutiliser le conteneur. Vous devez vous assurer que tous les processus d'arrière-plan ou rappels (dans le cas de Node.js) dans votre code sont terminés avant que le code ne se termine.
Comme vous pouvez le voir, il n'y a absolument aucun avertissement sur les conditions de concurrence entre plusieurs appels simultanés d'une fonction Lambda lorsque vous essayez de tirer parti de la réutilisation des conteneurs. La seule remarque est "ne vous y fiez pas!".
Tirer parti de la réutilisation du contexte d'exécution est certainement une pratique lorsque vous travaillez avec AWS Lambda (voir Meilleures pratiques AWS Lambda ). Mais cela ne s'applique pas aux exécutions simultanées car pour l'exécution simultanée un nouveau conteneur est créé et donc un nouveau contexte. En bref, pour les exécutions simultanées si un gestionnaire modifie la valeur, l'autre n'obtiendra pas la nouvelle valeur.