AWS Lambda: Otimização com HTTP keep-alive
Eduardo Rabelo
Posted on August 15, 2019
Recentemente assisti a uma excelente palestra de Matt Lavin sobre dicas de otimização para AWS Lambda e vi um slide fazendo o DynamoDB usar o HTTP keep-alive. Isso me lembrou de uma conversa que tive com Sebastian Cohnen, então comecei a testar o efeito dessa simples otimização.
Sobre o que é tudo isso?
O que acontece é, o agente HTTP padrão do Node.js não usa o keep-alive e, portanto, cada solicitação teria o custo de configurar uma nova conexão TCP. Isso é claramente ineficiente, já que você precisa realizar um handshake de três vias para estabelecer uma conexão TCP. Para operações que são de curta duração (como operações do DynamoDB, que geralmente são concluídas em um único dígito ms), a sobrecarga de latência de estabelecer a conexão TCP pode ser maior que a operação em si.
Com o AWS SDK do Node.js, você pode substituir o agente HTTP que será usado em TODOS os clientes com apenas algumas linhas de código. Você também pode substituir as configurações dos clientes de modo individual.
Os testes
Para testar o efeito de ativar o HTTP keep-alive, eu configurei uma função Lambda simples por trás do API Gateway. Essencialmente, essa função coloca um item em uma tabela do DynamoDB, e é isso!
Para esse experimento, eu queria ver como o HTTP keep-alive se saiu em várias invocações e qual a diferença que temos com essa simples mudança.
Os resultados
Sem o HTTP keep-alive, a operação do DynamoDB era em média de 33ms.
Com o HTTP keep-alive, essa média cai para cerca de 10ms.
Como suspeitamos, a sobrecarga (33ms-10ms = 23ms) foi maior que o custo da operação em si. A experiência mostra que a conexão é reutilizada em várias invocações eficientemente. Com uma mudança muito simples, conseguimos melhorar o tempo de execução em ~20ms ou, para aumentar ainda mais, reduzir o tempo de resposta em 70%. Isso é bom retorno sobre o investimento no meu checklist de desenvolvimento, mas a diferença ainda não é perceptível ao olho humano.
Mas e se escalarmos isso para 10 operações seqüenciais do DynamoDB em uma única função?
Com o HTTP keep-alive, o tempo de execução da função é em torno de 60ms.
Sem o HTTP keep-alive, o tempo médio de execução aumenta para 180 ms.
Para finalizar, a diferença de 120ms é definitivamente perceptível. Essa diferença pode começar a afetar a experiência do usuário e, como a Amazon descobriu há 10 anos, a adição de 100ms de latência pode reduzir as vendas em até 1%.
Créditos
- Lambda optimization tip — enable HTTP keep-alive, escrito originalmente por @theburningmonk
Posted on August 15, 2019
Join Our Newsletter. No Spam, Only the good stuff.
Sign up to receive the latest update from our blog.