🌍 REST APIs
~83% das APIs públicasO padrão que domina a web. A API do GitHub é um exemplo clássico de REST bem implementada — cada recurso (/repos, /issues, /pulls) é um endpoint previsível e intuitivo.
- Resources: Tudo é um recurso identificado por URL —
/api/users/42 - Verbs HTTP: GET (ler), POST (criar), PUT (atualizar total), PATCH (atualizar parcial), DELETE (remover)
- Status Codes: 200 OK, 201 Created, 400 Bad Request, 401 Unauthorized, 404 Not Found, 500 Internal Error
- Stateless: Cada requisição contém tudo que o servidor precisa — sem estado entre chamadas
- 83% das APIs públicas são REST (Postman State of APIs)
- JSON domina: 95%+ das respostas REST usam JSON
- OpenAPI/Swagger é o padrão de documentação — usado por 70%+ das empresas
- HATEOAS é o nível máximo de maturidade REST (Richardson Maturity Level 3), mas raramente implementado
✅ Boas Práticas
- Usar substantivos nos endpoints:
/usersem vez de/getUsers - Versionar a API:
/api/v1/users - Paginação em listagens:
?page=2&limit=20 - Usar status codes corretos para cada situação
❌ Anti-patterns
- Verbos na URL:
/api/deleteUser/42 - Retornar 200 para tudo com erro no body
- Endpoints que fazem coisas demais (God endpoints)
- Ignorar idempotência: PUT e DELETE devem ser idempotentes
🔮 GraphQL
Facebook reduziu dados mobile 40%Criado pelo Facebook em 2012 e open-source desde 2015. O app do Facebook carregava 15+ endpoints REST para montar o feed — com GraphQL, uma única query retorna exatamente os dados necessários.
- Schema: Contrato tipado que define todos os tipos, queries e mutations disponíveis
- Queries: Cliente pede exatamente os campos que precisa — sem over-fetching
- Mutations: Operações de escrita (criar, atualizar, deletar) com input tipado
- Resolvers: Funções que buscam os dados para cada campo do schema
✅ Quando Usar
- Apps mobile com bandwidth limitado
- Múltiplos frontends com necessidades diferentes
- Dados altamente relacionais e aninhados
❌ Quando Não Usar
- APIs simples com poucos endpoints
- Quando cache HTTP nativo é crítico
- File upload como operação principal
Cuidado com o N+1 problem: uma query GraphQL pode gerar centenas de queries SQL sem você perceber. Use DataLoader para batch requests ao banco. O Shopify enfrentou isso e criou seu próprio DataLoader em Ruby — reduziu queries de banco em 90% em alguns resolvers.
⚡ gRPC
Google: 10x mais rápido que REST+JSONFramework RPC do Google usando Protocol Buffers e HTTP/2. Fortemente tipado, com geração automática de código em 12+ linguagens. Ideal para comunicação interna entre microsserviços.
- Protobuf: Serialização binária — 3-10x menor que JSON, parsing muito mais rápido
- HTTP/2: Multiplexing, header compression, streaming bidirecional nativo
- Strongly Typed: Contratos
.protogeram código client/server automaticamente - 4 Modos: Unary, Server streaming, Client streaming, Bidirectional streaming
gRPC é ideal para service-to-service. Não tente usá-lo direto no browser (sem gRPC-Web proxy). Para APIs públicas, mantenha REST ou GraphQL na borda e use gRPC internamente. O Google, Netflix e Spotify fazem exatamente isso: REST para clientes externos, gRPC entre microsserviços.
📨 Mensageria Assíncrona
Mercado Livre: 1M+ transações/dia via KafkaComunicação via mensagens em filas ou tópicos. O produtor não espera resposta — publica um evento e segue. O checkout do Mercado Livre não espera o email de confirmação; publica um evento e segue.
- Queue (Fila): Uma mensagem vai para um único consumidor — SQS, RabbitMQ. Ideal para tarefas
- Topic (Tópico): Uma mensagem vai para todos os assinantes — Kafka, SNS. Ideal para eventos
- At-least-once: Garante entrega, mas pode duplicar — exige idempotência no consumidor
- Exactly-once: Ideal mas difícil — Kafka Transactions oferece semelhante
checkout.completed → Kafka topic
Kafka armazena com offset, replica para consumer groups
Email service, Analytics, Inventário — cada um no seu ritmo
Offset avança, mensagem processada com sucesso
Mensagens que falham repetidamente vão para a DLQ em vez de bloquear a fila. Sem DLQ, uma mensagem “envenenada” pode travar todo o pipeline. Configure: máximo de retries (ex: 3), delay entre retries (exponential backoff), alerta quando DLQ recebe mensagens. Monitore a DLQ — mensagens lá significam bugs ou dados inesperados que precisam de investigação.
🔄 Webhooks
Stripe, GitHub, SlackHTTP callbacks — um sistema notifica outro quando algo acontece. Quando um pagamento é aprovado no Stripe, seu sistema recebe um POST instantâneo em vez de ficar polling a cada 5 segundos.
- Registro: Você cadastra uma URL no provedor (ex:
https://meuapp.com/webhooks/stripe) - Trigger: Quando o evento ocorre, o provedor faz POST na sua URL com payload JSON
- Resposta: Seu servidor retorna 200 OK para confirmar recebimento
- Retry: Se falhar, o provedor tenta novamente (geralmente 3-5x com backoff)
- HMAC Signature: Sempre valide a assinatura do webhook — confirma que veio do provedor real, não de um atacante
- Idempotency Key: Webhooks podem ser entregues mais de uma vez. Use o event ID para deduplicar
- Responda rápido: Retorne 200 imediatamente e processe async. Timeout do Stripe: 20s
- Log tudo: Guarde payload + headers para debugging
✅ Fazer
- Validar assinatura HMAC antes de processar
- Usar fila interna para processar (recebe → enfileira → 200 OK)
- Implementar idempotência com event ID
- Ter endpoint de health check para o provedor
❌ Evitar
- Processar tudo na hora do request (timeout!)
- Ignorar validação de assinatura (vuln de segurança)
- Assumir entrega única (webhooks podem duplicar)
- Expor endpoint sem HTTPS
🌊 WebSockets e SSE
Figma: colaboração <50msQuando polling não basta. O Figma usa WebSockets para sincronizar cursores e mudanças em tempo real entre todos os colaboradores com latência abaixo de 50ms.
- WebSocket (Full-duplex): Cliente e servidor enviam dados simultaneamente pela mesma conexão
- SSE (Half-duplex): Servidor envia dados para o cliente via stream HTTP. Cliente usa requests normais para enviar
- Handshake: WebSocket faz upgrade de HTTP para protocolo ws://
- WebSocket: Chat, games, colaboração real-time, trading
- SSE: Feeds, notificações, dashboards, logs ao vivo
- Polling: Dados que mudam a cada minuto+, sem necessidade de real-time
Se você só precisa de server → client, SSE é muito mais simples:
- ✓ Funciona sobre HTTP normal
- ✓ Reconnect automático nativo
- ✓ Funciona com load balancers HTTP
- ✓ Event IDs para retry sem perda
🔀 API Gateway e Service Mesh
Netflix Zuul: 2B+ requests/diaSem gateway, cada serviço reimplementa auth, rate limiting e logging. A Netflix usa Zuul como API Gateway — 2 bilhões+ de requests por dia passam por ele antes de chegar aos microsserviços.
- API Gateway (Norte-Sul): Ponto de entrada para tráfego externo. Auth, rate limiting, transformação. Ex: Kong, AWS API Gateway, Zuul
- Service Mesh (Leste-Oeste): Gerencia comunicação interna entre serviços. mTLS, retry, circuit breaker. Ex: Istio, Linkerd
- Sidecar Pattern: Mesh injeta proxy ao lado de cada serviço — lógica de rede sem tocar no código
Nenhum dos dois. Comunicação direta. KISS.
API Gateway na borda. Centraliza auth e rate limiting.
Considere Service Mesh. Observabilidade e segurança interna ficam críticas.
Gateway + Mesh juntos. Netflix, Google, Uber operam neste nível.
✅ Fazer
- Centralizar cross-cutting concerns no gateway (auth, logs, CORS)
- Configurar circuit breaker para evitar cascata de falhas
- Usar health checks e retry com backoff exponencial
- Monitorar latência adicionada pelo gateway/mesh
❌ Evitar
- Colocar lógica de negócio no gateway (ele é infraestrutura!)
- Adotar Service Mesh com 5 serviços (overengineering)
- Gateway como single point of failure sem redundância
- Ignorar o overhead de latência do sidecar proxy
Parabéns! Você completou a Trilha 1 — Fundamentos de Arquitetura
Checklist dos 7 padrões de comunicação que você aprendeu:
Resources, verbs, status codes
Schema, queries, mutations
Protobuf, HTTP/2, streaming
Kafka, queues, topics, DLQ
HMAC, idempotency, callbacks
Real-time, full-duplex, streams
Norte-sul, leste-oeste, sidecar