J'utilise context.logStreamName
pour identifier l'instance lambda. La concurrence est définie sur sans réserve. Mais si le journal montre que seulement 50 instances fonctionnent.
Suis-je mal compris le logStream (pré-instance de logStream)? J'avais obtenu les informations de ce blog
Voici mon code correspondant:
b4afda96edf04e07ab819589d298521d 3 StatusCode: 200 50 a1ef1f4b518d47398daedda434ddd48c 3 StatusCode: 200 50 8dedc647796545ada94770895a8b190a 3 StatusCode: 200 50 7c4f48d72de0486e86e47c76ed3269ec 3 StatusCode: 200 50 2aa1f0dc9b0440fcac3d3127d123edb8 3 StatusCode: 200 50 3d1abeb38e7a45a4b933b669ad0c12d7 3 StatusCode: 200 50 531883ce26ac43b9bb0976726a2e5aa6 3 StatusCode: 200 50 cb9d0611a2e24244bd9ee98967a768c2 3 StatusCode: 200 50
I console.log (context.logStreamName) code > sur ma fonction lambda et utilisez
RegExp
pour déformer l'ID d'instance.
Le journal de fin continue d'afficher la sortie ci-dessous:
let instances = {}; for (let i = 0; i < each_invokes; i++) { lambda.invoke(params, function (err, data) { if (err) { console.log(err, err.stack); } else { // console.log(data); let logs = Buffer.from(data.LogResult, 'base64').toString('utf8'); let instanceID = logs.match(new RegExp("\\$InstanceID: (.*?) \\$END", "ig"))[0].split(" ")[1]; if (instanceID) { if (instances.hasOwnProperty(instanceID)) { instances[instanceID] += 1 } else { instances[instanceID] = 0 } console.log(instanceID, instances[instanceID], 'StatusCode:', data.StatusCode); } else { console.log('missing instanceID:', data.StatusCode) } } console.log(Object.keys(instances).length) }); }
Cela signifie-t-il donc que l'AWS lambda ne peut exécuter que 50 instances? Si tel est le cas, comment puis-je augmenter le nombre de simultanéité dans AWS Lambda?
3 Réponses :
À compter de juin 2019, les exécutions simultanées Lambda sont définies sur 1000 .
AWS impose des limites de service sur ses ressources pour divers les raisons. La plupart des limites peuvent être levées ou augmentées avec un augmentation de la limite de service sur votre console .
Lambda a une page spéciale décrivant ses limites et une explication sur la façon de comprendre comment Lambda évolue . Seules la concurrence
et le stockage des fonctions et des couches
peuvent être augmentés.
Nous avons besoin de plus d'informations sur votre problème pour déterminer pourquoi vous êtes limité à 50.
Si je devais deviner, je pense que vous accédez à un journal CloudWatch via GetMetricData, qui a une limite de 50 par seconde?
Le context.logStreamName
semble lié à CloudWatch, mais je n'utilise pas GetMetricData. Je suis document officiel pour accéder le journal de fin de aws-sdk
Hey Bruce, pouvez-vous mettre à jour votre question avec plus de détails sur la manière exacte dont votre Lambda est invoqué ou déclenché? Cela pourrait fournir des indices sur la limite de 50. Merci!
Salut @Taterhead. Ma fonction lambda est comme la exemple de fonction < / a>. Je publierais ma fonction d'invocation sur ma question. Maintenant, je trouve un autre problème que si je règle simultané en dessous de 100 (par exemple 10), une fois que j'envoie plus de 10 demandes à lambda. Cela lancera une erreur TooManyRequestsException
. Je ne sais pas s'il s'agit d'une limite par défaut pour mon compte ou simplement de mon erreur. Enquête toujours. Merci!
ok @Bruce, j'ai une autre suggestion: supprimez toutes les limites simultanées de votre fonction. Reportez-vous ensuite à cette page: docs.aws.amazon. com / lambda / latest / dg /… - Cloudwatch est le service de journalisation officiel pour AWS et vous indiquera le nombre réel de lambdas simultanés en cours d'exécution. Je vais essayer d'écrire une réponse qui vous montre comment enregistrer le nombre de lambdas simultanés en cours d'exécution et voir le vrai nombre sur le tableau de bord. Mon intuition est que même si votre journal indique 50, vous en exécutez en fait 1000. Restez à l'écoute.
Je pense que l'une des raisons pour lesquelles j'ai obtenu 50 journaux d'instance est l'équilibre entre le temps de latence du dernier processus de fonction lambda et l'heure du prochain démarrage à froid. Le paramètre de configuration de la concurrence ne me dit pas qu'il démarrera instantanément 1000 comptes simultanés non réservés. Il reçoit 1000 demandes, mais une fois qu'il sera immédiatement libéré pour la prochaine demande, il n'est donc pas nécessaire de démarrer à froid une autre instance. Mais je ne sais pas si c'est vrai ou non.
L'autre raison que je peux confirmer est la limite par défaut d'AWS.
/ p>
"AWS Lambda a une limitation de sécurité par défaut de 100 exécutions simultanées par compte et par région. Si vous souhaitez soumettre une demande pour augmenter la limitation de 100 exécutions simultanées, vous pouvez visiter notre centre de support ..."
Je n'ai pas trouvé la documentation officielle mais j'ai trouvé la limite manuellement:
Lorsque je règle la concurrence sur 100, puis que je lance deux scripts d'appel sur la machine locale, chacun des scripts envoie 500 appels simultanément. Il recevra le journal des résultats dans une file d'attente. Le nombre d'instances dans le journal augmentera progressivement jusqu'à 100 instances, et non 50 instances, ce qui est le résultat d'un script d'appel.
Mais que se passe-t-il si la concurrence est de 100 mais que je lance trois scripts d'appel? Va-t-il démarrer 150 instances? Non, cela lancera l'erreur TooManyRequestsException
.
Ce test n'est pas rigoureux, toujours en cours d'investigation. Bien que ce ne soit pas un problème sérieux sur la production, je veux vraiment comprendre pourquoi ce problème s'est posé.
<₹-- MISE À JOUR--
Q: Y a-t-il une limite au nombre de fonctions AWS Lambda que je peux exécuter à la fois?
Non. AWS Lambda est conçu pour exécuter de nombreuses instances de vos fonctions en parallèle. Cependant, AWS Lambda a une limitation de sécurité par défaut de 100 exécutions simultanées par compte et par région. Si vous souhaitez soumettre une demande pour augmenter la limitation de 100 exécutions simultanées, vous pouvez visiter notre Centre d'assistance, cliquer sur «Ouvrir un nouveau cas» et déposer une demande d'augmentation de la limite de service.
Q: Que se passe-t-il si mon compte dépasse la limite de régulation par défaut pour les exécutions simultanées?
En cas de dépassement de la limite de limitation, les fonctions AWS Lambda appelées de manière synchrone renverront une erreur de limitation (code d'erreur 429). Les fonctions Lambda appelées de manière asynchrone peuvent absorber des rafales de trafic raisonnables pendant environ 15 à 30 minutes, après quoi les événements entrants seront rejetés comme limités. Si la fonction Lambda est appelée en réponse à des événements Amazon S3, les événements rejetés par AWS Lambda peuvent être conservés et retentés par S3 pendant 24 heures. Les événements des flux Amazon Kinesis et des flux Amazon DynamoDB sont retentés jusqu'à ce que la fonction Lambda réussisse ou que les données expirent. Amazon Kinesis et Amazon DynamoDB Streams conservent les données pendant 24 heures.
<₹---UPDATE---
Comme cela a été mentionné par moi et Matus Dubrava, j'ai géré la complexité de ma fonction lambda pour surveiller l'exécution de la fonction. Les statistiques s'affichent ci-dessous:
Nous pouvons clairement voir qu'il existe une relation entre la durée (300k max) et les exécutions simultanées (j'ai mis la concurreny max à 100).
Hormis cette limite souple de 1000 exécutions simultanées, il y a d'autres choses à considérer.
Si vous utilisez des fonctions lambda pour traiter des événements qui ne sont pas basés sur des sondages, le nombre réel de fonctions que vous pouvez exécuter à un moment donné n'est pas de 1000. La formule pour calculer le nombre est
appels par seconde * durée moyenne d'exécution en secondes
Ce qui signifie que si votre fonction met 20 secondes en moyenne à s'exécuter, le nombre d'instances de cette fonction que vous pouvez exécuter simultanément est de 1000/20, ce qui équivaut à 50.
Je ne dis pas que c'est exactement le cas avec votre code, mais c'est certainement quelque chose à considérer lorsque vous travaillez avec des limites lambda.
Si nous parlons de fonctions basées sur des sondages (Lambda intégré aux flux Kinesis, flux DynamoDB), alors une autre chose qui entre en jeu est le nombre de fragments dans le flux. Chaque partition du flux peut être traitée par au plus 1 instance d'une fonction lambda particulière à la fois (notez que différentes fonctions lambda peuvent traiter la même partition simultanément). Donc, si vous avez 50 fragments dans votre flux, votre fonction lambda peut mettre à l'échelle jusqu'à 50 instances de celle-ci, mais la formule mentionnée ci-dessus est toujours valable, donc si votre fonction prend plus de 20 secondes pour traiter le message, le nombre d'exécutions simultanées sera moins de 50.
J'ai regardé votre code un peu plus. Il semble que le code ci-dessus soit incomplet (nécessite
lambda
,each_invokes
etparams
). Le code ci-dessus semble être le code côté appelant. Nous avons également besoin du code côté lambda. Nous sommes heureux de résoudre ce problème, veuillez publier le code minimum dont nous avons besoin pour reproduire ce problème: stackoverflow.com/help/minimal-reproducible -exemple@Taterhead
lambda
est un client déclaré par ce document ;each_invokes
est le temps de demande de concurrence, je l'ai mis à 100; params peuvent également être trouvés par le document mentionné précédemment.Hey @Bruce, le code ci-dessus est la moitié de l'histoire. Nous devons également voir le code répertorié pour votre fonction Lambda. Le code exécuté sur AWS. Nous avons juste besoin du code minimum pour pouvoir le reproduire en le limitant à 50.