System Design/02 - Componentes/Communication2 min
HTTP
- Que problema isso resolve?
- Quando usar / quando NÃO usar?
- Qual o principal trade-off?
- Como isso falha em produção?
Conceito
Protocolo de aplicação stateless de requisição-resposta que sustenta a web e a maioria das APIs.
Métodos
| Método | Seguro | Idempotente | Semântica |
|---|---|---|---|
GET |
Sim | Sim | Ler |
HEAD |
Sim | Sim | Ler só os headers |
POST |
Não | Não | Criar, ação não idempotente |
PUT |
Não | Sim | Substituir por completo |
PATCH |
Não | Depende | Alterar parcialmente |
DELETE |
Não | Sim | Remover |
Status codes que importam
| Faixa | Significado | Exemplos úteis |
|---|---|---|
| 2xx | Sucesso | 200, 201 Created, 202 Accepted, 204 No Content |
| 3xx | Redirecionamento | 301 permanente, 302 temporário, 304 Not Modified |
| 4xx | Erro do cliente | 400, 401 (não autenticado), 403 (não autorizado), 404, 409, 429 |
| 5xx | Erro do servidor | 500, 502, 503, 504 |
A distinção 4xx/5xx orienta retry: repetir um 4xx (exceto 429) não adianta — o pedido está errado. 5xx e 429 são candidatos a Retry com backoff.
Evolução do protocolo
| Versão | Transporte | Ganho principal |
|---|---|---|
| 1.1 | TCP | keep-alive; uma requisição por vez por conexão |
| 2 | TCP | Multiplexação, headers comprimidos, push |
| 3 | QUIC/UDP | Sem head-of-line blocking, handshake em 1 RTT |
Trade-offs
Stateless é a propriedade que torna o HTTP escalável: qualquer servidor atende qualquer requisição, o que viabiliza Horizontal Scaling e cache intermediário. O preço é que o contexto viaja em toda requisição — cookie, token, headers — inflando o tráfego.
HTTP/2 resolveu o bloqueio de linha na camada HTTP e não conseguiu resolvê-lo na camada TCP: uma perda de pacote ainda trava todos os streams multiplexados. HTTP/3 resolve movendo para QUIC, ao custo de UDP ser bloqueado por alguns firewalls corporativos.
Cache é a maior alavanca de performance que o protocolo oferece, e depende de headers corretos — assunto de Client Caching e CDN Caching.
Exemplo prático
Uma página com 100 recursos pequenos:
HTTP/1.1: 6 conexões paralelas, uma requisição por vez em cada
→ 17 rodadas sequenciais
HTTP/2: 1 conexão, 100 streams multiplexados
→ praticamente 1 rodada
É por isso que técnicas de HTTP/1.1 como sprite de imagens e concatenação de arquivos deixaram de fazer sentido — e passaram a atrapalhar, porque um bundle grande invalida inteiro quando uma linha muda, enquanto arquivos separados aproveitam o cache do que não mudou.
Relacionado
Parte de Communication · roadmap.sh/system-design