O recurso de Timeline do Facebook, lançado em setembro de 2011 e disponibilizado internacionalmente no final de janeiro deste ano, introduziu uma nova forma de apresentar as informações de um perfil, permitindo construir uma cronologia visual detalhada das atividades dos usuários. Devido à sua complexidade e impacto, o desenvolvimento do Timeline representou um marco para os engenheiros do Facebook.
Alguns dos principais desafios, reportou Ryan Mack da equipe de engenheiros do Facebook, foram criar uma estrutura capaz de armazenar o enorme volume de informações necessário, mantendo ao mesmo tempo a disponibilidade e a escalabilidade do serviço. Outra dificuldade enfrentada foi a migração dos dados da estrutura antiga para a nova, mantendo os dados e serviços relacionados disponíveis durante a migração.
O Facebook, desde de sua primeira versão, mantinha as informações do perfil na página por um período pequeno, que variava entre dias e semanas. Agora, com o Timeline, o serviço aumenta consideravelmente a durabilidade de informações relevantes exibidas em cada perfil. Uma foto ou vídeo, por exemplo, podem ficar no Timeline do usuário por anos.
Escolha das tecnologias
Segundo a equipe do Facebook, o prazo para desenvolver o Timeline foi "extremamente agressivo". Uma das premissas durante o desenvolvimento era eliminar riscos técnicos e manter o sistema o mais simples possível. Por isso, o time de engenharia decidiu adotar tecnologias que já eram de domínio do grupo.
A ideia do Timeline surgiu em 2010, durante um Hackathon, uma iniciativa do Facebook que reúne funcionários da empresa para promover ideias e projetos interessantes. A equipe completa, que atuou no desenvolvimento do Timeline foi criada no começo de 2011.
O núcleo do Timeline foi desenvolvido utilizando as seguintes tecnologias:
- MySQL/InnoDB, uma versão do MySQL customizada pelo Facebook, foi a escolha para armazenamento e replicação de dados;
- Multifeed, um sistema desenvolvido pelo Facebook responsável por notificar e ranquear as atualizações dos perfis;
- Apache Thrift, projeto que define um conjunto de interfaces de serviços, utilizadas na comunicação entre as camadas de front-end e back-end.
- Memcached, sistema de cache distribuído, utilizado para manter as informações do Timeline.
Desnormalização do banco de dados
Um grande desafio, enfrentado antes mesmo do início do desenvolvimento do Timeline, foi ajustar a base de dados para um formato adequado, que garantisse a disponibilidade e a performance nas consultas. O modelo de dados do Facebook era altamente normalizado, e boa parte das consultas demandavam grande número de acessos ao servidor de banco de dados.
Uma alternativa direta adotada para evitar a perda de desempenho foi utilizar um cache de dados, reduzindo os acessos à base de dados. Mas o cache utilizado no modelo antigo não era viável para o Timeline, devido ao imenso volume de dados e à necessidade de resolução de relacionamentos complexos entre esses dados.
A decisão dos engenheiros foi desnormalizar o modelo, recriando vários objetos do banco de dados para reunir o máximo de informações em uma única estrutura. Com a desnormalização, foi possível reduzir o número de acessos ao banco de dados, além de eliminar a necessidade de joins complexos:
Para suportar o novo modelo de ranqueamento, era necessário manter todos os dados em cache, incluindo os dados de camadas inferiores que não são exibidos. Um processo extensivo de desnormalização foi necessário, para garantir que todos os dados para o ranqueamento estivessem disponíveis, tudo com um número reduzido de acessos à base de dados.
Com a desnormalização, cada registro na base de dados passou a conter informações de uma ação do usuário e de metadados utilizados para a classificação da ação dentro do Timeline. Com isso, tais informações são processadas de forma eficiente e é reduzido o número de consultas ao banco de dados.
Desafios na desnormalização
Quanto à desnormalização, os engenheiros do Facebook reportaram uma série de questões importantes que precisaram ser equacionadas.
A base de dados do Facebook havia evoluído naturalmente, de acordo com a criação de novos serviços, desde o lançamento do site, o que resultou em dezenas de modelos de dados legados. Diante da complexidade envolvida, a solução foi criar uma linguagem específica para a conversão dos dados, com a capacidade de 'compreender' as regras definidas para desnormalização. Foi desenvolvido um compilador para a nova linguagem, e as regras geradas com a compilação cuidam da conversão das estruturas antigas para o formato adequado para o Timeline.
Os dados de ações antigas foram movidos para um storage especial, composto por centenas de servidores MySQL. Com o uso desse storage foi possível maximizar a velocidade de conversão dos dados.
Além disso, várias consultas utilizavam joins complexos que demandavam grande volume de I/O. Para diminuir esse volume, foram consolidadas as tabelas de junção (join tables), que armazenam informações do relacionamento entre entidades utilizando memória flash. Os engenheiros do Facebook também desenvolveram um proxy de consultas paralelas, permitindo que o código em PHP efetuasse consultas em múltiplas instâncias de servidores MySQL ao mesmo tempo.
O modelo de dados foi implementado no Timeline foi projetado para deixar a semântica dos dados mais explícita, facilitando a integração das informações do Timeline com outros módulos e funcionalidades do Facebook.
Usos de cache
O Timeline faz uso de dois tipos de cache. As atualizações dos perfis são mantidas nesses caches de acordo com a duração de cada tipo de informação:
- No cache de curto prazo ficam atualizações mais recentes de perfil, que são mais propensas a alterações. Dada a relativa "volatilidade" dos dados armazenados, o cache de curto prazo é invalidado com frequência, processando-se as informações no estado mais recente. Esse cache é mantido em um Flashcache, uma estrutura que permite a expansão de memória através de dispositivos flash (discos de estado sólido, SSDs, por exemplo).
- No cache de longo prazo ficam as informações antigas do perfil; esse cache não é invalidado. As atualizações de 2011, por exemplo, são mantidas nesse cache, onde qualquer consulta na Timeline nesse período pode ser processada. O cache de longo prazo foi implementado utilizando o Memcached.
Processo de desenvolvimento
A equipe conseguiu, no início do desenvolvimento do produto, já trabalhar com um bom grau de paralelismo. Uma vez definido um protótipo do Timeline, o time iniciou os trabalhos em várias frentes simultâneas:
- O projeto dos protótipos de interface gráfica utilizando com o back-end antigo;
- O desenvolvimento do front-end real (de produção), utilizando um simulador do novo back-end;
- A construção do back-end de forma escalável, utilizando exemplos de dados desnormalizados, a partir do protótipo do conversor do modelo de dados (de estruturas normalizadas para desnormalizadas);
- O desenvolvimento do framework para executar a conversão das estruturas normalizadas em desnormalizadas;
- A coleta e cópia dos dados necessários para desnormalização;
- A realização de testes de carga para validar a capacidade da infraestrutura planejada.
O desenvolvimento do Timeline durou por volta de seis meses. O processo de desenvolvimento e o resultado do trabalho foram muito positivos, segundo o relato da equipe:
O desenvolvimento do Timeline foi uma excelente oportunidade para a equipe técnica trabalhar próxima ao time de criação do produto. A colaboração constante foi fundamental para garantir a infraestrutura adequada para os objetivos do produto, ao mesmo tempo aprimorando-o com funcionalidades que poderiam ser implementadas de forma eficiente.
Conclusões
Assim como na maior migração de dados do Facebook, coberta pelo InfoQ Brasil em 2011, os desafios encontrados na criação do Timeline mostram o quanto é delicado é o desenvolvimento de novas funcionalidades em serviços existentes, especialmente quando incluem modificação de arquiteturas. Por menor que sejam as mudanças, sempre envolvem milhões de usuários e bilhões de registros e objetos.
Dito isso, já se pode considerar a criação do Timeline um grande sucesso de tecnologia e engenharia. Em 29 de fevereiro, a rede social abriu o uso do Timeline para todas as páginas corporativas, e milhões já migraram com sucesso. E, o mais importante: depois de tantas mudanças, as coisas continuam funcionando suavemente no Facebook.