Otimizar a rede (2a geração)
As funções do Cloud Functions são bem simples e permitem desenvolver um código rapidamente e executá-lo em um ambiente sem servidor. Em escala moderada, o custo de executar funções é baixo, e otimizar seu código pode não parecer uma prioridade tão urgente. No entanto, à medida que a implantação evolui, otimizar o código passa a ser cada vez mais importante.
Neste documento, descrevemos como otimizar a rede para as funções. Veja a seguir alguns dos benefícios da otimização de rede:
- Reduz o tempo de CPU gasto para estabelecer novas conexões de saída em cada chamada de função.
- Reduz a probabilidade de ficar sem conexão ou cotas de DNS.
Como manter conexões permanentes
Nesta seção, você verá exemplos sobre como manter conexões permanentes em uma função. As cotas de conexão poderão se esgotar rapidamente caso você não faça isso.
Os seguintes cenários são abordados nesta seção:
- HTTP/S
- APIs do Google
Solicitações HTTP/S
Veja abaixo no snippet de código otimizado como manter conexões permanentes em vez de criar uma nova conexão a cada invocação de função:
Node.js
Python
Go
PHP
Recomendamos o uso do framework HTTP PHP do Guzzle para enviar solicitações HTTP, já que ele processa conexões persistentes automaticamente.
Como acessar APIs do Google
O Cloud Pub/Sub foi usado neste exemplo, mas esta abordagem também funciona em outras bibliotecas de cliente, como a Cloud Natural Language ou a Cloud Spanner. As melhorias no desempenho podem depender da implementação atual de algumas bibliotecas de cliente.
Criar um objeto de cliente PubSub resulta em uma conexão e duas consultas DNS por invocação. Para evitar conexões e consultas DNS desnecessárias, crie o objeto de cliente PubSub no escopo global, conforme mostrado no exemplo a seguir:
Node.js
Python
Go
Redefinições de conexão de saída
Os streams de conexão da função para a VPC e a Internet podem ser encerrados ocasionalmente e substituídos quando a infraestrutura subjacente for reiniciada ou atualizada. Se o aplicativo reutilizar conexões de longa duração, recomendamos configurá-lo para restabelecer as conexões e evitar a reutilização de uma conexão inativa.
Como testar a carga da sua função
Para analisar quantas conexões a função realiza em média, basta fazer a implantação dela como uma função HTTP e usar uma biblioteca de testes de desempenho para invocá-la em determinada taxa de QPS. Uma opção possível é o Artillery, que pode ser invocado com uma única linha:
$ artillery quick -d 300 -r 30 URL
Este comando busca o URL fornecido em 30 QPS durante 300 segundos.
Depois de executar o teste, verifique o uso da cota de conexão na página de cota da API Cloud Functions no Console do Cloud. Se o uso for consistente em torno de 30 (ou múltiplos de 30), você está estabelecendo uma (ou várias) conexões a cada invocação. Depois de otimizar seu código, você verá algumas conexões (10 a 30) ocorrerem apenas no início do teste.
Nessa mesma página, você também pode comparar o custo de CPU antes e depois da otimização no gráfico de cota.