Pular para o conteúdo

Arquitetura de software · Estudos de caso · 8 min de leitura

Estudo de caso: o feed de uma rede social

Montar a linha do tempo de milhões de pessoas: distribuir na escrita (fan-out) ou na leitura, e o caso especial das celebridades.

Nova postagem → Serviço de postsServiço de posts → Posts: gravagravaServiço de posts → Fila de fan-out: seguidoresseguidoresFila de fan-out → Linhas do tempo: insere IDLinhas do tempo → Serviço de feedPosts → Serviço de feed: celebridadescelebridadesServiço de feed → LeitorNova postagemNova postagemServiço de postsServiço de postsFila de fan-outFila de fan-outLinhas do tempo — cache por seguidorLinhas do tempocache por seguidorPosts — bancoPostsbancoServiço de feed — mistura e ordenaServiço de feedmistura e ordenaLeitorLeitor

Arraste para o lado para ver o diagrama inteiro.

Para quem tem milhões de seguidores, o post não é copiado: o serviço de feed busca na hora e mistura com a linha do tempo pronta.

Duas estratégias

  • Fan-out na escrita (push): ao publicar, o ID do post é inserido na linha do tempo em cache de cada seguidor. Leitura instantânea; escrita cara para quem tem muitos seguidores.
  • Fan-out na leitura (pull): ao abrir o app, busca-se os posts recentes de quem a pessoa segue e ordena-se na hora. Escrita barata; leitura pesada.

O híbrido

Use push para a maioria das contas e pull para as poucas com milhões de seguidores, misturando na leitura. Só guarde IDs nas linhas do tempo (os posts vêm de um cache próprio) e limite cada linha do tempo às últimas centenas de itens. Usuários inativos não precisam receber fan-out — monte o feed quando voltarem.

Ranking e o resto

Feeds modernos não são só cronológicos: um serviço de ranking pontua candidatos por relevância (interações, afinidade, recência) com modelos de recomendação. Contadores de curtidas são agregados de forma assíncrona; mídias vêm de armazenamento de objetos pela CDN; e o grafo social (quem segue quem) costuma ter seu próprio armazenamento otimizado.

Em resumo

Referências

Continue aprendendo

Todos os temas de arquitetura de software →