Conteúdo[Esconder][Mostrar]
O Feed do Instagram é uma plataforma para compartilhar e se conectar com as pessoas e coisas que são importantes para você. Quando você abre o Instagram ou atualiza seu feed, as fotos e vídeos que achamos que você vai se interessar serão exibidos no topo.
O feed de notícias é uma coleção de itens contendo texto, imagens ou vídeos criados por outras entidades no sistema que são direcionados para você ler. Está sempre mudando, enquanto outras organizações estão fazendo novas postagens.
Neste post, veremos de perto o design do sistema do feed do Instagram. Então, vamos começar.
1. Requisitos
Necessidade funcional
- O feed de notícias do usuário é criado a partir de postagens de outras entidades do sistema que o usuário tem seguido ou tem interesse.
- Texto, fotos e vídeos podem ser encontrados nas postagens.
- O feed de notícias do usuário deve ser atualizado com novas postagens criadas por outros.
Critério não funcional
- A criação de feeds de notícias deve ocorrer em tempo real. O usuário final deve experimentar apenas 12 segundos de atraso.
- Anexando uma nova postagem: não deve demorar mais de 5 segundos para que uma nova postagem apareça em uma solicitação de feed de notícias após ser enviada ao sistema.
2. Estimativa de Capacidade
- Em março de 2021, a população mundial era de apenas 7.8 bilhões de pessoas. Ele indica que 21% da população mundial é um Facebook DAU (Usuário Ativo Diário) e 32% é um MAU do Facebook (Usuário Ativo Mensal) (Usuário Ativo Mensal). Isso é incrível.
- Vamos fingir que o sistema que estamos construindo tem 1 bilhão de DAU para facilitar as coisas.
- Suponha que uma pessoa siga 500 pessoas ou empresas no Facebook. Um grupo ou uma página pode ser considerada uma entidade.
Tráfego estimado
Suponha que um usuário baixe o feed de notícias 10 vezes por dia, em média. Portanto, são aproximadamente 116 mil QPS e 1e10 solicitações por dia.
Estimativas de Armazenamento
Suponha que mantenhamos 500 postagens do feed de notícias de cada usuário na memória, em média, para recuperação rápida, e cada postagem tenha 1 KB de tamanho. Portanto, 500 KB por usuário, 500 TB para todas as DAUs e 5000 computadores com 100 GB de RAM cada.
3. APIs para sistemas
userId (GUID): o usuário cujo feed de notícias está sendo buscado.
Os seguintes campos estão disponíveis no parâmetro de opções opcionais:
- afterPostId (GUID): obtenha o feed de notícias do post seguinte a este. Se não for especificado, obtenha as postagens mais recentes.
- count (number): o número máximo de postagens que cada solicitação pode retornar. O back-end define um número máximo padrão se nenhum for fornecido.
- excludeReplies (boolean): impede que as respostas sejam incluídas no feed de notícias.
- O JSON retornado contém uma lista de itens do feed de notícias.
4. Projetando um banco de dados
Entidades
- Utilizador
- entityId, name, description e timestamp são campos obrigatórios.
- Os seguintes campos são obrigatórios: PostId, title, text, authorId e timestamp.
- carimbo de data/hora, url e mediaId
Relacionamentos
- Outros Usuários ou Entidades podem ser seguidos por um usuário. (m:n)
- Autor-Post: Tanto usuários quanto entidades podem criar posts. Assuma que apenas os usuários podem criar postagens por uma questão de simplicidade. (1:n; authorId é incorporável).
- Cada post é acompanhado por alguma forma de mídia. (1:n)
5. Projeto de alto nível
Arquitetura
Fluxos de trabalho
Produção de ração
Quando Jay solicitar seu fluxo de notícias, o sistema fará o seguinte:
- Recupere os IDs de todas as pessoas e coisas que Jay segue.
- Postagens agregadas: com esses IDs, obtenha as postagens mais recentes, populares e relevantes.
- Classifique as postagens de acordo com sua relevância e tempo.
- Cache: salve os feeds criados e envie para Jay os 20 melhores posts.
- Quando Jay terminar de ler as primeiras 20 postagens, outra solicitação é enviada para obter as próximas 20 postagens.
Distribuição de alimentação
Suponha que Jay esteja seguindo Aayush e que Aayush poste algo novo. O feed de notícias de Jay precisará ser atualizado pelo sistema:
- Recupere os IDs dos seguidores de Aayush.
- Adicionar novos artigos: adicione a postagem de Aayush ao pool de feeds de notícias dos seguidores desses IDs.
- Classifique as postagens de acordo com sua relevância e tempo.
- Atualize o cache da postagem de classificação.
- Os seguidores devem ser notificados quando novas postagens forem publicadas.
Componentes
As conexões dos usuários são mantidas por servidores web.
Os procedimentos indicados acima são executados pelo servidor de aplicação.
Cache e banco de dados:
- Usuário/entidade de banco de dados relacional
- Banco de dados relacional (pós)
- Atributo de imagem/vídeo: Aayush storge
- Metadados de banco de dados relacional
Serviços personalizados:
- Produção de ração
- Notificação de feeds
6. Projeto Detalhado
Geração de ração
Implementação ingênua de leitura de fan-out:
Os problemas com esta implementação desleixada incluem:
- Usuários com um grande número de amigos/seguidores perceberão uma desaceleração significativa, pois precisamos filtrar, mesclar e classificar um grande número de postagens.
- Quando um usuário carrega sua página, construímos a linha do tempo. Isso pode ser lento e ter muita latência.
- Cada atualização de status resultará em atualizações de feed para todos os seguidores para atualizações ao vivo. Isso pode causar atrasos significativos em nosso serviço de geração de feed de notícias.
Podemos pré-gerar a cronologia e salvá-la na memória para aumentar a eficiência.
Produção offline (gravação em fan-out)
Podemos ter servidores dedicados que estão constantemente criando e armazenando os feeds de notícias dos usuários na memória. Podemos apenas entregar o feed de notícias do local pré-gerado e salvo sempre que o usuário desejar.
Quantos itens de feed o feed de um usuário deve ser armazenado na memória?
Adapte com base no seu comportamento de uso.
Devemos fazer um feed de notícias para todos os usuários (e preservá-lo na memória)?
- Para pessoas que não fazem login com muita frequência.
- O cache baseado em LRU é uma abordagem simples.
- Uma solução melhor é descobrir como os usuários fazem login. Quando é? De quais dias da semana você está falando?
Publicação de feed
Fanout é o processo de enviar uma postagem para todos os seus seguidores.
Leitura de fanout (puxar)
Quando você solicita um feed de notícias, o sistema recebe uma solicitação de leitura. A leitura Fanout envia uma solicitação de leitura para todos os seus seguidores, solicitando que leiam seu conteúdo.
Prós:
- O procedimento de escrita é barato.
- Ao ler dados, é mais fácil usar vários algoritmos de agregação.
Contras:
- Para uma pessoa com muitos seguidores, a operação de leitura é bastante cara.
- Os usuários não verão dados novos até que eles os extraiam.
- Quando fazemos pull para buscar as postagens mais recentes regularmente, é difícil encontrar a cadência de pull adequada, e a maioria das solicitações de pull retornará uma resposta vazia, desperdiçando recursos.
Gravação de Fanout (push)
Uma solicitação de gravação é feita ao sistema quando você envia uma nova postagem. A solicitação de gravação é enviada a todos os seus seguidores para atualizar seu feed de notícias usando a gravação de fanout.
Pro
- O processo de leitura é barato.
Com
- Para um usuário com milhões de seguidores, o escrever procedimento é muito caro.
A classificação do feed
Em vez de apenas ordenar os feeds cronologicamente, os algoritmos de classificação atuais também tentam garantir que os itens com maior relevância sejam priorizados.
- Escolha fatores que podem ajudá-lo a decidir a relevância de um item de feed, como o número de curtidas, comentários e compartilhamentos, a hora em que o item foi atualizado pela última vez se o artigo contiver fotos ou vídeos e assim por diante.
- Calcule a pontuação com base nas características.
- Use a pontuação para classificar as postagens.
Configure KPIs como retenção de usuários, receita de anúncios e assim por diante para ver a eficácia do nosso sistema de classificação.
Conclusão
Apesar do Instagram ou de sua empresa-mãe, o Facebook, ser uma grande corporação, ela tem uma melhor compreensão projeto de sistema.
Eu tentei o meu melhor para fornecer a você um resumo de alto nível do feed do Instagram.
Espero que tenha sido útil e que você faça bom uso.
Deixe um comentário