AWS lambda et Java simultanéité

Il est connu que AWS lambda peut début de la réutilisation des objets créés des gestionnaires, et qu'il fait vraiment (voir FAQ):

Q: AWS Lambda réutilisation fonction des instances?

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éation d'une nouvelle copie. Votre code ne doit pas supposer que ce sera toujours
se produire.


La question est concernant Java la simultanéité. Si j'ai une classe pour un gestionnaire, dire:

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

donc, ça va être thread-safe d'accès et de travailler avec la variable d'objet foo ici ou pas?

En d'autres termes: peut-AWS lambda utiliser le même objet simultanément pour différents appels?

MODIFIER Ma fonction est traitée sur un événement en fonction de la source, en particulier, il est appelé par une Passerelle API méthode.

EDIT-2 ce genre de question se pose lorsque vous souhaitez mettre en place une sorte de pool de connexion à des ressources externes, donc je veux garder la connexion à la ressource externe comme une variable objet. Il fonctionne en fait comme vous le souhaitez, mais j'ai peur des problèmes de concurrence d'accès.

EDITION-3 Plus précisément, je me demandais: peut instances de gestionnaires de AWS lambda commun des tas (de mémoire) ou pas? Je tiens à préciser ce détail supplémentaire afin de prévenir des réponses à l'inscription de l'évident et de bon connues des choses à propos de java thread-safe objets.

  • OMI "conserver une instance de votre fonction et de le réutiliser", c'est exactement le même que le "même objet". Et très probablement en même temps.
  • Cela ne veut pas dire exactement en même temps. Il peut être utilisé comme les fils à l'intérieur de java ExecutorService - ils sont conservés, mais pas simultanément
  • Bien sûr, ils pourraient créer un nouveau gestionnaire d'instances par fil ou de s'assurer, sinon, ils ne sont pas utilisés simultanément, mais je ne le vois pas mentionné explicitement, n'importe où. D'autre part, il y a des morceaux comme "Le code doit être écrit dans un “apatride” style [...] les artefacts ne peuvent pas s'étendre au-delà de la durée de vie de la demande" dans la FAQ.
  • bien sûr, mais encore une fois, d'apatride, de style ne signifie pas qu'ils peuvent être pas thread-safe.
  • Quel contexte êtes-vous à l'aide de la fonction? est-il pour les flux de traitement? êtes-vous à l'aide de threads dans une fonction de gestionnaire? Si vous traitez un seul événement à la fois et il n'y a pas de threads dans la fonction de gestionnaire, ce code va être thread-safe.
  • Je l'utilise dans le contexte des centaines de requêtes par seconde. Naturellement, je n'aurais pas poser une telle question si mon contexte serait single thread.
  • Votre question n'est pas claire. si au sein de votre fonction ,vous vous assurez que votre fonction accède à la variable foo dans le thread de manière sécuritaire. Vous ne devriez pas être préoccupé par la sécurité des threads à cause de la réutilisation de la fonction lambda. Il réutilise uniquement lorsque la fonction n'est pas le traitement d'une autre demande.Un peu comme un objet de la piscine. Chaque instance de la fonction est exécutée dans un sous conteneur et est séparé.
  • ce n'est effectivement pas clair dans ma question? J'ai demandé à question précise: ça va être thread-safe utiliser les variables d'objet concernant la possibilité de réutiliser les instances de gestionnaires? Ce n'est pas clair? Quant à la deuxième partie de votre commentaire, si vous avez des liens vers exacte de la documentation où ces fonctions sont décrites, vous pouvez fournir une réponse et qu'elle sera acceptée.
  • La clarté est nécessaire si votre fonction est en cours de traitement basé sur les flux source de l'événement? La clarté est nécessaire sur ce traitement que vous faites à l'intérieur de la fonction? Je ne pouvais pas trouver toute la documentation qui répond directement à votre question, mais le lien suivant donne de bonnes informations sur la simultanéité docs.aws.amazon.com/lambda/latest/dg/concurrent-executions.html . Vous pouvez déduire de la façon dont les fonctions sont instanciés pour le traitement des demandes de l'article. Une fois que vous lisez et heureux avec la documentation, je vais faire une réponse.
  • Ok, j'ai édité ma question: ma fonction est traitée à l'événement en fonction de la source, c'est notamment invoquée par la Passerelle API méthode. Je veux garder la connexion à des ressources externes. Il fonctionne, mais je veux savoir, serait-il généralement thread-safe.
  • Oui ur code thread-safe. Mais conn piscine est une mauvaise idée, parce que d'une fonction lambda cycle de vie peut mettre fin à l'instance en tout temps.. pour les connexions sur la piscine ne sera pas gracieusement à proximité.vérifiez ce fil de discussion sur aws forum forums.aws.amazon.com/thread.jspa?threadID=216000
  • Je suis en parlant plus spécifiquement de la base de données conn piscines. Http conn piscines peuvent toujours être d'accord.
  • Et que suggérez-vous à la place? Ne pas utiliser lambda?

InformationsquelleAutor Andremoniy | 2016-06-24