Entrevista de Design de Sistemas: Conceba o WhatsApp
"Conceba o WhatsApp" testa a entrega em tempo real a uma escala massiva, o armazenamento duradouro de mensagens, a presença (online/visto por último) e o problema de gestão de ligaçõ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, conceba o percurso de ligação e entrega, decida como as mensagens são armazenadas, e depois trate o chat em grupo e os casos difíceis, como a entrega offline e a ordenação. O guia abaixo segue esse percurso.
1. Esclarecer os requisitos
Defina primeiro o âmbito. O núcleo é a mensagem um para um com entrega fiável; esclareça se o chat em grupo, os media e a encriptação de ponta a ponta fazem parte do âmbito desta ronda.
- Funcional: enviar/receber mensagens, confirmações de entrega e leitura, presença online, chat em grupo, entrega offline quando um destinatário está desligado.
- Não funcional: baixa latência, elevada disponibilidade, durabilidade (nenhuma mensagem perdida), ordenação dentro de uma conversa.
- A esclarecer: encriptação E2E e tratamento de media — reconheça-os e decida explicitamente se entram ou não no âmbito.
2. Estimar a escala
Defina os números que orientam a conceção. Suponha ~2 mil milhões de utilizadores e dezenas de milhares de milhões de mensagens por dia; isto equivale a centenas de milhares de mensagens por segundo no pico, e centenas de milhões de dispositivos ligados em simultâneo — a gestão de ligações passa a ser um problema de primeira ordem.
3. Percurso de ligação e entrega
As mensagens precisam de uma ligação persistente, não de polling de pedido/resposta. Os dispositivos mantêm um WebSocket aberto com um servidor gateway. Um componente central tem de saber qual o gateway que detém atualmente a ligação de cada utilizador, para que uma mensagem possa ser encaminhada para o servidor correto.
- Gateway WebSocket: mantém as ligações ativas dos dispositivos, trata do envio/receção.
- Registo de sessão/presença: mapeia o utilizador para o servidor gateway atual (por ex., no Redis), atualizado ao ligar/desligar.
- Encaminhamento de mensagens: o gateway do remetente procura o gateway do destinatário e reencaminha; se este estiver offline, a mensagem é colocada em fila de espera.
4. Armazenamento de mensagens e entrega offline
As mensagens têm de sobreviver a um destinatário desligado. Persista cada mensagem de forma duradoura e acompanhe o estado de entrega por destinatário; entregue de imediato se o destinatário estiver online, ou armazene e reencaminhe quando ele se voltar a ligar (store-and-forward).
Um padrão de acesso intensivo em escrita, com chave por conversa, favorece um armazenamento de colunas largas como o Cassandra (elevado throughput de escrita, escala horizontal) em vez de uma única base de dados relacional. Quando a entrega de uma mensagem é confirmada para todos os destinatários, pode ser eliminada ou deixada expirar, já que o WhatsApp não retém mensagens entregues no servidor indefinidamente.
5. Chat em grupo
As mensagens em grupo são um fan-out: um envio transforma-se em N entregas. Para tamanhos de grupo típicos, o fan-out-on-write (empurrar para o percurso de entrega de cada membro) é simples e rápido de ler. Note o trade-off — grupos muito grandes tornam o fan-out-on-write dispendioso, razão pela qual grupos de difusão enormes constituem um problema de design diferente.
6. Trade-offs a verbalizar
Termine com as tensões: ordenação (números de sequência por conversa versus ordenação global), consistência versus disponibilidade para as confirmações (a consistência eventual é aceitável para 'visto por último', mais forte para a entrega), e fan-out-on-write versus on-read para grupos. Afirmar isto 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 ajudá-lo a manter-se estruturado durante uma ronda em direto — sugerindo a próxima dimensão a abordar e mostrando os trade-offs em tempo real, tudo no seu próprio dispositivo.
