Entrevista de Design de Sistemas: Projete o Twitter
"Projete o Twitter" é o problema canônico de geração de feed. Parece simples — postar um tweet, ler uma timeline — mas a parte interessante é gerar a timeline inicial de cada usuário em escala, onde a resposta certa é uma estratégia híbrida de fan-out. O entrevistador quer ver você descobrir que ambas as abordagens ingênuas falham, e raciocinar até chegar à mistura.
Avance deliberadamente: esclareça os requisitos, estime a proporção de leitura/escrita, projete o armazenamento de tweets, depois a timeline — comparando fan-out-on-write com fan-out-on-read e chegando ao híbrido que trata o problema das celebridades. O guia abaixo segue esse caminho.
1. Esclarecer os requisitos
Limite-se ao problema central do feed. Usuários postam tweets, seguem outros, e leem uma timeline inicial que mescla tweets de todos que seguem, do mais novo para o mais antigo.
- Funcional: postar um tweet, seguir/deixar de seguir, timeline inicial (pessoas que você segue), timeline de usuário (um autor); busca básica fora do escopo a menos que solicitada.
- Não funcional: muito intensivo em leitura, leituras de timeline de baixa latência, alta disponibilidade; consistência eventual para a timeline é aceitável.
- Esclarecer: mídia, respostas/threads e ranking — reconheça-os, e delimite um feed cronológico para esta rodada.
2. Estimar a escala e a proporção de leitura/escrita
A proporção direciona todo o design. As leituras superam amplamente as escritas — usuários rolam a timeline com muito mais frequência do que postam. Com centenas de milhões de usuários, o sistema precisa tornar as leituras de timeline baratas, mesmo que isso torne as escritas mais caras. Essa única observação aponta para pré-computar as timelines.
3. Armazenamento de tweets
Os tweets em si são dados simples, pesados em append. Armazene-os em um armazenamento particionado horizontalmente, com chave pelo ID do tweet (com um ID ordenável por tempo, como um Snowflake ID, para que a ordenação já venha embutida). Um armazenamento separado para o grafo social guarda as relações de seguidores/seguidos.
- Tweets: armazenamento distribuído, particionado por ID do tweet; IDs ordenáveis por tempo dão uma ordenação cronológica barata.
- Grafo social: quem segue quem, otimizado para 'obter todos os seguidores de X' e 'obter todos os seguidos de X'.
- Um cache (Redis) guarda dados quentes — tweets recentes e timelines pré-computadas.
4. Geração da timeline: fan-out na escrita vs na leitura
Este é o coração do problema. Fan-out-on-write (push) insere cada novo tweet na lista de timeline pré-computada de cada seguidor no momento da postagem — as leituras da timeline se tornam uma consulta de cache barata, mas uma postagem de alguém com milhões de seguidores dispara milhões de escritas. Fan-out-on-read (pull) constrói a timeline no momento da leitura, mesclando tweets recentes de todos que você segue — escritas baratas, mas leituras caras e lentas para usuários que seguem muitas contas.
- Fan-out-on-write: leituras rápidas, escritas caras; ótimo para usuários normais.
- Fan-out-on-read: escritas baratas, leituras caras; necessário para contas com um número enorme de seguidores.
5. O problema das celebridades e o híbrido
Nenhuma abordagem pura vence, então combine-as. Use fan-out-on-write para a grande maioria dos usuários, mas para contas 'celebridade' com um número de seguidores muito grande, NÃO faça fan-out de seus tweets na escrita. Em vez disso, no momento da leitura, mescle a timeline pré-computada de um seguidor com uma busca em tempo real das poucas celebridades que ele segue. Isso limita a amplificação de escrita mantendo as leituras rápidas — a resposta que os entrevistadores esperam ouvir.
6. Trade-offs a verbalizar
Encerre com as tensões: amplificação de escrita versus latência de leitura (toda a decisão de fan-out), o custo de armazenamento das timelines pré-computadas versus recalculá-las, e a consistência — alguns segundos de atraso antes de um tweet aparecer nas timelines dos seguidores é aceitável, então a consistência eventual permite escalar. Declarar explicitamente o limiar do híbrido (como você classifica uma 'celebridade') demonstra julgamento sênior.
Pratique o design de sistemas do Twitter 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.
