Como o twitter lida com escalabilidade?

Eduardo Machado
4 min readFeb 8, 2023

--

Introdução

Fala pessoal, hoje vamos continuar o resumo do livro “Designing Data Intensive Applications” abordando agora sobre escalabilidade. A escalabilidade é fundamental em sistemas de dados intensivos, pois permite que eles cresçam e atendam às demandas crescentes de dados e usuários.

O livro fornece uma visão detalhada de como projetar sistemas escaláveis e robustos, abordando desafios comuns como a escalabilidade horizontal e vertical, a distribuição de carga e a tolerância a falhas. Vamos explorar soluções eficientes para garantir que os sistemas de dados possam acompanhar o crescimento contínuo e responder às necessidades em constante mudança.

O que é escalabilidade?

É o termo que usamos para descrever a capacidade de um sistema de lidar com o aumento de carga. É importante ressaltar que escalabilidade é diferente de dizer “X é escalável”. Ela representa responder questẽos como: Se o sistema cresce de uma determinada maneira, “quais são as opções para lidar com o crescimento?” E “Como podemos adicionar recursos de computação para lidar com essa carga adicional?”

Carga Descritiva

A carga pode ser descrita como alguns números que chamamos de parâmetros. A melhor escolha de parâmetros depende da arquitetura do seu sistema.

Para exemplificar melhor sobre esses parâmetros, Martin nos mostra um exemplo da arquitetura do twitter. Sendo assim, vamos apresentar as duas funcionalidades do twitter:

  1. Postar tweet

Um usuário pode publicar uma nova mensagem para seus seguidores (4.6 mil solicitações/s em média, mais de 12 mil solicitações/s no pico).

2. Linha do tempo inicial

Um usuário pode visualizar os tweets postados pelas pessoas que seguem (300 mil solicitações/s).

Simplesmente lidar com 12 mil gravações/s (taxa para postar) seria bastante fácil. Contudo, o desafio de dimensionamento do twitter não se deve principalmente ao volume de tweets, mas devido espalham. Cada usuário segue muitas pessoas e cada usuário é seguido por muitas pessoas. Existem basicamente 2 maneiras de implementar essas duas operações.

Abordagem 1

Postar um tweet simplesmente faz inserir este novo dado em uma coleção global de tweets. Quando um usuário solicitar sua linha do tempo inicial, procure todas as pessoas que ele segue, encontre todos os tweets de cada um desses usuários e mescle-os (classificando por tempo).

Exemplo de como seria uma query:

select tweets.*, usuarios.* 
from tweets
join usuarios on tweets.sender_id = usuarios.id
Esquema relacional para implementar uma linha do tempo do Twitter

Abordagem 2

Mantenha um cache para a linha do tempo inicial de cada usuário, como uma caixa de correio de tweets para cada usuário destinatário. Quando um usuário posta um tweet, procure todas as pessoas que seguem esse usuário e insira o novo tweet em cada um dos caches da linha do tempo inicial. A solicitação para ler a linha do tempo inicial é barata, porque seu resultado foi calculado com antecedência.

Pipeline de dados do twitter para entrega de tweets aos seguidores, com parâmetros de carga a partir de novembro de 2012.

Análise sobre as duas abordagens

Com a primeira abordagem, o sistema lutava para acompanhar a carga para perfils com milhares de seguidores. Este problema fez com que a empresa fosse obrigada a mudar o seu sistema para utilizar a segunda abordagem, já que ela funciona melhor uma vez que a taxa média de tweets publicados é quase duas ordens de grandeza menor do que a taxa de leituras da linha do tempo inicial. Sendo assim, é melhor trabalhar com mais tempo de gravação e menos tempo de leitura.

Contudo, a desvantagem da abordagem 2 é que fazer uma postagem de um tweet agora requer muito trabalho extra. Em média, um tweet é entregue a cerca de 75 seguidores, portanto, 4.6 mil tweets/s se tornam 345 mil gravações/s nos caches da linha do tempo inicial. Porém essa média esconde o fato de que o número de seguidores por usuário varia muito, e alguns usuários tem mais de 30 milhões de seguidores. Em outras palavras isso significa que um único tweet pode resultar em mais de 30 milhões de gravações. Fazer isso em tempo hábil (o twitter tenta enviar tweets aos seguidores em cinco segundos) é um desafio extremamente significativo.

A reviravolta do twitter

Com a abordagem 2 implementada de forma robusta, o Twitter está se movendo para um híbrido de ambas as abordagens. A maioria dos tweets dos usuários continua a ser distribuída nas linhas do tempo “domésticas” no momento em que são postadas, mas um pequeno número de usuários com um número muito grande de seguidores (ou seja, celebridades) é excluído dessa distribuição.

Os tweets de quaisquer celebridades que um usuário possa seguir são buscados separadamente e mesclados com a linha do tempo inicial do usuário quando são lidos, como na abordagem 1. Essa abordagem híbrida é capaz de oferecer um desempenho consistentemente bom.

Lista de postagens sobre o livro

--

--