Aplicativos online em grande escala percorreram um longo caminho nas duas décadas anteriores. Essas inovações alteraram nossas percepções de desenvolvimento de software. Facebook, Instagram e Twitter, por exemplo, são todas plataformas escaláveis.
Esses sistemas devem ser construídos para gerenciar grandes volumes de tráfego e dados, já que bilhões de pessoas os utilizam ao mesmo tempo em todo o mundo. Isso é quando projeto de sistema entra na foto.
O processo de estabelecer a arquitetura, as interfaces e os dados de um sistema que atende a determinados critérios é conhecido como projeto do sistema. Por meio de sistemas coesos e eficientes, o design do sistema atende às demandas do seu negócio ou organização.
Uma vez que sua empresa ou organização tenha determinado seus critérios, você pode começar a incorporá-los em um projeto de sistema físico que atenda às demandas de seus consumidores.
Se você optar por desenvolver sob medida, soluções comerciais ou uma combinação dos dois, a forma como você projeta seu sistema determinará como você o construirá.
Vamos dar uma olhada detalhada no design do sistema da linha do tempo do Twitter neste post, completo com um tutorial. Vamos começar.
Etapa 1: descrever o caso de uso e as restrições
Caso de uso
- Um usuário carrega um tweet.
- O serviço envia notificações push e e-mails para seguidores de tweets.
- A linha do tempo do usuário é visualizada (atividade do usuário)
- O usuário olha para a linha do tempo inicial (atividade de pessoas que o usuário está seguindo)
- As palavras-chave são pesquisadas pelo usuário.
- O serviço é realmente acessível.
Fora do escopo
- Os tweets são enviados para o Twitter Firehose e outros fluxos usando este serviço.
- O serviço remove tweets com base nas configurações de visibilidade do usuário.
- Se o usuário também não estiver seguindo a pessoa que está sendo respondida, oculte a resposta.
- Observe a opção 'ocultar retuítes'.
- Dados
Restrições e suposições
Premissas do Estado
- O tráfego não é disperso igualmente.
- Deve ser simples enviar um tweet.
- A menos que você tenha milhões de seguidores, enviar um tweet para todos os seus seguidores deve ser rápido.
- Existem 100 milhões de usuários ativos.
- 15 bilhões de tweets por mês ou 500 milhões de tweets todos os dias
- Cada tweet tem um fanout de 10 entregas em média.
- Todos os dias, fanout entrega 5 bilhões de tweets.
- Fanout entrega 150 bilhões de tweets todos os meses.
- 250 bilhões de solicitações mensais de leitura
- 10 bilhões de buscas mensais
Timeline
- A linha do tempo deve ser fácil de navegar.
- Twitter é mais sobre leitura do que escrita.
- Otimize para leitura rápida de tweets
- O consumo de tweets é demorado.
Pesquisar
- O processo de pesquisa deve ser rápido.
- É demorado pesquisar.
Calcular uso
Tamanho de cada tweet:
- ID do tweet de 8 bytes
- ID de usuário de 32 bytes
- 140 bytes de texto
- mídia – média de 10 KB
- Total: aproximadamente 10 KB
Todos os meses, são gerados 150 TB de novos conteúdos de tweets.
- * 500 milhões de tweets todos os dias * 30 dias por mês * 10 KB por tweet
- Em três anos, houve 5.4 PB de novos conteúdos de tweets.
Há 100,000 solicitações de leitura a cada segundo.
- * (400 solicitações por segundo / 1 bilhão de solicitações por mês) 250 bilhões de solicitações de leitura por mês
São 6,000 tweets por segundo.
- * (400 solicitações por segundo / 1 bilhão de solicitações por mês) 15 bilhões de tweets todos os meses
No fanout, 60 mil tweets são enviados a cada segundo.
- A Fanout entrega 150 bilhões de tweets por mês* (400 solicitações por segundo / 1 bilhão de solicitações por mês).
4,000 solicitações de informações a cada segundo
- * (400 solicitações por segundo / 1 bilhão de solicitações por mês) 10 bilhões de pesquisas por mês
Alguma conversão útil
- Todos os meses, passam 2.5 milhões de segundos.
- 2.5 milhões de solicitações por mês a 1 solicitação por segundo
- 100 milhões de solicitações por mês x 40 solicitações por segundo
- 1 bilhão de solicitações por mês = 400 solicitações por segundo
Etapa 2: diagrama de alto nível
Etapa 3: explicando os componentes principais
Poderíamos salvar os próprios tweets do usuário para preencher a linha do tempo do usuário (atividade do usuário) em um banco de dados relacional se ele enviar um tweet. É mais difícil entregar tweets e desenvolver a linha do tempo inicial (atividade de indivíduos que o usuário segue).
Um banco de dados relacional típico ficaria sobrecarregado distribuindo tweets para todos os seguidores (60 mil tweets entregues a cada segundo). Provavelmente vamos querer um armazenamento de dados de gravação rápida como um banco de dados NoSQL ou Cache de Memória.
A leitura sequencial de 1 MB da memória leva aproximadamente 250 microssegundos, mas a leitura do SSD leva 4 vezes mais e a leitura do disco leva 80 vezes mais.
Um Object Store pode ser usado para armazenar dados como imagens e vídeos.
- O Servidor Web, que está atuando como proxy reverso, recebe um tweet do Cliente.
- A solicitação é enviada ao servidor Write API pelo Web Server.
- A API de gravação salva o tweet em um banco de dados SQL na linha do tempo do usuário.
O Serviço Fan-Out é contatado pela API de gravação e executa as seguintes tarefas.
- Localiza os seguidores do usuário no Cache de Memória consultando o Serviço de Gráfico do Usuário.
- Em um Memory Cache, o tweet é salvo na timeline inicial dos seguidores do usuário.
- 1,000 seguidores = 1,000 pesquisas e inserções = operação O(n).
- O tweet é salvo no Search Index Service para pesquisa rápida.
- O Object Store é usado para armazenar mídia.
- Envia alertas push para seguidores por meio do Serviço de Notificação.
- Para enviar alertas de forma assíncrona, ele usa uma Fila.
Podemos utilizar uma lista nativa do Redis com a seguinte estrutura se nosso cache de memória for Redis:
A timeline inicial do usuário seria atualizada com o novo tweet, que seria armazenado no Memory Cache. Usaremos a seguinte API REST pública:
A linha do tempo do usuário é visualizada pelo usuário.
- O Servidor Web recebe uma solicitação de linha do tempo do usuário do Cliente.
- A solicitação é enviada ao servidor Read API pelo Web Server.
- A API de leitura consulta o banco de dados SQL para o período de tempo do usuário.
A API REST funcionaria de maneira semelhante à linha do tempo inicial, com a exceção de que todos os tweets seriam originários do usuário e não das pessoas que ele segue.
Um usuário pesquisa por palavras-chave:
- O Servidor Web recebe uma solicitação de pesquisa do Cliente.
- A solicitação é enviada ao servidor da API de Pesquisa pelo Servidor Web.
Etapa 4: linha do tempo do Twitter
A criação da linha do tempo é uma tarefa difícil. É necessário um servidor de geração de linha do tempo que se vincule à web ou servidores de aplicativos.
Sempre que um usuário faz login, o serviço de linha do tempo mantém o controle dos tweets mais recentes dos usuários na tabela do seguidor e atualiza ou atualiza a linha do tempo do usuário.
Não implementamos nenhum tipo de sistema de classificação aqui; em vez disso, presumimos que os 5 principais tweets dos seguidores do usuário são apresentados na linha do tempo em ordem de tempo de criação. Podemos manter um corte de atualização de 50 tweets. Ainda deixamos de atualizar ou construir uma linha do tempo depois que esse limite é atingido até que o usuário atualize a página.
Preocupações com alta latência e desempenho virão da criação de feeds de usuários ao vivo. Em vez disso, criar um fluxo offline que possa ser apresentado instantaneamente é a melhor maneira de melhorar o desempenho. Execute servidores de linha de tempo dedicados que executam ping no servidor de aplicativos regularmente para atualizar o feed com base na hora em que foi criado.
O algoritmo de classificação deve levar em consideração sinais cruciais e fornecer peso para garantir que a linha do tempo de um usuário não seja dominada por material de uma ou mais contas que ele segue.
Mais precisamente, podemos escolher recursos relacionados à relevância de qualquer item do feed, como número de curtidas, comentários, compartilhamentos e tempo de atualização. Cada um desses critérios deve ser usado para classificar o tweet e, em seguida, essa classificação deve ser usada para mostrar os tweets na linha do tempo.
Devemos alertar constantemente os usuários quando um novo conteúdo para seu feed de notícias estiver disponível? Os usuários podem achar benéfico ser alertados quando novos dados estiverem disponíveis. Em dispositivos móveis, no entanto, quando o uso de dados é bastante caro, pode desperdiçar largura de banda.
Como resultado, podemos optar por não enviar dados para dispositivos móveis e, em vez disso, permitir que os usuários “Puxem para atualizar” para novas postagens.
Etapa 5: dimensionar o projeto
Um gargalo potencial é o Serviço Fanout. Os usuários do Twitter com milhões de seguidores terão que esperar vários minutos para que seus tweets sejam lançados. Isso pode causar uma corrida com respostas ao tweet, o que poderíamos evitar reordenando os tweets no momento da veiculação.
Também poderíamos impedir a disseminação de tweets de pessoas com um grande número de seguidores. Em vez disso, podemos fazer uma pesquisa por tweets de indivíduos altamente seguidos, integrar os resultados da pesquisa com os resultados da linha do tempo inicial do usuário e, em seguida, reordenar os tweets no momento da veiculação.
Melhorias adicionais incluem:
- Mantenha apenas algumas centenas de tweets no Cache de Memória para cada timeline inicial.
- No Cache de Memória, apenas as informações da linha do tempo inicial dos usuários ativos são salvas.
- Podemos reconstruir a cronologia do Banco de Dados SQL se um usuário não estiver ativo nos 30 dias anteriores.
- Para descobrir quem é o usuário, utilize o serviço User Graph.
- Adicione os tweets ao Cache de Memória recuperando-os do Banco de Dados SQL.
- O Tweet Info Service pode economizar apenas um mês de tweets.
- No Serviço de Informações do Usuário, apenas os usuários ativos são salvos.
- Para manter a latência baixa, o cluster de pesquisa provavelmente precisaria manter os tweets na memória.
Conclusão
Embora o Twitter seja uma grande organização, tem uma melhor compreensão do projeto do sistema. Fiz o meu melhor para fornecer a você uma visão geral de alto nível da linha do tempo do Twitter.
Espero que você tenha obtido informações úteis a partir dele e possa colocá-lo em bom uso.
Deixe um comentário