Na postagem do blog Como criar, publicar e usar camadas para funções Java 21 Lambda, publicamos nossa primeira camada Lambda com Java 21. Neste artigo, criaremos o aplicativo usando essa camada Lambda e, em seguida, mediremos a inicialização a frio e a quente vezes sem SnapStart habilitado, com SnapStart habilitado e também aplicada otimização de preparação de invocação do DynamoDB. Também compararemos os resultados com nossas medições sem usar as camadas Lambda e fornecendo todas as dependências no arquivo POM que fizemos no artigo Medindo inicializações a frio e a quente com Java 21 usando diferentes configurações de memória Lambda.
Em nosso experimento usaremos o aplicativo de exemplo. Existem basicamente 2 funções Lambda definidas no modelo AWS SAM que respondem às solicitações do API Gateway e recuperam o produto por ID recebido do API Gateway do DynamoDB. Uma função Lambda GetProductByIdWithPureJava21LambdaWithCommonLayer pode ser usada com e sem SnapStart e a segunda GetProductByIdWithPureJava21LambdaAndPrimingWithCommonLayer usa preparação de invocação de solicitação SnapStart e DynamoDB.
Dependências fornecidas por meio da camada Lambda têm o escopo “fornecido” no arquivo pom.xml de nossa aplicação.
Para anexar a camada Lambda criada no artigo Como criar uma publicação e usar camadas para funções Java 21 Lambda para as funções Lambda no modelo AWS SAM, temos que adicionar o parâmetro Layers à função Lambda assim:
Type: AWS::Serverless::Function Properties: FunctionName: GetProductByIdWithPureJava21LambdaWithCommonLayer AutoPublishAlias: liveVersion Layers: - !Sub arn:aws:lambda:${AWS::Region}:${AWS::AccountId}:layer:aws-pure-java-21-common-lambda-layer:1 Handler: software.amazonaws.example.product.handler.GetProductByIdHandler::handleRequest
Substitua o ARN da camada (incluindo a versão) pelo seu próprio, que é a saída do comando da camada de publicação (aws lambda subscribe-layer-version).
Os resultados do experimento abaixo foram baseados na reprodução de mais de 100 partidas frias e aproximadamente 100.000 partidas quentes com um experimento que durou aproximadamente 1 hora. Para isso (e experimentos do meu artigo anterior) usei a ferramenta de teste de carga, ei, mas você pode usar qualquer ferramenta que quiser, como artilharia sem servidor ou Postman.
Executei todos esses experimentos dando às nossas funções Lambda 1024 MB de memória e passando a seguinte opção de compilação por meio da variável de ambiente: JAVA_TOOL_OPTIONS: "-XX: TieredCompilation -XX:TieredStopAtLevel=1" (compilação do cliente sem criação de perfil), que fornece uma experiência muito boa compensação entre os horários de inicialização a frio e a quente.
Nas tabelas abaixo também fornecerei os resultados com nossas medições sem usar as camadas Lambda retiradas do artigo Medindo partidas a frio e a quente com Java 21 usando diferentes configurações de memória Lambda para ter a comparação direta entre ambos.
A abreviatura c é para partida a frio e w é para partida a quente.
Tempos de início frio (c) e quente (w) sem SnapStart em ms:
Experimentar | cp50 | p75 | cp90 | cp99 | c p99.9 | c máx | p50 | p75 | p90 | wp99 | w p99.9 | w máximo |
---|---|---|---|---|---|---|---|---|---|---|---|---|
com camada Lambda comum | 3497.91 | 3597.18 | 3695,58 | 3800,47 | 3908.33 | 4011.71 | 5,82 | 6,72 | 8h00 | 17.97 | 55,48 | 1709.13 |
sem camada Lambda | 3157.6 | 3213,85 | 3270,8 | 3428.2 | 3601.12 | 3725.02 | 5,77 | 6,50 | 7,81 | 20,65 | 90,20 | 1423.63 |
Tempos de início frio (c) e quente (w) com SnapStart sem Priming em ms:
Experimentar | cp50 | p75 | cp90 | cp99 | c p99.9 | c máx | p50 | p75 | p90 | wp99 | w p99.9 | w máximo |
---|---|---|---|---|---|---|---|---|---|---|---|---|
com camada Lambda comum | 2047.12 | 2124.24 | 2439.49 | 2705.52 | 2735.43 | 2831.59 | 5,68 | 6h40 | 7,45 | 17.06 | 48,45 | 2139.74 |
sem camada Lambda | 1626.69 | 1741.10 | 2040,99 | 2219,75 | 2319.54 | 2321.64 | 5,64 | 6.41 | 7,87 | 21h40 | 99,81 | 1355.09 |
Tempos de início frio (c) e quente (w) com SnapStart e com invocação do DynamoDB Priming em ms:
Experimentar | cp50 | p75 | cp90 | cp99 | c p99.9 | c máx | p50 | p75 | p90 | wp99 | w p99.9 | w máximo |
---|---|---|---|---|---|---|---|---|---|---|---|---|
com camada Lambda comum | 713,88 | 766,38 | 1141.94 | 1181.41 | 1214.94 | 1215.32 | 5,59 | 6h30 | 7,39 | 16.39 | 45.09 | 574,61 |
sem camada Lambda | 702,55 | 759,52 | 1038,50 | 1169.66 | 1179.05 | 1179.36 | 5,73 | 6,51 | 7,87 | 21,75 | 92.19 | 328,41 |
Neste artigo, criamos o aplicativo usando a camada Lambda com dependências comuns e, em seguida, medimos os tempos de inicialização a frio e a quente sem o SnapStart habilitado, com o SnapStart habilitado e também aplicamos a otimização de preparação de invocação do DynamoDB e comparamos os resultados com nossas medições sem usar o Lambda camadas e fornecendo todas as dependências no arquivo POM que fizemos no artigo Medindo inicializações a frio e a quente com Java 21 usando diferentes configurações de memória Lambda.
Realizei medições com o uso de camadas Lambda comuns várias vezes para realmente confirmar o resultado do meu experimento. Mesmo que eu tivesse alguns desvios nos resultados entre essas medições, a tendência era sempre a mesma: Ao não ativar o SnapStart ou ativá-lo, mas não usar o priming da invocação do DynamoDB o inicia a frio com o uso do Lambda comum A camada foi várias centenas de milissegundos mais alta em comparação com o pacote de todas as dependências apenas no arquivo POM. Somente quando o SnapStart foi habilitado para a função Lambda e a preparação de invocação do DynamoDB foi aplicada as inicializações a frio com ambas as abordagens ficaram muito próximas, provavelmente devido ao fato de que tudo já estava no snapshot criado.
As partidas a quente da função Lambda foram bastante próximas para ambos os casos de uso (com e sem o uso das camadas Lambda) e para todos os experimentos (com e sem SnapStart habilitado) para quase todos os percentis, mas sempre obtive resultados mais altos para o valor máximo com o uso da camada Lambda comum.
No próximo artigo continuarei meus experimentos com as camadas Lambda. Desta vez criarei, publicarei e usarei a camada Lambda contendo não apenas dependências comuns (como neste artigo), mas todas as dependências necessárias para executar este aplicativo e então compararei os resultados de ambos os experimentos.
Isenção de responsabilidade: Todos os recursos fornecidos são parcialmente provenientes da Internet. Se houver qualquer violação de seus direitos autorais ou outros direitos e interesses, explique os motivos detalhados e forneça prova de direitos autorais ou direitos e interesses e envie-a para o e-mail: [email protected]. Nós cuidaremos disso para você o mais rápido possível.
Copyright© 2022 湘ICP备2022001581号-3