Pular para o conteúdo

Design clássico · Pleno

Timeline do Facebook

Projeto de entrevista clássico. Pontos centrais: Fundamentos de Modelagem de Dados e Sharding de Banco de Dados.

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

Resposta curta

Projeto de entrevista clássico. Pontos centrais: Fundamentos de Modelagem de Dados e Sharding de Banco de Dados. As páginas de perfil anteriores do Facebook mostravam alguns dias ou semanas de atividade. Com a Timeline, o time precisou pensar em anos e até décadas: era preciso varrer, agregar e ranquear posts, compartilhamentos, fotos e check-ins para destacar os eventos mais significativos…

01 · CONTEXTO

De dias de atividade para décadas

As páginas de perfil anteriores do Facebook mostravam alguns dias ou semanas de atividade. Com a Timeline, o time precisou pensar em anos e até décadas: era preciso varrer, agregar e ranquear posts, compartilhamentos, fotos e check-ins para destacar os eventos mais significativos ao longo de anos de atividade.

O cronograma era muito agressivo. Uma das prioridades foi eliminar o risco técnico, mantendo o sistema o mais simples possível e usando tecnologias já provadas dentro da empresa. O time construiu sobre quatro tecnologias centrais: o MySQL/InnoDB no armazenamento, o Multifeed (a tecnologia que alimenta o News Feed) no ranking, o Thrift na comunicação e o memcached no cache.

O ponto de design mais interessante não é nenhuma dessas peças, e sim a forma como os dados foram organizados para elas. É o assunto da próxima seção.

02 · O PROBLEMA

Por que o modelo normalizado não servia

Antes da Timeline, os dados eram altamente normalizados, o que exigia muitas idas ao banco; por isso o desenho dependia de cache para manter tudo rápido. Quando um dado não estava no cache, era improvável que estivesse agrupado no disco, e isso gerava muito IO aleatório, potencialmente lento.

Ranquear anos de atividade nesse modelo teria exigido manter todo o conjunto de dados em cache, inclusive o de baixo valor, que nem era exibido. A análise do High Scalability resume assim: dado o volume e o quanto dele é frio, guardar tudo em cache não é um bom desenho.

  1. O navegador pede o perfil à camada web.

    Diagrama da arquitetura: Perfil antes da Timeline
    CLNavegador
    CPCamada web
    CHCache
    DBBancos normalizados
  2. Com dados normalizados, o desenho dependia do cache para manter tudo rápido.

    Diagrama da arquitetura: Perfil antes da Timeline
    CLNavegador
    CPCamada web
    CHCachetudo depende dele
    DBBancos normalizados
  3. Quando o dado não estava no cache, era improvável que estivesse agrupado no disco, o que gerava IO aleatório potencialmente lento.

    Diagrama da arquitetura: Perfil antes da Timeline
    CLNavegador
    CPCamada web
    CHCache
    DBBancos normalizadosIO aleatório
  4. Para ranquear anos de atividade seria preciso manter todo o conjunto de dados em cache, inclusive o de baixo valor.

    Diagrama da arquitetura: Perfil antes da Timeline
    CLNavegador
    CPCamada web
    CHCacheteria de guardar tudo
    DBBancos normalizados

03 · DESNORMALIZAR

Linhas que já carregam o ranking

A resposta foi uma desnormalização massiva, para que todos os dados necessários ao ranking estivessem disponíveis em poucas requisições eficientes em IO. Cada linha do banco passou a conter a informação sobre a ação e metadados de ranking suficientes para ser selecionada ou descartada sem buscas adicionais.

Os dados ficam ordenados por (usuário, tempo) em disco, e o InnoDB faz um bom trabalho ao lê-los em fluxo com uma consulta por faixa de chave primária. O High Scalability resume o ganho da desnormalização: ela reduz o IO aleatório ao reduzir as idas ao banco.

Antes (dados normalizados)Timeline (dados desnormalizados)
Idas ao bancoMuitas idas ao bancoPoucas requisições eficientes em IO
RankingExigiria todo o conjunto de dados em cache, até o de baixo valorA linha traz metadados de ranking e é selecionada ou descartada sem buscas adicionais
Disposição no discoDados improváveis de estarem agrupados, com IO aleatórioOrdenados por (usuário, tempo) e lidos com consulta por faixa de chave primária

04 · LEITURA

Agregador local e dois tipos de cache

Sobre o banco foi construído o agregador da Timeline. Ele começou como versão modificada do agregador do Multifeed e hoje roda localmente em cada servidor de banco, o que permite esgotar a capacidade dos discos sem mandar pela rede dados que não serão exibidos. Seus geradores de histórias vão de agrupar check-ins próximos a ranquear atualizações de status, são escritos em C++ e rodam as análises em poucos milissegundos.

  1. O navegador pede a Timeline à camada web.

    Diagrama da arquitetura: Timeline: leitura com agregador local
    CLNavegador
    CPCamada web
    CHCache de consultas (memcached)
    CPAgregador da Timeline
    DBMySQL/InnoDB com linhas desnormalizadas
  2. Resultados de consultas grandes, como ranquear toda a atividade de um ano, são pequenos e ficam no memcached por muito tempo sem invalidação.

    Diagrama da arquitetura: Timeline: leitura com agregador local
    CLNavegador
    CPCamada web
    CHCache de consultas (memcached)consultas grandes
    CPAgregador da Timeline
    DBMySQL/InnoDB com linhas desnormalizadas
  3. O agregador roda localmente em cada servidor de banco.

    Diagrama da arquitetura: Timeline: leitura com agregador local
    CLNavegador
    CPCamada web
    CHCache de consultas (memcached)
    CPAgregador da Timelineno servidor do banco
    DBMySQL/InnoDB com linhas desnormalizadas
  4. Os geradores de histórias leem as linhas desnormalizadas, ordenadas por usuário e tempo, e agrupam e ranqueiam.

    Diagrama da arquitetura: Timeline: leitura com agregador local
    CLNavegador
    CPCamada web
    CHCache de consultas (memcached)
    CPAgregador da Timelinegeradores de histórias
    DBMySQL/InnoDB com linhas desnormalizadasfaixa de chave primária
  5. Dados que não serão exibidos não são enviados pela rede.

    Diagrama da arquitetura: Timeline: leitura com agregador local
    CLNavegador
    CPCamada web
    CHCache de consultas (memcached)
    CPAgregador da Timelinesó o exibido
    DBMySQL/InnoDB com linhas desnormalizadas
  6. Na Atividade Recente, que muda com frequência, o cache é de linhas: buffer pool do InnoDB em RAM e Flashcache em flash.

    Diagrama da arquitetura: Timeline: leitura com agregador local
    CLNavegador
    CPCamada web
    CHCache de consultas (memcached)
    CPAgregador da Timeline
    DBMySQL/InnoDB com linhas desnormalizadascache de linhas
Atividade antiga (ex.: ranking de um ano)Atividade recente
MudançaO resultado é pequeno e pode ficar em cache por muito tempo sem invalidaçãoMuda com frequência, então o cache de consulta é invalidado com frequência
Cache usadoCache de resultado de consulta no memcachedCache de linhas: buffer pool do InnoDB em RAM e Flashcache em flash

05 · MIGRAÇÃO E EQUIPE

Chegar ao novo modelo e entregar rápido

Havia dezenas de formatos de dados legados que evoluíram ao longo dos anos, e uma linguagem própria expressava as regras de conversão, com um compilador que a transformava em PHP executável. O novo esquema adotou um modelo de dados compatível com o Multifeed, mais flexível e com mais contexto semântico.

Os dados de atividade não recente estavam em armazenamento de rede lento. Uma versão somente leitura do MySQL, em centenas de servidores, copiou esses dados em semanas em vez de meses. As tabelas de junção foram consolidadas em uma camada de bancos só com flash, consultada em paralelo por um proxy.

  1. Os dados de origem estavam em formatos legados e, no caso da atividade não recente, em armazenamento de rede lento.

    Diagrama da arquitetura: Migração para o modelo desnormalizado
    DBSistemas legados
    DBArmazenamento de rede lentolento
    CPServidores de cópia
    CPConversor de formato
    CPProxy de consulta paralela
    DBCamada de junção em flash
    DBBanco desnormalizado
  2. Uma versão somente leitura do MySQL em centenas de servidores extraía os dados com pressão máxima de IO.

    Diagrama da arquitetura: Migração para o modelo desnormalizado
    DBSistemas legados
    DBArmazenamento de rede lento
    CPServidores de cópiacentenas de servidores
    CPConversor de formato
    CPProxy de consulta paralela
    DBCamada de junção em flash
    DBBanco desnormalizado
  3. Regras escritas em uma linguagem própria, compiladas para PHP, convertiam os formatos antigos.

    Diagrama da arquitetura: Migração para o modelo desnormalizado
    DBSistemas legados
    DBArmazenamento de rede lento
    CPServidores de cópia
    CPConversor de formatoregras de conversão
    CPProxy de consulta paralela
    DBCamada de junção em flash
    DBBanco desnormalizado
  4. As tabelas de junção ficaram em bancos só com flash, e um proxy consultava toda a camada em paralelo.

    Diagrama da arquitetura: Migração para o modelo desnormalizado
    DBSistemas legados
    DBArmazenamento de rede lento
    CPServidores de cópia
    CPConversor de formato
    CPProxy de consulta paralelaconsulta em paralelo
    DBCamada de junção em flashsó flash
    DBBanco desnormalizado
  5. O resultado são linhas desnormalizadas em um modelo compatível com o Multifeed.

    Diagrama da arquitetura: Migração para o modelo desnormalizado
    DBSistemas legados
    DBArmazenamento de rede lento
    CPServidores de cópia
    CPConversor de formato
    CPProxy de consulta paralela
    DBCamada de junção em flash
    DBBanco desnormalizadonovo modelo

A Timeline começou como projeto de hackathon no fim de 2010, com dois engenheiros em tempo integral, um estagiário e um designer que construíram uma demo em uma única noite. O time completo foi dividido em design, front-end, infraestrutura e migração de dados, e as frentes andaram em paralelo: o time desenhava protótipos de UI sobre o backend antigo e fazia testes de carga simulados para validar as estimativas de capacidade. Da primeira reunião de revisão de infraestrutura ao teste de carga com 100% do backend foram apenas seis meses.

Perguntas frequentes

O que é Timeline do Facebook?

Projeto de entrevista clássico. Pontos centrais: Fundamentos de Modelagem de Dados e Sharding de Banco de Dados.

O que o design de Timeline do Facebook cobre?

Ele está organizado nestas seções: De dias de atividade para décadas, Por que o modelo normalizado não servia, Linhas que já carregam o ranking, Agregador local e dois tipos de cache e Chegar ao novo modelo e entregar rápido.

Quanto tempo leva Timeline do Facebook e qual é o nível?

Leva cerca de 14 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.