Networking para Engenheiros de Backend
Entenda os conceitos essenciais de networking que engenheiros de backend precisam para uma comunicação confiável entre serviços e para troubleshooting.
Por que Redes Importam para Engenheiros de Backend
Sistemas de backend não operam de forma isolada. A maior parte da funcionalidade de backend depende de máquinas se comunicando por redes.
- Serviços de backend trocam dados com outros sistemas por meio de redes.
- Cada requisição de API envolve comunicação entre máquinas.
- As condições de rede frequentemente influenciam o desempenho e a confiabilidade do sistema.
Detalhes
Sistemas de backend são projetados para receber requisições, executar lógica e retornar respostas. Na prática, essas requisições geralmente se originam de outras máquinas, e não do mesmo computador onde o backend está em execução.
Quando um usuário interage com uma aplicação web ou mobile, o dispositivo dele envia uma requisição pela internet para um servidor remoto. Essa requisição passa por vários componentes de rede antes de chegar à aplicação de backend.
Sistemas de backend também se comunicam internamente. Um serviço pode chamar outro serviço, consultar um servidor de banco de dados ou enviar requisições para APIs externas. Todas essas interações acontecem por meio de uma rede.
Por causa disso, muitos problemas de sistema se originam do comportamento da rede, e não do código da aplicação. Chamadas de API lentas podem ser causadas por latência de rede, conexões interrompidas podem interromper requisições, e tentativas de repetição costumam ocorrer quando as respostas não chegam a tempo.
Entender como as máquinas se comunicam por redes ajuda os engenheiros a raciocinar sobre desempenho, confiabilidade e cenários de falha em sistemas distribuídos.
Como uma Requisição Chega a um Servidor
Antes que o código de backend possa processar uma requisição, o cliente precisa localizar o servidor, estabelecer uma conexão de rede e enviar a requisição por várias camadas de infraestrutura.
- Os clientes primeiro resolvem um nome de domínio em um endereço IP do servidor usando DNS.
- Uma conexão TCP estabelece um canal de comunicação confiável entre máquinas.
- Infraestrutura como load balancers roteia a requisição para um servidor de backend.
Detalhes
Quando uma aplicação cliente envia uma requisição para um sistema de backend, várias etapas de rede ocorrem antes mesmo de o código de backend começar a ser executado.
O processo normalmente começa com um nome de domínio como api.example.com. Computadores não conseguem se comunicar diretamente usando nomes de domínio, então o cliente primeiro faz uma consulta DNS para determinar o endereço IP do servidor de destino.
Depois que o endereço IP é conhecido, o cliente estabelece uma conexão TCP com essa máquina. Essa conexão cria um canal confiável para enviar dados entre o cliente e o servidor.
Após a conexão ser estabelecida, o cliente envia uma requisição HTTP. Essa requisição contém o método, os headers e quaisquer dados necessários para o sistema de backend.
Em arquiteturas modernas, a requisição frequentemente passa por um load balancer antes de chegar ao application server. O load balancer decide qual máquina de backend deve tratar a requisição, ajudando a distribuir o tráfego entre vários servidores.
Por fim, a requisição chega ao application server, onde a aplicação de backend a processa, executa a lógica de negócio e gera uma resposta que retorna ao cliente.
DNS (Sistema de Nomes de Domínio)
DNS converte nomes de domínio legíveis por humanos em endereços IP para que os computadores possam localizar servidores em uma rede.
DNS resolve nomes para IPs. O cache (mostrado no loop 2) acelera isso significativamente.
- Nomes de domínio fornecem uma forma amigável para identificar serviços.
- DNS resolve nomes de domínio nos endereços IP dos servidores.
- O cache reduz o tempo de consulta ao armazenar resultados resolvidos anteriormente.
Detalhes
Os computadores se comunicam entre si usando endereços IP numéricos, como 142.250.72.14. No entanto, os humanos interagem com serviços por meio de nomes de domínio como api.example.com, porque eles são mais fáceis de lembrar.
O Domain Name System (DNS) atua como um diretório distribuído que mapeia esses nomes de domínio para seus respectivos endereços IP. Quando um cliente quer contatar um servidor usando um nome de domínio, ele envia uma consulta DNS para determinar o endereço IP correto.
Esse processo de consulta pode envolver vários servidores DNS trabalhando juntos. O sistema eventualmente retorna o endereço IP associado ao domínio solicitado, para que o cliente saiba para onde enviar a requisição.
Para melhorar a eficiência, as respostas DNS geralmente são armazenadas em cache por sistemas operacionais, navegadores e servidores intermediários. Se uma consulta recente já existir no cache, o sistema pode reutilizar o endereço IP armazenado em vez de fazer uma nova consulta DNS.
DNS é um componente fundamental da infraestrutura da internet. Sem ele, usuários e aplicações precisariam lembrar e gerenciar manualmente endereços IP numéricos para cada serviço com o qual interagem.
Portas e Endpoints de Rede
Um endereço IP identifica uma máquina na rede, enquanto uma porta identifica o serviço específico em execução nessa máquina.
- O endereço IP informa à rede qual máquina deve receber a requisição.
- Uma porta direciona a requisição para o serviço correto nessa máquina.
- Vários serviços podem ser executados simultaneamente em um único host usando portas diferentes.
Detalhes
Depois que um cliente conhece o endereço IP de um servidor, ele ainda precisa determinar qual aplicação nesse servidor deve tratar a requisição. É aqui que as portas são usadas.
Uma porta é um endpoint lógico de comunicação em uma máquina. Enquanto o endereço IP identifica o próprio host, a porta identifica o serviço específico que está escutando conexões de entrada.
Por exemplo, um servidor web normalmente escuta na porta 80 para tráfego HTTP ou na porta 443 para tráfego HTTPS. Bancos de dados e outros serviços também usam portas conhecidas. O PostgreSQL normalmente escuta na porta 5432, enquanto o Redis frequentemente é executado na porta 6379.
Como as portas separam os serviços, uma única máquina pode executar muitas aplicações diferentes ao mesmo tempo. Um servidor backend pode hospedar uma API HTTP, um banco de dados e um serviço de cache ao mesmo tempo, cada um vinculado a uma porta diferente.
Juntos, a combinação de um endereço IP e um número de porta define um endpoint de rede. Esse endpoint identifica de forma única onde uma requisição deve ser entregue.
Conexões TCP
TCP é um protocolo baseado em conexão que garante a entrega confiável e ordenada de dados entre máquinas.
- TCP estabelece uma conexão entre duas máquinas antes de enviar dados.
- O protocolo garante a entrega confiável dos pacotes transmitidos.
- Os pacotes são reordenados se chegarem fora de sequência.
Detalhes
Transmission Control Protocol (TCP) é um dos principais protocolos de comunicação usados na internet. Ele foi projetado para fornecer comunicação confiável entre duas máquinas.
Antes que qualquer dado seja transmitido, o TCP estabelece uma conexão por meio de um processo chamado three-way handshake. O cliente começa enviando uma mensagem SYN para o servidor. O servidor responde com SYN-ACK para confirmar a solicitação e sinalizar que está pronto. Em seguida, o cliente envia uma mensagem ACK confirmando a conexão. Depois dessa troca, ambas as máquinas podem começar a enviar dados.
O TCP divide os dados em unidades menores chamadas pacotes e os transmite pela rede. Como as redes podem perder ou reordenar pacotes, o TCP inclui mecanismos que detectam dados ausentes e retransmitem pacotes, se necessário.
Outra característica importante do TCP é a ordenação dos pacotes. Mesmo que os pacotes cheguem em uma ordem diferente daquela em que foram enviados, o TCP os reagrupa corretamente antes de entregar os dados à aplicação.
Esses mecanismos tornam o TCP confiável para aplicações que exigem transferência precisa de dados, como requisições web, comunicação com bancos de dados e a maioria das interações com APIs.
TCP vs UDP
TCP prioriza confiabilidade e ordenação, enquanto UDP prioriza velocidade e sobrecarga mínima.
- TCP fornece comunicação confiável e ordenada entre máquinas.
- UDP envia mensagens rapidamente sem estabelecer uma conexão.
- A escolha depende de o que é mais importante: confiabilidade ou velocidade.
Detalhes
TCP e UDP são dois protocolos de transporte importantes usados para comunicação entre máquinas, mas resolvem problemas diferentes.
TCP (Transmission Control Protocol) foi projetado para confiabilidade. Ele estabelece uma conexão entre duas máquinas, garante que os pacotes cheguem com sucesso, retransmite dados perdidos e assegura que os pacotes sejam entregues na ordem correta. Por causa dessas garantias, o TCP é usado em aplicações em que a precisão é crítica.
Muitos sistemas de backend dependem de TCP. Protocolos da web como HTTP funcionam sobre TCP, e conexões de banco de dados também normalmente usam TCP porque a integridade dos dados é essencial.
UDP (User Datagram Protocol) adota uma abordagem diferente. Ele não estabelece uma conexão e não garante entrega nem ordenação. Em vez disso, simplesmente envia pacotes ao destino o mais rápido possível.
Como o UDP remove a sobrecarga de confiabilidade, ele é mais rápido e mais leve. Isso o torna adequado para aplicações em que alguma perda ocasional de pacotes é aceitável, como streaming de vídeo em tempo real, jogos online e muitas consultas DNS.
A compensação entre TCP e UDP é, fundamentalmente, entre confiabilidade e velocidade. Os sistemas escolhem o protocolo que melhor atende às necessidades da aplicação.
HTTP — O Protocolo de Aplicação
HTTP define como clientes e servidores estruturam requisições e respostas ao se comunicar pela web.
- HTTP segue um modelo de comunicação de requisição–resposta.
- As requisições especificam ações usando métodos HTTP como GET ou POST.
- As respostas retornam códigos de status, cabeçalhos e dados para o cliente.
Detalhes
HTTP (Hypertext Transfer Protocol) é o protocolo da camada de aplicação usado pela maioria dos sistemas web. Ele define a estrutura das mensagens trocadas entre clientes e servidores.
A comunicação segue um modelo de requisição–resposta. Um cliente envia uma requisição HTTP descrevendo o que deseja fazer, e o servidor processa essa requisição e retorna uma resposta HTTP.
As requisições incluem vários componentes. O método HTTP indica a ação pretendida, como GET para recuperar dados ou POST para enviar novos dados. A requisição também inclui cabeçalhos que carregam metadados como tokens de autenticação, tipo de conteúdo ou instruções de cache.
Depois de processar a requisição, o servidor retorna uma resposta. A resposta inclui um código de status que indica o resultado da operação. Por exemplo, 200 OK indica sucesso, enquanto códigos como 404 ou 500 sinalizam erros.
HTTP fornece a linguagem padronizada que permite que navegadores, aplicativos móveis e serviços de backend se comuniquem de forma consistente pela internet.
Latência em Sistemas Distribuídos
As requisições de rede levam tempo porque os dados precisam viajar entre máquinas e vários sistemas precisam processar a requisição.
- Os dados precisam viajar fisicamente pelas redes entre máquinas.
- Os servidores precisam de tempo para processar requisições e gerar respostas.
- Dependências adicionais, como bancos de dados, podem aumentar o tempo de resposta.
Detalhes
Latência se refere ao tempo que uma requisição leva para viajar de um cliente até um servidor e para a resposta retornar. Em sistemas distribuídos, até operações simples envolvem várias etapas que contribuem para esse atraso.
Primeiro, a requisição precisa viajar pela rede. Os dados passam por roteadores, switches e, às vezes, vários data centers antes de chegar ao servidor de destino. A distância geográfica por si só pode introduzir atrasos perceptíveis, porque os sinais levam tempo para se propagar por longas distâncias.
Depois que a requisição chega ao servidor, o sistema de backend precisa processá-la. Isso pode envolver executar a lógica da aplicação, realizar validações ou executar outras operações internas.
Muitas requisições também dependem de outros sistemas, como bancos de dados, caches ou APIs externas. Cada dependência adicional introduz seu próprio tempo de processamento e latência de rede.
Outros fatores, como congestionamento de rede ou serviços sobrecarregados, podem aumentar ainda mais a latência. Como sistemas distribuídos dependem de muitos componentes interconectados, pequenos atrasos em vários pontos podem se acumular e resultar em tempos de resposta perceptíveis.
Timeouts e Falhas de Rede
Sistemas distribuídos devem se proteger contra requisições de rede lentas ou com falha usando timeouts e mecanismos de tratamento de falhas.
- Timeouts impedem que os sistemas fiquem esperando respostas indefinidamente.
- Retries permitem que os sistemas tentem uma requisição novamente após uma falha.
- Falhas sem controle podem se propagar entre serviços e causar indisponibilidades em cascata.
Detalhes
A comunicação em rede é inerentemente não confiável. As requisições podem sofrer atraso, as conexões podem cair e os serviços podem deixar de responder. Por isso, os sistemas de backend devem ser projetados para lidar com chamadas de rede lentas ou com falha de forma segura.
Uma proteção comum é o timeout. Um timeout define o tempo máximo que um sistema vai esperar por uma resposta. Se a resposta não chegar dentro desse intervalo, a requisição é abortada e o sistema segue em frente.
Retries são outra estratégia comum. Quando uma requisição falha por causa de um problema temporário de rede, o sistema pode tentar a requisição novamente após um pequeno atraso. Isso pode ajudar a se recuperar de falhas transitórias, como interrupções breves na rede.
No entanto, os retries precisam ser controlados com cuidado. Se muitos serviços tentarem repetidamente requisições com falha, eles podem sobrecarregar os sistemas downstream e criar falhas em cascata, em que um serviço lento causa indisponibilidades generalizadas.
Por esse motivo, os sistemas modernos de backend configuram cuidadosamente timeouts, retries e estratégias de tratamento de falhas para manter a confiabilidade mesmo quando partes da rede se comportam de forma imprevisível.
Balanceamento de Carga
O balanceamento de carga distribui o tráfego de entrada entre vários servidores para que os sistemas possam lidar com uma demanda maior e permanecer confiáveis.
Balanceador
- Um balanceador de carga fica na frente de vários servidores de backend.
- As requisições de entrada são distribuídas entre os servidores disponíveis.
- Isso melhora a escalabilidade e ajuda os sistemas a permanecerem disponíveis se um servidor falhar.
Detalhes
À medida que as aplicações crescem, um único servidor muitas vezes não consegue lidar com todo o tráfego de entrada. Para atender mais usuários e manter o desempenho, os sistemas executam vários servidores de backend que fornecem a mesma funcionalidade.
Um balanceador de carga atua como ponto de entrada para as requisições de entrada. Em vez de os clientes se conectarem diretamente a servidores individuais, eles enviam requisições ao balanceador de carga. O balanceador de carga então decide qual servidor de backend deve processar cada requisição.
Essa distribuição espalha o tráfego entre os servidores, evitando que qualquer máquina fique sobrecarregada. Diferentes algoritmos podem ser usados, como distribuição round-robin, roteamento com menos conexões ou roteamento baseado em latência.
O balanceamento de carga também melhora a tolerância a falhas. Se um servidor ficar indisponível, o balanceador de carga pode direcionar o tráfego para outros servidores saudáveis para que o sistema continue funcionando.
Essa abordagem permite escalabilidade horizontal, em que os sistemas aumentam a capacidade adicionando mais máquinas em vez de fazer upgrade de um único servidor. A escalabilidade horizontal é uma estratégia fundamental para construir sistemas de backend grandes e confiáveis.
Seção de Perguntas
1 / 5
Esta lição faz parte do conteúdo premium
Faça upgrade para o plano premium para remover o desfoque e liberar a leitura completa.