Pular para o conteúdo

Design clássico · Pleno

Feed de notícias

Fan-out na escrita vs. na leitura, o problema das celebridades e cache de timeline.

16 min de leitura · Conteúdo revisado em 23 de outubro de 2026

Resposta curta

Fan-out na escrita vs. na leitura, o problema das celebridades e cache de timeline. O feed de notícias mostra a cada usuário os posts recentes de quem ele segue. O trabalho difícil está em montar, para cada leitor, a lista certa em poucos instantes.

01 · CONTEXTO

O feed é uma fila de leitura

O feed de notícias mostra a cada usuário os posts recentes de quem ele segue. O trabalho difícil está em montar, para cada leitor, a lista certa em poucos instantes. Segundo o resumo do High Scalability sobre a arquitetura do Twitter em 2013, quase todo o tráfego era de leitura: cerca de 300 mil requisições por segundo liam timelines e só cerca de 6 mil por segundo eram escritas.

Essa assimetria organiza o caso inteiro. A pergunta de projeto é em que momento o trabalho de montar o feed acontece: quando o post é criado ou quando o leitor abre o aplicativo. As duas respostas têm custos diferentes, e o sistema real quase nunca escolhe só uma. O desenho precisa de balanceamento de carga na entrada, de dados particionados para o grafo de seguidores e para os posts, e de um cache que absorva as leituras repetidas.

02 · FAN-OUT NA LEITURA

Montar o feed quando o leitor pede

No modelo de fan-out na leitura (também chamado de modelo pull), nada é pré-computado. Quando o usuário abre o feed, o serviço consulta o grafo de seguidores para saber quem ele segue, busca os posts recentes de cada um e ordena o resultado. A fonte de entrevista de sistemas chama isso de fan-out na leitura: uma única requisição de leitura se desdobra em muitas outras.

  1. O leitor abre o aplicativo. O balanceador escolhe uma instância do serviço de feed, que não guarda nenhum feed pronto e precisa montá-lo agora.

    Diagrama da arquitetura: Feed por fan-out na leitura
    CLLeitor
    NWBalanceador
    CPServiço de feedmonta o feed
    DBGrafo de seguidores
    CHCache de posts
    DBBanco de posts
  2. O serviço pergunta ao grafo de seguidores quais contas esse usuário segue. Quanto mais contas, mais consultas virão a seguir.

    Diagrama da arquitetura: Feed por fan-out na leitura
    CLLeitor
    NWBalanceador
    CPServiço de feed
    DBGrafo de seguidoresquem eu sigo
    CHCache de posts
    DBBanco de posts
  3. Para cada conta seguida, o serviço procura os posts recentes no cache e, no que faltar, vai ao banco de posts. É aqui que uma leitura vira muitas, e o banco sente o peso.

    Diagrama da arquitetura: Feed por fan-out na leitura
    CLLeitor
    NWBalanceador
    CPServiço de feed
    DBGrafo de seguidores
    CHCache de poststenta primeiro
    DBBanco de postsuma busca por conta
  4. O serviço junta tudo, ordena por tempo e devolve ao leitor. A latência da resposta depende de quantas contas o usuário segue, e não do tamanho do post.

    Diagrama da arquitetura: Feed por fan-out na leitura
    CLLeitor
    NWBalanceador
    CPServiço de feedordena e devolve
    DBGrafo de seguidores
    CHCache de posts
    DBBanco de posts

A vantagem, segundo a fonte do ByteByteGo, é que os dados não são empurrados para os amigos, então não existe o problema da chave quente. A desvantagem é que buscar o feed é lento porque ele não foi pré-computado.

03 · FAN-OUT NA ESCRITA

Montar o feed quando o post nasce

O modelo oposto, de fan-out na escrita (modelo push), troca o momento do trabalho. Em vez de montar o feed quando o leitor pede, o sistema pré-computa os feeds quando os posts são criados. O leitor passa a ler uma lista já pronta, e o custo vai para a publicação, que acontece fora do caminho da requisição, por trabalhadores assíncronos.

  1. A autora publica um post. O gateway valida a chamada e a entrega ao serviço de posts, que cuida de persistir o conteúdo.

    Diagrama da arquitetura: Feed por fan-out na escrita
    CLAplicativo
    NWGateway
    CPServiço de postsrecebe o post
    DBBanco de posts
    QFila de posts
    CPTrabalhador de fan-out
    DBGrafo de seguidores
    CHCache de feeds
    CPServiço de feed
  2. O serviço grava o post no banco e publica um evento na fila. A resposta à autora não espera a distribuição aos seguidores.

    Diagrama da arquitetura: Feed por fan-out na escrita
    CLAplicativo
    NWGateway
    CPServiço de posts
    DBBanco de postspost gravado
    QFila de postsevento publicado
    CPTrabalhador de fan-out
    DBGrafo de seguidores
    CHCache de feeds
    CPServiço de feed
  3. Um trabalhador de fan-out consome o evento e consulta o grafo de seguidores para descobrir a quem o post deve chegar.

    Diagrama da arquitetura: Feed por fan-out na escrita
    CLAplicativo
    NWGateway
    CPServiço de posts
    DBBanco de posts
    QFila de posts
    CPTrabalhador de fan-outconsome o evento
    DBGrafo de seguidoreslista de seguidores
    CHCache de feeds
    CPServiço de feed
  4. O trabalhador insere o identificador do post no feed pré-computado de cada seguidor. É o ponto caro: o número de escritas cresce com o número de seguidores.

    Diagrama da arquitetura: Feed por fan-out na escrita
    CLAplicativo
    NWGateway
    CPServiço de posts
    DBBanco de posts
    QFila de posts
    CPTrabalhador de fan-outuma escrita por seguidor
    DBGrafo de seguidores
    CHCache de feedsid do post em cada feed
    CPServiço de feed
  5. Mais tarde, um seguidor abre o feed. O serviço de feed lê a lista pronta no cache, sem consultar o grafo de seguidores nem varrer contas.

    Diagrama da arquitetura: Feed por fan-out na escrita
    CLAplicativo
    NWGateway
    CPServiço de posts
    DBBanco de posts
    QFila de posts
    CPTrabalhador de fan-out
    DBGrafo de seguidores
    CHCache de feedsfeed já pronto
    CPServiço de feed
  6. A lista guarda só identificadores. O serviço busca o conteúdo desses posts no banco de posts e devolve a página ao leitor.

    Diagrama da arquitetura: Feed por fan-out na escrita
    CLAplicativo
    NWGateway
    CPServiço de posts
    DBBanco de postsconteúdo dos posts
    QFila de posts
    CPTrabalhador de fan-out
    DBGrafo de seguidores
    CHCache de feeds
    CPServiço de feed

A fonte do ByteByteGo descreve o serviço de fan-out como o que empurra o conteúdo novo para o feed dos amigos, guardado no cache para leitura rápida. O custo aparece com muitos seguidores: buscar a lista de amigos e gerar os feeds de todos é lento e demorado.

04 · CELEBRIDADES

Quando um post tem milhões de leitores

O fan-out na escrita quebra nos extremos. Para contas enormes, os trabalhadores de fan-out têm muito trabalho a fazer por post, e a fonte do Hello Interview cita um exemplo de dezenas de milhões de seguidores numa única conta. A fonte do ByteByteGo dá nome ao problema: chave quente.

A saída comum é o modelo híbrido. A fonte do Hello Interview descreve marcar a conta grande com um indicador na tabela de seguidores, em vez de escrever o post para cada seguidor, o que permite escolher fan-out na leitura ou na escrita conta a conta. O ByteByteGo faz o mesmo: para quem tem muitos seguidores, os seguidores puxam o conteúdo sob demanda. O resumo do High Scalability sobre o Twitter registra a mesma ideia: para contas muito grandes, não fazer fan-out e mesclar o conteúdo delas na hora da leitura.

  1. Para uma conta comum, o caminho é o de fan-out na escrita: o trabalhador consome o evento e insere o post no feed pré-computado de cada seguidor.

    Diagrama da arquitetura: Feed híbrido
    CLLeitor
    NWGateway
    CPServiço de feed
    CHCache de feedsfeed dos seguidores
    DBGrafo de seguidores
    CHCache de posts de contas grandes
    DBBanco de posts
    QFila de posts
    CPTrabalhador de fan-outconta comum
  2. Para uma conta grande, o indicador na tabela de seguidores faz o trabalhador pular a distribuição. O post fica só no armazenamento de posts, e o feed dos seguidores não recebe nada.

    Diagrama da arquitetura: Feed híbrido
    CLLeitor
    NWGateway
    CPServiço de feed
    CHCache de feeds
    DBGrafo de seguidoresconta marcada
    CHCache de posts de contas grandes
    DBBanco de posts
    QFila de posts
    CPTrabalhador de fan-outpula o fan-out
  3. O seguidor abre o feed. O serviço começa pela parte pré-computada, lida do cache de feeds.

    Diagrama da arquitetura: Feed híbrido
    CLLeitor
    NWGateway
    CPServiço de feedabre o feed
    CHCache de feeds
    DBGrafo de seguidores
    CHCache de posts de contas grandes
    DBBanco de posts
    QFila de posts
    CPTrabalhador de fan-out
  4. Em seguida, o serviço usa o grafo de seguidores para descobrir quais contas marcadas esse leitor segue.

    Diagrama da arquitetura: Feed híbrido
    CLLeitor
    NWGateway
    CPServiço de feed
    CHCache de feeds
    DBGrafo de seguidoresquais contas grandes
    CHCache de posts de contas grandes
    DBBanco de posts
    QFila de posts
    CPTrabalhador de fan-out
  5. O serviço busca os posts recentes dessas contas no cache de posts e, se faltar, no banco. Esse cache recebe a leitura de todos os seguidores, então a chave quente se desloca para ele.

    Diagrama da arquitetura: Feed híbrido
    CLLeitor
    NWGateway
    CPServiço de feed
    CHCache de feeds
    DBGrafo de seguidores
    CHCache de posts de contas grandeschave quente
    DBBanco de postsposts recentes
    QFila de posts
    CPTrabalhador de fan-out
  6. O serviço mescla a parte pré-computada com os posts das contas grandes, ordena por tempo e devolve a página ao leitor.

    Diagrama da arquitetura: Feed híbrido
    CLLeitor
    NWGateway
    CPServiço de feedmescla e devolve
    CHCache de feeds
    DBGrafo de seguidores
    CHCache de posts de contas grandes
    DBBanco de posts
    QFila de posts
    CPTrabalhador de fan-out

O híbrido não elimina a chave quente; ele a muda de lugar. A fonte do Hello Interview aponta que o maior desafio do cache de posts é ter o mesmo problema de chave quente que a tabela de posts.

05 · CACHE E TRADE-OFFS

O que guardar no feed pré-computado

O feed pré-computado é um cache por usuário com identificadores, não posts inteiros. Na fonte do Hello Interview, cada entrada da tabela de feeds pré-computados é indexada pelo usuário e guarda uma lista de identificadores de posts. No Twitter de 2013, segundo o High Scalability, a timeline ficava num cluster Redis com no máximo 800 entradas por usuário (valor da época).

A paginação acompanha esse desenho. Segundo o Hello Interview, um único timestamp indica onde o leitor parou e serve de cursor para o próximo conjunto de posts.

CritérioFan-out na leituraFan-out na escrita
Quando o feed é montadoQuando o leitor abre o aplicativoQuando o post é criado
Custo da leituraAlto: o feed não foi pré-computadoBaixo: o feed já está pronto no cache
Custo da escritaBaixo: o post só é gravadoAlto para quem tem muitos seguidores
Problema típicoLeitura lentaChave quente nas contas grandes

Perguntas frequentes

O que é Feed de notícias?

Fan-out na escrita vs. na leitura, o problema das celebridades e cache de timeline.

O que o design de Feed de notícias cobre?

Ele está organizado nestas seções: O feed é uma fila de leitura, Montar o feed quando o leitor pede, Montar o feed quando o post nasce, Quando um post tem milhões de leitores e O que guardar no feed pré-computado.

Quanto tempo leva Feed de notícias e qual é o nível?

Leva cerca de 16 minutos para ler e tem nível Pleno.

Agora projete você mesmo

Rode este caso como uma entrevista na escola de System Design: você toma as decisões, o tutor as questiona e você vê a nota do seu desenho.