Ma fonction Java AWS Lambda ne fonctionne pas de manière optimale. Pourquoi cela se produit-il et comment puis-je réduire l'initialisation et la latence de durée de ma fonction Java ?
Brève description
Deux facteurs principaux peuvent être à l'origine d'une latence élevée dans une fonction Java Lambda :
Chargement de classe Lazy de machine virtuelle Java (JVM)
Pour réduire l'utilisation de la mémoire, JVM retarde l'initialisation d'une bibliothèque de classes Java jusqu'à ce que la bibliothèque soit appelée pour la première fois dans une application. Ce délai peut entraîner un nombre élevé d'opérations entrées-sorties (I/O), ce qui provoque des latences de durée plus élevées pour les premiers appels dans un environnement d'exécution Lambda.
L'API Java Reflection
L'API Java Reflection permet au code Java de découvrir des informations sur d'autres classes, interfaces, champs et méthodes, puis d'opérer sur leurs valeurs sous-jacentes. Certaines optimisations JVM ne peuvent pas être effectuées, étant donné que la réflexion implique des types résolus de manière dynamique. Par conséquent, les opérations réfléchissantes ont des performances plus lentes que leurs homologues non réfléchissants.
Pour optimiser les performances de votre fonction Java Lambda, vous pouvez implémenter une ou plusieurs des meilleures pratiques décrites dans le présent article.
Remarque : pour voir une étude de cas spécifique, regardez AWS Re:Invent 2019 : meilleures pratiques pour AWS Lambda et Java.
Résolution
Configurer la simultanéité allouée pour votre fonction Lambda
La simultanéité allouée initialise un nombre d'environnements d'exécution demandés afin qu'ils soient prêts à répondre immédiatement aux appels de votre fonction. Pour configurer la simultanéité allouée pour votre fonction, suivez les instructions de la section Configuration de la simultanéité allouée.
Pour plus d'informations, consultez Gestion de la simultanéité pour une fonction Lambda.
Remarque : la configuration de la simultanéité allouée entraîne des frais sur votre compte AWS. Vous pouvez configurer la simultanéité allouée sur une version d'une fonction ou sur un alias de fonction Lambda.
Initialisez la logique statique de votre fonction en dehors du gestionnaire de fonctions
Lorsque vous initialisez une fonction Lambda, Lambda alloue un pic de capacité CPU hôte pendant 10 secondes maximum. En raison de ce pic du processeur, il est recommandé d'effectuer les opérations suivantes en dehors du gestionnaire de fonctions :
- Importer des bibliothèques et des dépendances
- Paramétrer la configuration
- Initialiser des connexions à d'autres services
Cette initialisation statique permet d'initialiser ces ressources une fois par environnement de test (sandbox), puis de les réutiliser pour tous les appels futurs dans l'environnement d'exécution.
Pour plus d'informations, consultez Optimisation de l'initialisation statique.
Effectuez des appels d'API vers toutes les bibliothèques à chargement Lazy en dehors du gestionnaire de fonctions
Pour éviter le chargement Lazy des bibliothèques pendant l'initialisation, vous pouvez effectuer des appels d'API fictifs vers n'importe quelle bibliothèque à chargement Lazy en dehors du gestionnaire de fonctions. Ces appels fictifs initialisent les bibliothèques et préchauffent le kit SDK que vous utilisez.
Remarque : les appels fictifs vers des bibliothèques à chargement Lazy peuvent échouer si Lambda ne dispose pas des informations requises pour un appel d'API réussi. Si l'appel échoue, assurez-vous d'avoir détecté l'erreur.
Réduisez les opérations réfléchissantes dans votre code Lambda
Les opérations réfléchissantes ont des performances plus lentes que leurs homologues non réfléchissants. Évitez les opérations réfléchissantes dans les sections de code fréquemment appelées.
Réduire le nombre de classes dans votre application
La réduction de la taille de votre package de déploiement à ses besoins d'exécution réduit le temps nécessaire à l'appel de votre fonction.
Pour plus d'informations, consultez Bonnes pratiques d'utilisation des fonctions AWS Lambda.
Définissez les paramètres de configuration de votre fonction Lambda à l'avance
La définition préalable des paramètres de configuration de votre fonction réduit l'invocation et la latence de durée de votre fonction. Si vous ne spécifiez pas de variables de configuration dans votre code, Lambda prend plus de temps pour découvrir les variables par défaut de votre fonction.
Pour plus d'informations, consultez la section Code de fonction de Bonnes pratiques d'utilisation des fonctions AWS Lambda.
Mise à jour vers AWS Java SDK 2.0
Pour plus d'informations, consultez Tuning the AWS Java SDK 2.x to reduce startup time.
Remarque : le kit AWS SDK Java 2.0 inclut le client HTTP Apache et le client Netty HTTP par défaut, ainsi que le client Java HTTP URL Connection. Un bonne pratique consiste à supprimer les clients HTTP Apache et Netty de votre package de déploiement s'ils ne sont pas nécessaires pour votre cas d'utilisation.