Otimize a latência da aplicação com o equilíbrio de carga

Este documento aborda as opções de equilíbrio de carga e mostra como a sua escolha de um equilibrador de carga específico no Google Cloudafeta a latência ponto a ponto.

Opções de balanceamento de carga

Consoante o tipo de tráfego enviado para a sua aplicação, tem várias opções para o balanceamento de carga externo. A tabela seguinte resume as suas opções:

Opção Descrição Fluxo de tráfego Âmbito
Balanceador de carga de aplicações externo Suporta tráfego HTTP(S) e funcionalidades avançadas, como o mapeamento de URLs e a transferência de SSL
Use um balanceador de carga de rede de proxy externo para tráfego não HTTP em portas específicas.
A sessão TCP ou SSL (TLS) é terminada nos front-ends da Google (GFEs), na extremidade da rede da Google, e o tráfego é encaminhado por proxy para os back-ends. Global
Balanceador de carga de rede de passagem externo Permite que o tráfego TCP/UDP que usa qualquer porta passe pelo balanceador de carga. Entregue através da tecnologia Maglev da Google para distribuir o tráfego pelos back-ends. Regional

Uma vez que os equilibradores de carga internos e a Cloud Service Mesh não suportam tráfego virado para o utilizador, estão fora do âmbito deste artigo.

As medições deste artigo usam o nível Premium nos níveis de serviço de rede porque o balanceamento de carga global requer este nível de serviço.

Medir a latência

Ao aceder a um Website alojado em us-central1, um utilizador na Alemanha usa os seguintes métodos para testar a latência:

  • Ping: embora o ping ICMP seja uma forma comum de medir a acessibilidade do servidor, o ping ICMP não mede a latência do utilizador final. Para mais informações, consulte o artigo Efeitos adicionais da latência de um Application Load Balancer externo.
  • Curl: o Curl mede o tempo até ao primeiro byte (TTFB). Emitir um comando curl repetidamente para o servidor.

Ao comparar os resultados, tenha em atenção que a latência nas ligações de fibra é limitada pela distância e pela velocidade da luz na fibra, que é de aproximadamente 200 000 km por segundo (ou 124 724 milhas por segundo).

A distância entre Frankfurt, Alemanha, e Council Bluffs, Iowa (a região us-central1), é de aproximadamente 7500 km. Com fibra direta entre as localizações, a latência de ida e volta é a seguinte:

7,500 km * 2 / 200,000 km/s * 1000 ms/s = 75 milliseconds (ms)

O cabo de fibra ótica não segue um caminho reto entre o utilizador e o centro de dados. A luz no cabo de fibra passa por equipamento ativo e passivo ao longo do seu percurso. Uma latência observada de aproximadamente 1,5 vezes o ideal, ou 112,5 ms, indica uma configuração quase ideal.

Comparar latência

Esta secção compara o balanceamento de carga nas seguintes configurações:

  • Sem balanceamento de carga
  • Balanceador de carga de rede de encaminhamento externo
  • Balanceador de carga de aplicações externo ou balanceador de carga de rede de proxy externo

Neste cenário, a aplicação consiste num grupo de instâncias geridas regional de servidores Web HTTP. Uma vez que a aplicação depende de chamadas de baixa latência para uma base de dados central, os servidores Web têm de estar alojados numa localização. A aplicação está implementada na região us-central1 e os utilizadores estão distribuídos por todo o mundo. A latência que o utilizador na Alemanha observa neste cenário ilustra o que os utilizadores em todo o mundo podem experimentar.

Cenário de latência.
Cenário de latência (clique para aumentar).

Sem balanceamento de carga

Quando um utilizador faz um pedido HTTP, a menos que o equilíbrio de carga esteja configurado, o tráfego flui diretamente da rede do utilizador para a máquina virtual (VM) alojada no Compute Engine. Para o nível Premium, o tráfego entra na rede da Google num ponto de presença (PoP) periférico próximo da localização do utilizador. Para o Nível padrão, o tráfego de utilizadores entra na rede da Google num PoP próximo da região de destino. Para mais informações, consulte a documentação sobre os níveis de serviço de rede.

Arquitetura sem balanceamento de carga.
Arquitetura sem balanceamento de carga (clique para aumentar).

A tabela seguinte mostra os resultados quando o utilizador na Alemanha testou a latência de um sistema sem equilíbrio de carga:

Método Resultado Latência mínima
Ping ao endereço IP da VM (a resposta é diretamente do servidor Web)
  ping -c 5 compute-engine-vm
  
  PING compute-engine-vm (xxx.xxx.xxx.xxx) 56(84) bytes of data.
  64 bytes from compute-engine-vm (xxx.xxx.xxx.xxx): icmp_seq=1 ttl=56 time=111 ms
  64 bytes from compute-engine-vm (xxx.xxx.xxx.xxx): icmp_seq=2 ttl=56 time=110 ms
  [...]
  --- compute-engine-vm ping statistics ---
  5 packets transmitted, 5 received, 0% packet loss, time 4004ms
  rtt min/avg/max/mdev = 110.818/110.944/111.265/0.451 ms
  
110 ms
TTFB
  for ((i=0; i < 500; i++)); do curl -w  /
  "%{time_starttransfer}\n" -o /dev/null -s compute-engine-vm; done
  
  0.230
  0.230
  0.231
  0.231
  0.230
  [...]
  0.232
  0.231
  0.231
  
230 ms

A latência do TTFB é estável, conforme mostrado no seguinte gráfico dos primeiros 500 pedidos:

Gráfico de latência para VM em ms.
Latência para a VM no gráfico de ms (clique para aumentar).

Quando envia um ping para o endereço IP da VM, a resposta vem diretamente do servidor Web. O tempo de resposta do servidor Web é mínimo em comparação com a latência da rede (TTFB). Isto acontece porque é aberta uma nova ligação TCP para cada pedido HTTP. É necessário um handshake de três vias inicial antes de a resposta HTTP ser enviada, conforme mostrado no diagrama seguinte. Por conseguinte, a latência observada é quase o dobro da latência de ping.

Pedido HTTP cliente/servidor.
Pedido HTTP cliente/servidor (clique para aumentar).

Balanceador de carga de rede de encaminhamento externo

Com os equilibradores de carga de encaminhamento externo, os pedidos dos utilizadores continuam a entrar na rede Google no PoP de limite mais próximo (no nível Premium). Na região onde as VMs do projeto estão localizadas, o tráfego flui primeiro através de um balanceador de carga de rede de encaminhamento externo. Em seguida, é encaminhado sem alterações para a VM de back-end de destino. O balanceador de carga de rede de encaminhamento externo distribui o tráfego com base num algoritmo de hash estável. O algoritmo usa uma combinação da porta de origem e destino, do endereço IP e do protocolo. As VMs ouvem o IP do balanceador de carga e aceitam o tráfego inalterado.

Arquitetura com um balanceador de carga de rede de passagem externo.
Arquitetura com um balanceador de carga de passagem externo (clique para aumentar).

A tabela seguinte mostra os resultados quando o utilizador na Alemanha testou a latência para a opção de equilíbrio de carga de rede.

Método Resultado Latência mínima
Envie um ping para o balanceador de carga de rede de encaminhamento externo
  ping -c 5 net-lb
  
  PING net-lb (xxx.xxx.xxx.xxx) 56(84) bytes of data.
  64 bytes from net-lb (xxx.xxx.xxx.xxx): icmp_seq=1 ttl=44 time=110 ms
  64 bytes from net-lb (xxx.xxx.xxx.xxx): icmp_seq=2 ttl=44 time=110 ms
  [...]
  64 bytes from net-lb (xxx.xxx.xxx.xxx): icmp_seq=5 ttl=44 time=110 ms
  --- net-lb ping statistics ---
  5 packets transmitted, 5 received, 0% packet loss, time 4007ms
  rtt min/avg/max/mdev = 110.658/110.705/110.756/0.299 ms
  
110 ms
TTFB
 for ((i=0; i < 500; i++)); do curl -w /
    "%{time_starttransfer}\n" -o /dev/null -s net-lb
 
 0.231
 0.232
 0.230
 0.230
 0.232
 [...]
 0.232
 0.231
 
230 ms

Uma vez que o equilíbrio de carga ocorre numa região e o tráfego é apenas encaminhado, não existe um impacto significativo na latência em comparação com a ausência de um equilibrador de carga.

Balanceamento de carga externo

Com balanceadores de carga de aplicações externos, os GFEs fazem o proxy do tráfego. Estes GFEs estão no limite da rede global da Google. O GFE termina a sessão TCP e liga-se a um back-end na região mais próxima que pode servir o tráfego.

Cenário do balanceador de carga de aplicações externo.
Cenário do balanceador de carga de aplicações externo (clique para ampliar).

A tabela seguinte mostra os resultados quando o utilizador na Alemanha testou a latência para a opção de equilíbrio de carga HTTP.

Método Resultado Latência mínima
Envie um ping para o balanceador de carga de aplicações externo
 ping -c 5 http-lb
 
 PING http-lb (xxx.xxx.xxx.xxx) 56(84) bytes of data.
 64 bytes from http-lb (xxx.xxx.xxx.xxx): icmp_seq=1 ttl=56 time=1.22 ms
 64 bytes from http-lb (xxx.xxx.xxx.xxx): icmp_seq=2 ttl=56 time=1.20 ms
 64 bytes from http-lb (xxx.xxx.xxx.xxx): icmp_seq=3 ttl=56 time=1.16 ms
 64 bytes from http-lb (xxx.xxx.xxx.xxx): icmp_seq=4 ttl=56 time=1.17 ms
 64 bytes from http-lb (xxx.xxx.xxx.xxx): icmp_seq=5 ttl=56 time=1.20 ms
 --- http-lb ping statistics ---
 5 packets transmitted, 5 received, 0% packet loss, time 4005ms
 rtt min/avg/max/mdev = 1.163/1.195/1.229/0.039 ms
 
1 ms
TTFB
 for ((i=0; i < 500; i++)); do curl -w /
    "%{time_starttransfer}\n" -o /dev/null -s http-lb; done
 
 0.309
 0.230
 0.229
 0.233
 0.230
 [...]
 0.123
 0.124
 0.126
 
123 ms

Os resultados do balanceador de carga da aplicação externo são significativamente diferentes. Quando envia um ping para o Application Load Balancer externo, a latência de ida e volta é ligeiramente superior a 1 ms. Este resultado representa a latência para o GFE mais próximo, que se encontra na mesma cidade que o utilizador. Este resultado não reflete a latência real que o utilizador experimenta quando tenta aceder à aplicação alojada na região us-central1. As experiências que usam protocolos (ICMP) diferentes do protocolo de comunicação da sua aplicação (HTTP) podem ser enganadoras.

Ao medir o TTFB, os pedidos iniciais mostram uma latência de resposta semelhante. Alguns pedidos atingem a latência mínima inferior de 123 ms, conforme mostrado no seguinte gráfico:

Latência para o balanceador de carga de aplicações externo no gráfico de ms.
Latência para o equilibrador de carga da aplicação externo no gráfico de ms (clique para aumentar).

Duas viagens de ida e volta entre o cliente e a VM demoram mais de 123 ms, mesmo com fibra reta. A latência é inferior porque os GFEs atuam como proxy do tráfego. Os GFEs mantêm ligações persistentes às VMs de back-end. Por conseguinte, apenas o primeiro pedido de um GFE específico para um back-end específico requer uma negociação tripartida.

Cada localização tem vários GFEs. O gráfico de latência mostra vários picos flutuantes na primeira vez que o tráfego atinge cada par de back-end do GFE. Em seguida, o GFE tem de estabelecer uma nova ligação a esse back-end. Estes picos refletem hashes de pedidos diferentes. Os pedidos subsequentes mostram uma latência inferior.

Pedido HTTP observado pela primeira vez versus pedido HTTP observado em seguida através do GFE.
Pedido HTTP observado pela primeira vez versus pedido HTTP observado em seguida através do GFE (clique para aumentar).

Estes cenários demonstram a latência reduzida que os utilizadores podem experimentar num ambiente de produção. A tabela seguinte resume os resultados:

Opção Tchim-tchim TTFB
Sem balanceamento de carga 110 ms para o servidor Web 230 ms
Balanceador de carga de rede de encaminhamento externo 110 ms para o balanceador de carga de rede de passagem externo na região 230 ms
Balanceador de carga de aplicações externo 1 ms para o GFE mais próximo 123 ms

Quando uma aplicação em bom estado está a publicar conteúdo para utilizadores numa região específica, os GFEs nessa região mantêm uma ligação persistente aberta a todos os back-ends de publicação. Por este motivo, os utilizadores nessa região notam uma latência reduzida no primeiro pedido HTTP se estiverem longe do back-end da aplicação. Se os utilizadores estiverem perto do back-end da aplicação, não notam uma melhoria na latência.

Para pedidos subsequentes, como clicar num link de página, não existe uma melhoria da latência, uma vez que os navegadores modernos mantêm uma ligação persistente ao serviço. Isto difere de um comando curl emitido a partir da linha de comandos.

Efeitos de latência adicionais do balanceador de carga de aplicações externo

Os efeitos observáveis adicionais com o Application Load Balancer externo dependem dos padrões de tráfego.

  • O balanceador de carga de aplicações externo tem uma latência inferior para recursos complexos do que o balanceador de carga de rede de encaminhamento externo, porque são necessárias menos viagens de ida e volta antes de uma resposta ser concluída. Por exemplo, quando o utilizador na Alemanha mede a latência através da mesma ligação transferindo repetidamente um ficheiro de 10 MB, a latência média do Network Load Balancer de passagem externo é de 1911 ms. Com o Application Load Balancer externo, a latência média é de 1341 ms. Isto poupa aproximadamente 5 viagens de ida e volta por pedido. As ligações persistentes entre os GFEs e os backends de publicação reduzem os efeitos do TCP Slow Start.

  • O Application Load Balancer externo reduz significativamente a latência adicional para um handshake TLS (normalmente, 1 a 2 viagens de ida e volta adicionais). Isto acontece porque o balanceador de carga da aplicação externo usa a transferência de carga SSL e apenas a latência para o PoP de limite é relevante. Para o utilizador na Alemanha, a latência mínima observada é de 201 ms com o balanceador de carga de aplicações externo, em comparação com 525 ms com HTTP(S) através do balanceador de carga de rede de passagem externo.

  • O Application Load Balancer externo permite uma atualização automática da sessão orientada para o utilizador para HTTP/2. O HTTP/2 pode reduzir o número de pacotes necessários através de melhorias no protocolo binário, na compressão de cabeçalhos e na multiplexação de ligações. Estas melhorias podem reduzir a latência observada ainda mais do que a observada ao mudar para o Application Load Balancer externo. O HTTP/2 é suportado pelos navegadores atuais que usam SSL/TLS. Para o utilizador na Alemanha, a latência mínima diminuiu ainda mais de 201 ms para 145 ms quando usou HTTP/2 em vez de HTTPS.

Otimizar balanceadores de carga de aplicações externos

Pode otimizar a latência da sua aplicação através do balanceador de carga de aplicações externo da seguinte forma:

  • Se parte do tráfego que publica for memorizável em cache, pode fazer a integração com a RFC do Google Cloud. A RFC do Google Cloud reduz a latência ao publicar recursos diretamente no limite da rede da Google. O Cloud CDN também usa as otimizações de TCP e HTTP do HTTP/2 mencionadas na secção Efeitos adicionais de latência do balanceador de carga de aplicações externo.

  • Pode usar qualquer parceiro de RFC com Google Cloud. Ao usar um dos parceiros do CDN Interconnect da Google, beneficia de custos de transferência de dados com desconto.

  • Se o conteúdo for estático, pode reduzir a carga nos servidores Web ao publicar conteúdo diretamente a partir do Cloud Storage através do Application Load Balancer externo. Esta opção combina-se com a RFC do Google Cloud.

  • A implementação dos seus servidores Web em várias regiões próximas dos seus utilizadores pode reduzir a latência, uma vez que o balanceador de carga direciona automaticamente os utilizadores para a região mais próxima. No entanto, se a sua aplicação for parcialmente centralizada, conceba-a para diminuir o número de viagens de ida e volta inter-regionais.

  • Para reduzir a latência nas suas aplicações, examine todas as chamadas de procedimentos remotos (RPCs) que comunicam entre VMs. Normalmente, esta latência ocorre quando as aplicações comunicam entre camadas ou serviços. As ferramentas como o Cloud Trace podem ajudar a diminuir a latência causada por pedidos de fornecimento de aplicações.

  • Uma vez que os balanceadores de carga de rede de proxy externos se baseiam em GFEs, o efeito na latência é o mesmo que o observado com o balanceador de carga de aplicações externo. Uma vez que o balanceador de carga de aplicações externo tem mais funcionalidades do que o balanceador de carga de rede de proxy externo, recomendamos a utilização de balanceadores de carga de aplicações externos para tráfego HTTP(S).

Passos seguintes

Recomendamos que implemente a sua aplicação perto da maioria dos seus utilizadores. Para mais informações sobre as diferentes opções de balanceamento de carga no Google Cloud, consulte os seguintes documentos: