Projetando o WhatsApp em Escala Planetária: Guia Completo de System Design

Software Architect
Pós-graduado em arquitetura de software e soluções. Conecto profundidade técnica com resultados de negócio para entregar produtos que as pessoas realmente usam. Também mentoro desenvolvedores e criadores em programas ao vivo, podcasts e iniciativas de comunidade focadas em tecnologia inclusiva.
Productos gratuitos y de pago para convertir ideas en una base que puedas lanzar.
13 productos disponiblesContinúa explorando temas similares

# Projetando um Sistema Global de Notificações: Guia Completo de System Design Resumo: Um guia de arquitetura em nível de produção para plataformas de notificação multicanal (pus

# Projetando um URL Shortener em Escala: Guia Definitivo de System Design Resumo: Um guia completo para projetar um encurtador de URL como bit.ly e TinyURL, cobrindo geração de c

# Projetando o Uber em Escala: Um Guia Completo de System Design Resumo: Um guia completo de system design para construir uma plataforma de compartilhamento de corridas lidando c
Una lista de 47 puntos para encontrar errores, riesgos de seguridad y problemas de rendimiento antes del lanzamiento.
Templates probados en producción, usados por desarrolladores. Ahorra semanas de setup en tu próximo proyecto.

Resumo: Um guia de arquitetura em nível de produção para construir um sistema estilo WhatsApp com conexões persistentes, entrega online/offline, criptografia ponta a ponta, grupos em alta escala, mídia, sincronização multi-dispositivo e operação global.
Publicado: Fevereiro 2026 Tempo de leitura: 95 minutos Palavras-chave: #SystemDesign #WhatsApp #RealtimeMessaging #E2EEncryption #SignalProtocol #SistemasDistribuídos #Escalabilidade #EntrevistaTécnica
Um usuário em São Paulo envia "tô chegando" para um grupo com centenas de membros. Ao mesmo tempo:
Para o usuário, a expectativa é simples: mensagem instantânea e confiável.
Para o sistema, o problema é profundo:
Sistemas de mensageria em escala não falham por falta de tecnologia. Falham por escolhas ruins de semântica de entrega, ordenação, chaves, e operação durante incidentes.
Este guia cobre esses pontos de forma direta e aplicável.
Antes de falar em WebSocket, Kafka ou Signal, defina o escopo.
| Requisito | Meta | Motivo |
|---|---|---|
| Disponibilidade path de roteamento | 99,99% | mensageria é infraestrutura do dia a dia |
| Latência send->ack | < 150ms p99 | expectativa de instantaneidade |
| Latência fanout em grupos médios | < 500ms p99 | UX de grupo |
| Durabilidade | zero perda de mensagem confirmada | confiança do usuário |
| Privacidade | E2E por padrão | requisito central de produto |
| Eficiência energética | overhead de rede baixo | mobile-first |
Modelo prático:
Premissas deste artigo:
DAU: 1,8 bilhão
Usuários online simultâneos: 350 milhões
Mensagens/dia: 180 bilhões
Participação de grupos: 72%
Mensagens de mídia/dia: 8 bilhões
Pico: 6x
Mensagens/s média = 180.000.000.000 / 86.400 ~= 2.083.333
Pico ~= 12.500.000 msg/s
Mensagens de grupo multiplicam operações de entrega:
fanout médio efetivo por msg de grupo: 18 destinos
operações de entrega/dia ~= 180B * 0,72 * 18 ~= 2,33 trilhões
Se envelope médio for 850 bytes:
180B * 850B ~= 153TB/dia (lógico)
RF=3 => ~459TB/dia
Mídia domina custo em PB/dia, dependendo do perfil de uso.
O gargalo principal é a combinação de:
Conexão persistente é essencial para latência e bateria.
Handshake por mensagem via HTTP seria lento e caro em mobile.
Padrão:
session:user:123:device:ios-main -> gateway-17
session:user:123:device:web-2 -> gateway-203
presence:user:123 -> online,last_seen=...
CREATE TABLE devices (
user_id BIGINT NOT NULL,
device_id VARCHAR(64) NOT NULL,
device_type VARCHAR(32) NOT NULL,
identity_key BYTEA NOT NULL,
signed_prekey BYTEA NOT NULL,
status VARCHAR(16) NOT NULL,
created_at TIMESTAMP NOT NULL,
revoked_at TIMESTAMP,
PRIMARY KEY (user_id, device_id)
);
Mitigação: alerta de segurança, revogação rápida e verificação adicional em casos de risco.
Servidor roteia ciphertext, não plaintext.
{
"message_id": "msg_8ab91f",
"chat_id": "chat_772",
"sender_user_id": "u_10",
"sender_device_id": "ios_1",
"recipient_scope": {
"type": "GROUP",
"group_id": "g_50"
},
"ciphertext": "base64:...",
"encryption_meta": {
"protocol": "signal",
"sender_key_id": "sk_999"
},
"client_ts": "2026-02-22T20:10:31Z",
"server_ts": "2026-02-22T20:10:31Z"
}
SERVER_ACCEPTEDDEVICE_DELIVEREDUSER_READOrdenação absoluta global custa caro e não é necessária para UX de chat.
(sender_user_id, sender_device_id, client_message_id)
CREATE TABLE message_dedupe (
sender_user_id BIGINT NOT NULL,
sender_device_id VARCHAR(64) NOT NULL,
client_message_id VARCHAR(64) NOT NULL,
server_message_id VARCHAR(64) NOT NULL,
created_at TIMESTAMP NOT NULL,
PRIMARY KEY (sender_user_id, sender_device_id, client_message_id)
);
Em timeout, cliente reenvia mesmo client_message_id. Servidor retorna mensagem existente caso já persistida.
Pairwise puro em grupos grandes custa caro. Sistemas práticos usam otimizações estilo sender-key com políticas de rotação em mudança de membros.
CREATE TABLE groups (
group_id VARCHAR(64) PRIMARY KEY,
created_by BIGINT NOT NULL,
created_at TIMESTAMP NOT NULL,
metadata JSONB NOT NULL
);
CREATE TABLE group_members (
group_id VARCHAR(64) NOT NULL,
user_id BIGINT NOT NULL,
role VARCHAR(16) NOT NULL,
joined_at TIMESTAMP NOT NULL,
status VARCHAR(16) NOT NULL,
PRIMARY KEY (group_id, user_id)
);
| Estratégia | Pro | Contra |
|---|---|---|
| sync fanout | simples | bloqueia sender e escala mal |
| async fanout | escalável | maior complexidade |
| fanout hierárquico | bom para grupos gigantes | operação mais difícil |
Cada mudança de grupo incrementa versão. Mensagem carrega versão para detectar contexto criptográfico stale.
Mídia não deve atravessar router de texto.
Read receipts convergem por max timestamp por (chat_id, message_id, user_id).
CREATE TABLE message_receipts (
chat_id VARCHAR(64) NOT NULL,
message_id VARCHAR(64) NOT NULL,
user_id BIGINT NOT NULL,
delivered_at TIMESTAMP,
read_at TIMESTAMP,
PRIMARY KEY (chat_id, message_id, user_id)
);
Push não deve conter plaintext de chat E2E.
offline_queue:user:{user_id}:device:{device_id}
Com E2E, moderação depende muito de metadados e sinais de comportamento.
messages_per_minute por tier
new_contacts_per_day
group_creations_per_day
media_bytes_per_hour
CREATE TABLE message_envelopes (
chat_id VARCHAR(64) NOT NULL,
server_message_id VARCHAR(64) NOT NULL,
sender_user_id BIGINT NOT NULL,
sender_device_id VARCHAR(64) NOT NULL,
ciphertext BYTEA NOT NULL,
message_type VARCHAR(32) NOT NULL,
server_ts TIMESTAMP NOT NULL,
expire_at TIMESTAMP,
PRIMARY KEY (chat_id, server_message_id)
);
CREATE INDEX idx_message_envelopes_chat_ts
ON message_envelopes(chat_id, server_ts DESC);
CREATE TABLE conversations (
chat_id VARCHAR(64) PRIMARY KEY,
chat_type VARCHAR(16) NOT NULL,
created_at TIMESTAMP NOT NULL,
metadata JSONB NOT NULL
);
hash(chat_id)hash(user_id, device_id)user_idhash(group_id)Grupos virais podem saturar shards.
Mitigações:
| Domínio | SLI | SLO |
|---|---|---|
| send accept | p99 latência | < 150ms |
| entrega online | p99 | < 300ms |
| enqueue offline | sucesso | > 99,99% |
| durabilidade | perda de msg confirmada | 0 |
| fanout grupo <=100 | p99 | < 500ms |
| freshness presence | lag p95 | < 8s |
Gateway:
Router:
Offline queue:
x-request-id
x-chat-id
x-message-id
x-user-id
x-device-id
| Decisão | Opção A | Opção B | Recomendado |
|---|---|---|---|
| entrega | at-most-once | at-least-once + dedupe | at-least-once + dedupe |
| ordenação | global estrita | por chat best-effort | por chat |
| fanout grupo | sync | async | async |
| mídia | inline | object storage ref | ref |
| multi-região writes | global único | ownership regional | regional |
Problema: push é best-effort, mensagens podem sumir da UX.
Correção: fila offline durável como fonte de verdade.
Problema: saturação de latência e memória.
Correção: upload/download direto em object storage.
Problema: mensagens duplicadas visíveis ao usuário.
Correção: client_message_id obrigatório + tabela dedupe.
Problema: custo enorme e disponibilidade pior.
Correção: ordenação por conversa com heurísticas no cliente.
Problema: collapse de partições e workers.
Correção: isolamento e scaling por grupo quente.
Problema: risco de privacidade e compliance.
Correção: minimização, mascaramento e ACL estrita.
Problema: device comprometido continua confiável.
Correção: revogação e rotação rápidas.
Projetar mensageria estilo WhatsApp em escala exige equilíbrio entre performance realtime e privacidade forte.
A arquitetura que funciona em produção combina:
Esse conjunto te permite responder entrevistas complexas e construir sistemas que continuam confiáveis sob carga global real.
| Componente | Responsabilidade |
|---|---|
| Realtime Gateway | conexões persistentes e auth |
| Session Directory | mapear user/device para shard |
| Message Router | validação e roteamento |
| Offline Queue | entrega para devices offline |
| Group Service | membros e fanout |
| Key Service | bundles de chave por device |
| Media Service | upload/download com URLs assinadas |
| Push Orchestrator | wake-up para fetch de pendências |
CLIENT_PENDING -> SERVER_ACCEPTED -> DEVICE_DELIVERED -> USER_READ
Você agora tem um blueprint completo para system design de mensageria estilo WhatsApp em escala de internet.