Il est connu qu'AWS lambda peut réutiliser les objets créés au préalable par les gestionnaires, et il le fait vraiment (voir FAQ ) :
Q : AWS Lambda réutilisera-t-il les instances de fonction ?
Pour améliorer les performances, AWS Lambda peut choisir de de votre fonction et de la réutiliser pour répondre à une demande ultérieure, plutôt que de créer une nouvelle copie. Votre code ne doit pas supposer que cela se produira toujours. toujours.
La question porte sur Java
la concurrence. Si j'ai une classe pour un gestionnaire, disons :
public class MyHandler {
private Foo foo;
public void handler(Map<String,String> request, Context context) {
...
}
}
L'accès et l'utilisation de la variable objet seront-ils sûrs pour les threads ? foo
ici ou non ?
En d'autres termes : la fonction lambda d'AWS peut-elle 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 l'on souhaite mettre en place une sorte de pool de connexion à des ressources externes, et que l'on souhaite conserver la connexion à la ressource externe en tant que variable objet. Cela fonctionne en fait comme souhaité, mais je crains des problèmes de concurrence.
EDIT-3 Plus précisément, je m'interroge : Les instances des gestionnaires d'AWS lambda peuvent-elles partager un tas commun (mémoire) ou non ? ? Je dois préciser ce détail supplémentaire afin d'éviter que les réponses énumèrent des choses évidentes et connues de tous sur les objets thread-safe de Java.
0 votes
IMO "conserver une instance de votre fonction et la réutiliser" est exactement la même chose que "utiliser le même objet". Et très probablement simultanément.
0 votes
@zapl Cela ne veut pas dire exactement en même temps. Il peut être utilisé comme les threads dans java
ExecutorService
- ils sont conservés, mais ne sont pas utilisés simultanément0 votes
Bien sûr, ils pourraient créer de nouvelles instances de gestionnaires par thread ou s'assurer qu'ils ne sont pas utilisés simultanément, mais je ne vois nulle part de mention explicite à ce sujet. D'autre part, il y a des éléments comme "Le code doit être écrit dans un style "sans état" [...] les artefacts ne peuvent pas s'étendre au-delà de la durée de vie de la demande" dans la FAQ.
1 votes
@zapl Bien sûr, mais encore une fois, le style sans état ne signifie pas qu'ils ne sont pas sûrs pour les threads.
0 votes
Dans quel contexte utilisez-vous la fonction ? S'agit-il de traiter des flux ? Utilisez-vous des threads dans la fonction handler ? Si vous ne traitez qu'un seul événement à la fois et qu'il n'y a pas de threads dans la fonction handler, ce code sera sûr pour les threads.
1 votes
@Shibashis Je l'utilise dans le contexte de centaines de requêtes par seconde. Naturellement, je ne poserais pas une telle question si mon contexte était singlethreaded.
2 votes
Votre question n'est pas claire. Si dans votre fonction, vous vous assurez que votre fonction accède à la variable foo d'une manière thread safe. Vous ne devriez pas vous préoccuper de la sécurité des threads en raison de la réutilisation de la fonction lambda. Elle n'est réutilisée que lorsque la fonction n'est pas en train de traiter une autre requête, un peu comme un pool d'objets. Chaque instance de la fonction est exécutée dans un conteneur inférieur et est séparée.
2 votes
@Shibashis Qu'est-ce qui n'est pas clair dans ma question ? J'ai posé une question précise : l'utilisation de variables objet sera-t-elle thread-safe en ce qui concerne la possibilité de réutiliser des instances de handlers ? Qu'est-ce qui n'est pas clair ? En ce qui concerne la deuxième partie de votre commentaire - si vous avez des liens vers la documentation exacte où ces fonctionnalités sont décrites, vous pouvez les fournir en tant que réponse et elle sera acceptée.
0 votes
Il est nécessaire de préciser si votre fonction traite une source d'événements basée sur un flux ? Il est nécessaire de préciser le traitement que vous effectuez à l'intérieur de la fonction. Je n'ai pas trouvé de documentation qui réponde directement à votre question, mais le lien suivant donne de bonnes informations sur la concurrence docs.aws.amazon.com/lambda/latest/dg/concurrent-executions.html . Vous pouvez déduire de l'article comment les fonctions sont instanciées pour traiter les demandes. Une fois que vous aurez lu et apprécié la documentation, j'en ferai une réponse.
0 votes
@Shibashis Ok, j'ai modifié ma question : ma fonction est traitée sur une source basée sur un événement, en particulier elle est invoquée par la méthode API Gateway. Je veux garder la connexion avec les ressources externes. Cela fonctionne, mais je voudrais savoir si ce serait généralement sûr pour les threads.
0 votes
Oui, notre code sera sécurisé. Mais le pool de connexions est une mauvaise idée, car le cycle de vie de la fonction lambda peut mettre fin à l'instance à tout moment donc les connexions sur le pool ne se fermeront pas de manière gracieuse. forums.aws.amazon.com/thread.jspa?threadID=216000
0 votes
Je parle plus particulièrement des pools de connexions aux bases de données. Les pools de connexions http peuvent toujours convenir.
0 votes
Et que suggérez-vous à la place ? De ne pas utiliser de lambda ?