0

J'ai une fonction lambda qui interroge certaines tables DynamoDB et retourne des entrées dans celles-ci. L'appel à quelques reprises et tout va bien, mais je suis l'accent maintenant tester mon arrière et quand j'invoque cette fonction à plusieurs reprises dans un court laps de temps, je reçois l'erreur suivante:Impossible de créer une nouvelle erreur de thread natif lors de l'appel de la fonction lambda sur la table dynamodb - comment éviter?

"errorMessage":"unable to create new native thread","errorType":"java.lang.OutOfMemoryError" 

Je suis En utilisant les capacités d'indexation spatiale de DynamoDB, le message d'erreur semble suggérer qu'une ligne liée à la requête d'index spatial est à l'origine des problèmes. Ce sont les lignes à faire avec la géo: l'interrogation

GeoDataManagerConfiguration config = new GeoDataManagerConfiguration(ddb, "geo"); 

     GeoDataManager geoIndexManager = new GeoDataManager(config); 

     GeoPoint centerPoint = new GeoPoint(request.latitude, request.longitude); 

     QueryRadiusRequest queryRadiusRequest = new QueryRadiusRequest(centerPoint, request.radius); 

     QueryRadiusResult queryRadiusResult = geoIndexManager.queryRadius(queryRadiusRequest); 

Plus précisément si la ligne suivante semble être la racine des problèmes:

QueryRadiusResult queryRadiusResult = geoIndexManager.queryRadius(queryRadiusRequest); 

Que se passe-t-il? Pourquoi cette ligne lance-t-elle cette erreur lorsque la fonction est appelée à plusieurs reprises? À première vue, il semble que l'indexation spatiale/les recherches sur dynamoDB ne peuvent pas être invoquées en nombres élevés, ce qui n'a vraiment aucun sens, sûrement quand elle a été construite pour gérer l'échelle. Y at-il un réglage où je peux allouer plus de mémoire dans aws pour éviter ce problème?

+0

Je me demande si vous avez considéré le fait que plusieurs demandes consécutives, non simultanées dans une courte période s'exécutent souvent non seulement dans le même conteneur, mais en fait dans le même processus. D'un point de vue de haut niveau, dans cet esprit, ça ressemble moins à dynamodb, et plus comme vous ne nettoyez pas après chaque invocation, et donc la fuite de mémoire ... augmenter ainsi la mémoire disponible n'est pas l'ultime réparer. –

Répondre

0

Voir AWS Lambda Limits.

Vous avez une limite de 1 024 threads par appel et un maximum de 100 invocations par région.

Si vous atteignez cette limite dans votre seule fonction, vous pouvez définir une limite stricte en dessous de celle de votre code, ou ajouter un pool de threads et une file d'attente.

J'ai déjà écrit une fonction Lambda pour lire dans un fichier de configuration et pour tester des données de sortie vers d'autres copies de lui-même, afin de contourner ces limites.