Case: Twitter feed / timeline
- ⬜🔗 Case: URL shortener(System Design Interview Prep)
Recomendamos completar os pré-requisitos antes de seguir, mas nada te impede de continuar.
A decisão que define o sistema inteiro
Projetar um feed social é escolher quando o trabalho acontece: na hora em que alguém publica, ou na hora em que alguém abre o aplicativo. Tudo o mais — banco, cache, fila — decorre dessa escolha.
A assimetria é o que torna a pergunta interessante. Num feed social típico, leituras superam escritas em duas ordens de grandeza: as pessoas abrem o aplicativo dezenas de vezes por dia e publicam uma. Isso empurra o trabalho para o lado da escrita — mas só até certo ponto, e o ponto tem nome.
| Estratégia | Como funciona | Custa | Quebra quando |
|---|---|---|---|
| Espalhar na escrita | Ao publicar, o post é copiado para a caixa de entrada de cada seguidor. Ler é buscar uma lista pronta | Escrita cara (N cópias), leitura baratíssima | Alguém com 50 milhões de seguidores publica: 50 milhões de escritas por post |
| Juntar na leitura | Nada acontece ao publicar. Ao abrir o app, busca-se os posts recentes de quem a pessoa segue e ordena-se na hora | Escrita trivial, leitura cara (N consultas + ordenação) | Usuário que segue 5 mil contas abre o app: 5 mil consultas para montar uma tela |
| Híbrido | Espalha na escrita para a maioria; para contas muito seguidas, junta na leitura e mescla | Complexidade: duas rotas de código e uma mesclagem | Praticamente não quebra — é o que sistemas reais usam |
Por que o híbrido não é "a resposta certa" que se decora
Ele só faz sentido depois de você mostrar por que cada extremo falha. Candidato que começa dizendo "usaria híbrido" pula justamente o raciocínio que a pergunta existe para avaliar.
O problema da conta muito seguida
É o caso que faz a estratégia pura desmoronar, e tem um nome próprio em toda literatura de projeto de sistemas. Espalhar na escrita significa que publicar custa uma escrita por seguidor. Para a esmagadora maioria das contas, isso é irrelevante: algumas centenas de escritas assíncronas. Para uma conta com dezenas de milhões, é um pico de tráfego que derruba o serviço.
E o custo não é só o pico. É a latência da entrega: se espalhar para 50 milhões de caixas leva minutos, os últimos seguidores da fila veem o post muito depois dos primeiros — e num evento ao vivo isso é visível para o usuário.
Por que a mesclagem é barata
Ninguém segue milhares de contas com milhões de seguidores — normalmente são poucas dezenas. Então a parte "cara" da leitura opera sobre uma lista pequena, e é essa assimetria que faz o híbrido funcionar.
O que fica na caixa de entrada
Detalhe que separa quem já implementou de quem só leu sobre: a caixa de entrada guarda identificadores, não conteúdo. Copiar o texto do post para 50 mil caixas multiplica o armazenamento por 50 mil e torna a edição impossível — corrigir um erro de digitação exigiria reescrever todas as cópias.
# Caixa de entrada: só ponteiros, ordenada por tempo
feed:{user_id} → [ (post_id, timestamp), ... ] # lista/sorted set em cache
~800 entradas, corta o que passa disso
# Montagem
1. lê os N ids da caixa (1 leitura)
2. busca os posts em lote pelos ids (1 leitura em lote)
3. busca os posts das contas grandes seguidas (paralelo, poucas)
4. mescla por timestamp, aplica ordenação, corta em 50
# Por que cortar a caixa em ~800:
ninguém rola 800 posts. Guardar histórico infinito por usuário
multiplica armazenamento sem ninguém ler.A consequência de guardar id em vez de conteúdo
A leitura passa a ter dois saltos: a caixa e depois os posts. É por isso que a caixa costuma viver em cache — o segundo salto já é uma busca em lote por chave, que qualquer armazenamento resolve rápido.
Qual é a decisão central no projeto de um feed social?
A consistência que o produto permite
Feed é um dos poucos sistemas em que a consistência fraca é aceitável pelo produto, não apenas tolerada pela engenharia. Ninguém percebe que um post apareceu três segundos depois. E essa permissão é o que libera quase todas as otimizações: espalhar em segundo plano, servir de cache, ler de réplica.
📋 Que garantia de consistência oferecer no feed
Alguns segundos de atraso para um post alheio aparecer são imperceptíveis e liberam fila, cache e réplica. A exceção é o próprio post de quem publicou: se a pessoa publica e não vê, ela acha que falhou e publica de novo. Resolve-se inserindo o post na visão dela imediatamente, sem esperar o espalhamento.
Alt: Consistência forte no feed inteiro — Elimina cache e réplica de leitura para ganhar algo que o usuário não percebe
Alt: Eventual sem exceção nenhuma — Barato, mas produz o pior bug de percepção do produto: publicar e não ver
A ordenação é outro problema, e vale dizer isso
Ordenar o feed por relevância em vez de por tempo é um sistema de recomendação inteiro, com seus próprios sinais e avaliação. Numa entrevista, delimite: "monto o feed cronológico e deixo a ordenação como camada separada" — isso mostra que você distingue os dois problemas.
Perguntas frequentes
❓ Distribuir na escrita ou na leitura?
❓ Qual é o problema da celebridade?
❓ Como paginar um feed?
Fixando
Por que contas com muitos seguidores exigem tratamento especial?
Qual consistência é aceitável num feed, e por que isso simplifica o projeto?
Terminou de ler?
Marcar como concluído registra o XP, mantém sua sequência e coloca 3 cartas deste módulo na fila de revisão espaçada.
Próximos passos sugeridos
Temas deste módulo
Discussão
Carregando comentários…