Como reduzir a latência de inicialização e de duração da invocação da minha função do Lambda no Java?

4 minuto de leitura
0

Minha função do AWS Lambda do Java não está funcionando perfeitamente. Por que isso está acontecendo e como faço para reduzir a latência de inicialização e a duração da minha função do Java?

Breve descrição

Há dois fatores principais que podem contribuir para a alta latência em uma função do Lambda no Java:

Carregamento lento de classes da máquina virtual Java (JVM)

Para reduzir o uso de memória, a JVM atrasa a inicialização de uma biblioteca de classes do Java até que a biblioteca seja chamada pela primeira vez em um aplicativo. Esse atraso pode causar um grande número de operações de entrada-saída (E/S), o que resulta em latências de duração mais alta para as primeiras invocações em um ambiente de execução do Lambda.

A API do Java Reflection

A API do Java Reflection permite que o código Java descubra informações sobre outras classes, interfaces, campos e métodos e, em seguida, opere com base em seus valores subjacentes. Como a reflexão envolve tipos que são resolvidos dinamicamente, certas otimizações da JVM não podem ser realizadas. Consequentemente, as operações refletivas têm um desempenho mais lento do que suas contrapartes não refletivas.

Para otimizar o desempenho da função do Lambda no Java, você pode implementar uma ou mais das práticas recomendadas descritas neste artigo.

Observação: para ver um estudo de caso específico, assista a AWS re:Invent 2019: práticas recomendadas para AWS Lambda e Java.

Resolução

Configurar a simultaneidade provisionada para sua função do Lambda

A simultaneidade provisionada inicializa um número solicitado de ambientes de execução para que estejam preparados para responder imediatamente às invocações de sua função. Para configurar a simultaneidade provisionada para sua função, siga as instruções em Configuring provisioned concurrency (Configurar a simultaneidade provisionada).

Para mais informações, consulte Managing concurrency for a Lambda function (Gerenciar a simultaneidade para uma função do Lambda).

Observação: a configuração da simultaneidade provisionada gera cobranças em sua conta da AWS. É possível configurar a simultaneidade provisionada em uma versão de uma função ou em um alias de função do Lambda.

Inicializar a lógica estática da sua função fora do manipulador de funções

Quando você inicializa uma função do Lambda, o Lambda aloca uma expansão da capacidade da CPU do host por até 10 segundos. Devido a essa expansão da CPU, é uma prática recomendada fazer o seguinte fora do manipulador de funções:

  • Importar bibliotecas e dependências
  • Definir configuração
  • Inicializar conexões com outros serviços

Essa inicialização estática permite que esses recursos sejam inicializados uma vez por sandbox e depois reutilizados para todas as invocações futuras no ambiente de execução.

Para mais informações, consulte Optimizing static initialization (Otimizar a inicialização estática).

Fazer chamadas da API para qualquer biblioteca carregada lentamente fora do manipulador de funções

Para evitar o carregamento lento de bibliotecas durante a inicialização, você pode fazer chamadas da API fictícias para qualquer biblioteca carregada lentamente fora do manipulador de funções. Essas chamadas fictícias inicializam as bibliotecas e pré-aquecem o SDK que você está usando.

Observação: chamadas fictícias para bibliotecas carregadas lentamente podem falhar se o Lambda não tiver as informações necessárias para uma chamada da API bem-sucedida. Se a chamada falhar, certifique-se de detectar o erro.

Reduzir as operações reflexivas em seu código do Lambda

As operações reflexivas têm desempenho mais lento do que suas contrapartes não reflexivas. Evite operações reflexivas em seções de código que são chamadas com frequência.

Reduzir o número de classes em seu aplicativo

Reduzir o tamanho do pacote de implantação às necessidades do runtime reduz o tempo necessário para invocar sua função.

Para mais informações, consulte Best practices for working with AWS Lambda functions (Práticas recomendadas para trabalhar com funções do AWS Lambda).

Definir os parâmetros de configuração da função do Lambda com antecedência

Definir os parâmetros de configuração da função com antecedência reduz a latência de invocação e duração da função. Se não for possível especificar variáveis de configuração em seu código, o Lambda levará mais tempo para descobrir as variáveis padrão para sua função.

Para mais informações, consulte a seção Function code (Código de funçã)o em Best practices for working with AWS Lambda functions (Práticas recomendadas para trabalhar com funções do AWS Lambda).

Atualizar para o AWS Java SDK 2.0

Para obter mais informações, consulte Ajustar o AWS Java SDK 2.x para reduzir o tempo de startup.

Observação: o AWS Java SDK 2.0 inclui o cliente HTTP Apache e o cliente HTTP Netty por padrão, junto com o cliente Java HTTP URL Connection. A prática recomendada é remover os clientes HTTP Apache e Netty do seu pacote de implantação se eles não forem necessários para seu caso de uso.


AWS OFICIAL
AWS OFICIALAtualizada há 3 anos