Entrevista de Design de Sistemas: Conceba o Twitter
"Conceba o Twitter" é o problema canónico de geração de feed. Parece simples — publicar um tweet, ler uma timeline — mas a parte interessante é gerar a timeline principal de cada utilizador à escala, onde a resposta certa é uma estratégia de fan-out híbrida. O entrevistador quer ver-te a descobrir que ambas as abordagens ingénuas falham, e a raciocinar até chegar à mistura.
Avance deliberadamente: esclareça os requisitos, estime a proporção leitura/escrita, conceba 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 percurso.
1. Esclarecer os requisitos
Limite-se ao problema central do feed. Os utilizadores publicam tweets, seguem outros, e leem uma timeline principal que agrega os tweets de todos os que seguem, do mais recente para o mais antigo.
- Funcional: publicar um tweet, seguir/deixar de seguir, timeline principal (pessoas que segue), timeline de utilizador (um autor); pesquisa básica fora do âmbito a menos que solicitada.
- Não funcional: muito intensivo em leitura, leituras de timeline de baixa latência, elevada disponibilidade; a consistência eventual para a timeline é aceitável.
- A esclarecer: media, respostas/threads e ranking — reconheça-os, e delimite um feed cronológico para esta entrevista.
2. Estimar a escala e a proporção leitura/escrita
A proporção orienta todo o design. As leituras superam largamente as escritas — os utilizadores percorrem a sua timeline muito mais vezes do que publicam. Com centenas de milhões de utilizadores, o sistema tem de tornar as leituras de timeline económicas, mesmo que isso torne as escritas mais dispendiosas. Esta única observação apunta para o pré-cálculo das timelines.
3. Armazenamento de tweets
Os tweets em si são dados simples, intensivos em acréscimo (append). Armazene-os num armazenamento particionado horizontalmente, com chave pelo ID do tweet (com um ID ordenável no tempo, como um Snowflake ID, para que a ordenação já venha incorporada). 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 no tempo dão uma ordenação cronológica económica.
- Grafo social: quem segue quem, otimizado para 'obter todos os seguidores de X' e 'obter todos os que X segue'.
- Uma cache (Redis) guarda dados quentes — tweets recentes e timelines pré-calculadas.
4. Geração da timeline: fan-out na escrita vs na leitura
Este é o cerne do problema. Fan-out-on-write (push) insere cada novo tweet na lista de timeline pré-calculada de cada seguidor no momento da publicação — as leituras da timeline tornam-se uma consulta de cache económica, mas uma publicação de alguém com milhões de seguidores desencadeia milhões de escritas. Fan-out-on-read (pull) constrói a timeline no momento da leitura, agregando os tweets recentes de todos os que segue — escritas económicas, mas leituras lentas e dispendiosas para utilizadores que seguem muitas contas.
- Fan-out-on-write: leituras rápidas, escritas dispendiosas; ótimo para utilizadores normais.
- Fan-out-on-read: escritas económicas, leituras dispendiosas; necessário para contas com um número enorme de seguidores.
5. O problema das celebridades e o híbrido
Nenhuma abordagem pura vence, por isso combine-as. Use fan-out-on-write para a grande maioria dos utilizadores, mas para contas 'celebridade' com um número de seguidores muito grande, NÃO faça fan-out dos seus tweets na escrita. Em vez disso, no momento da leitura, agregue a timeline pré-calculada de um seguidor com uma consulta em direto às poucas celebridades que segue. Isto limita a amplificação de escrita mantendo as leituras rápidas — a resposta que os entrevistadores esperam ouvir.
6. Trade-offs a verbalizar
Termine 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é-calculadas versus recalculá-las, e a consistência — alguns segundos de atraso antes de um tweet aparecer nas timelines dos seguidores é aceitável, pelo que a consistência eventual permite escalar. Declarar explicitamente o limiar do híbrido (como classifica uma 'celebridade') demonstra discernimento 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 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.
