Sistemas Imperfeitos Podem Ser Benéficos: As Linhas do Tempo Perdas do Bluesky
No design de sistemas, muitas vezes buscamos a perfeição em aspectos como consistência de dados, disponibilidade e latência. Contudo, alcançar um sistema ideal que possua perfeita consistência, disponibilidade máxima e latência mínima é uma tarefa extremamente desafiadora, quando não impossível.
Recentemente, fiz grandes concessões no design do Feed/Timeline do Bluesky, priorizando a performance das gravações e reduzindo a consistência sem impactar negativamente a experiência do usuário. Essa abordagem resultou em uma diminuição de mais de 96% nos tempos de latência P99.
O processo de "Fanout" no Bluesky consiste em indexar uma postagem e distribuí-la entre os seguidores do usuário. Quando alguém faz uma postagem, ela é registrada em um banco de dados e referenciada nos Timelines dos seguidores. Esse processo exige que olhemos para cada seguidor e insiramos a referência da postagem em suas tabelas de Timeline.
Com cerca de 32 milhões de usuários, o banco de dados de Timelines do Bluesky é dividido em centenas de shards. Essa estrutura permite que cada usuário tenha sua própria partição de Timeline, mas, em situações de carga elevada, a atividade de certos usuários pode sobrecarregar os shards, criando o que chamamos de "Hot Shard".
Quando um usuário segue um número excessivo de outros, sua Timeline se torna hiperativa, o que pode prejudicar o desempenho das operações. Por exemplo, se um usuário é seguido por 2.000.000 de pessoas, um único post pode levar até 5 minutos para ser completamente distribuído devido a latências.
Para resolver esse problema, introduzimos as Linhas do Tempo Perdas. Essa metodologia aplica um fator de perda, que limita a quantidade de gravações que um usuário pode realizar em sua Timeline, baseado no número de seguidores. Assim, se um usuário estiver além de um limite razoável de seguidores, as gravações em sua Timeline são probabilisticamente descartadas.
Além disso, implementamos um sistema de cache que armazena contas com muitos seguidores, permitindo que as consultas sejam feitas de maneira eficiente sem sobrecarregar o banco de dados. Essa abordagem possibilitou que, durante os períodos de maior atividade, realizássemos mais de um milhão de gravações por segundo.
Os resultados foram impressionantes. Após a implementação das Linhas do Tempo Perdas, não há mais "hot shards" nos clusters de Timelines e o tempo de duração de um trabalho completo de Fanout foi reduzido em mais de 96%. Jobs que anteriormente levavam de 5 a 10 minutos agora são concluídos em menos de 10 segundos.
Entender onde é aceitável ser imperfeito permite que troquemos consistência por outros aspectos desejáveis, escalando nossos sistemas para níveis mais altos. O Bluesky continua a explorar melhorias em sua arquitetura de Timelines, mas este foi um grande avanço em direção à eficiência e escalabilidade.
Confira os últimos vídeos publicados no canal