Entrevista de Design de Sistemas: Projete o WhatsApp
"Projete o WhatsApp" testa a entrega em tempo real em escala massiva, o armazenamento durável de mensagens, a presença (online/visto por último) e o problema de gerenciamento de conexões de manter centenas de milhões de dispositivos ativos. Como sempre, o entrevistador quer o seu raciocínio e os seus trade-offs, não uma cópia do sistema real.
Avance de forma metódica: esclareça os requisitos, estime a escala, projete o caminho de conexão e entrega, decida como as mensagens são armazenadas, e então trate o chat em grupo e as arestas difíceis, como entrega offline e ordenação. O guia abaixo segue esse caminho.
1. Esclarecer os requisitos
Primeiro, defina o escopo. O núcleo é a mensagem um para um com entrega confiável; esclareça se chat em grupo, mídia e criptografia de ponta a ponta estão no escopo desta rodada.
- Funcional: enviar/receber mensagens, confirmações de entrega e leitura, presença online, chat em grupo, entrega offline quando um destinatário está desconectado.
- Não funcional: baixa latência, alta disponibilidade, durabilidade (nenhuma mensagem perdida), ordenação dentro de uma conversa.
- Esclarecer: criptografia E2E e tratamento de mídia — reconheça-os e decida explicitamente se entram ou não no escopo.
2. Estimar a escala
Defina os números que orientam o design. Suponha ~2 bilhões de usuários e dezenas de bilhões de mensagens por dia; isso dá centenas de milhares de mensagens por segundo no pico, e centenas de milhões de dispositivos conectados simultaneamente — o gerenciamento de conexões se torna um problema de primeira ordem.
3. Caminho de conexão e entrega
A mensagem precisa de uma conexão persistente, não de polling de requisição/resposta. Os dispositivos mantêm um WebSocket aberto com um servidor gateway. Um componente central precisa saber qual gateway mantém atualmente a conexão de cada usuário, para que uma mensagem possa ser roteada ao servidor correto.
- Gateway WebSocket: mantém as conexões ativas dos dispositivos, trata envio/recebimento.
- Registro de sessão/presença: mapeia usuário → servidor gateway atual (ex.: no Redis), atualizado ao conectar/desconectar.
- Roteamento de mensagens: o gateway do remetente consulta o gateway do destinatário e repassa; se estiver offline, a mensagem é colocada em fila.
4. Armazenamento de mensagens e entrega offline
As mensagens precisam sobreviver a um destinatário desconectado. Persista cada mensagem de forma durável e acompanhe o estado de entrega por destinatário; entregue imediatamente se o destinatário estiver online, ou armazene e repasse quando ele se reconectar.
Um padrão de acesso intensivo em escrita, com chave por conversa, favorece um armazenamento de colunas largas como o Cassandra (alto throughput de escrita, escala horizontal) em vez de um único banco relacional. Uma vez confirmada a entrega de uma mensagem a todos os destinatários, ela pode ser excluída ou expirada, já que o WhatsApp não retém mensagens entregues no servidor indefinidamente.
5. Chat em grupo
A mensagem em grupo é um fan-out: um envio se torna N entregas. Para tamanhos de grupo típicos, o fan-out-on-write (empurrar para o caminho de entrega de cada membro) é simples e rápido de ler. Note o trade-off — grupos muito grandes tornam o fan-out-on-write caro, por isso grupos de transmissão enormes são um problema de design diferente.
6. Trade-offs a verbalizar
Encerre com as tensões: ordenação (números de sequência por conversa versus ordenação global), consistência versus disponibilidade para confirmações (eventual é aceitável para 'visto por último', mais forte para entrega), e fan-out-on-write versus on-read para grupos. Apontar isso explicitamente é o que torna a resposta de nível sênior.
Pratique o design de sistemas do WhatsApp com ajuda em tempo real
O assistente de entrevistas de design de sistemas da Natively pode te manter estruturado durante uma rodada em tempo real — sugerindo a próxima dimensão a cobrir e mostrando os trade-offs em tempo real, tudo no seu próprio dispositivo.
