Como o twitter lida com escalabilidade?
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:
- 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
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.
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
- Capítulo 1 — Confiabilidade
- Capítulo 2 — Escalabilidade (parte 1)
- Capítulo 2 — Escalabilidade (parte 2) (em construção…)