Índice analítico[Ocultar][Mostrar]
Instagram Feed é unha plataforma para compartir e conectarse coas persoas e cousas que che importan. Cando abras Instagram ou actualices o teu feed, as fotografías e os vídeos que pensamos que che interesarán mostraranse na parte superior.
A fonte de noticias é unha colección de elementos que conteñen texto, imaxes ou vídeos creados por outras entidades do sistema que están dirixidos para que poidas lelos. Sempre está cambiando, mentres outras organizacións están facendo novas publicacións.
Nesta publicación, analizaremos de preto o deseño do sistema do feed de Instagram. Entón, imos comezar.
1. Requisitos
Necesidade funcional
- A fonte de noticias do usuario créase a partir de publicacións doutras entidades do sistema que o usuario seguiu ou que lle interese.
- Podes atopar texto, imaxes e vídeos nas publicacións.
- A fonte de noticias do usuario debe actualizarse con novas publicacións creadas por outros.
Criterio non funcional
- A creación de fontes de noticias debe realizarse en tempo real. O usuario final debería experimentar só 12 segundos de atraso.
- Engadir unha nova publicación: non debería tardar máis de 5 segundos en aparecer unha nova publicación nunha solicitude de fonte de noticias despois de enviarla ao sistema.
2. Estimación da Capacidade
- En marzo de 2021, a poboación mundial era de só 7.8 millóns de persoas. Indica que o 21% da poboación mundial é un DAU (Usuario Activo Diario) de Facebook e o 32% é un MAU (Usuario Activo Mensual) (Usuario Activo Mensual). Iso é incrible.
- Imos finxir que o sistema que estamos a construír ten 1 millóns de DAU para facilitar as cousas.
- Supoña que unha persoa segue a 500 persoas ou empresas en Facebook. Un grupo ou unha páxina pode considerarse unha entidade.
Tráfico estimado
Supoña que un usuario descarga a fonte de noticias unha media de 10 veces ao día. Polo tanto, son aproximadamente 116K QPS e 1e10 solicitudes cada día.
Estimacións de almacenamento
Supoñamos que mantemos 500 publicacións da fonte de noticias de cada usuario na memoria de media para a súa recuperación rápida e que cada publicación ten un tamaño de 1 KB. Así, 500 KB por usuario, 500 TB para todas as DAU e 5000 ordenadores con 100 GB de RAM cada un.
3. APIs para sistemas
userId (GUID): o usuario cuxa fonte de noticias se está a buscar.
Os seguintes campos están dispoñibles no parámetro opcións opcionais:
- afterPostId (GUID): obtén a fonte de noticias da publicación seguinte a esta. Se non se especifica, obtén as publicacións máis recentes.
- count (número): o número máximo de publicacións que pode devolver cada solicitude. O backend establece un número máximo predeterminado se non se fornece ningún.
- excludeReplies (booleano): impide que as respostas se inclúan na fonte de noticias.
- O JSON devolto contén unha lista de elementos da fonte de noticias.
4. Deseño dunha base de datos
Entidades
- Usuario
- entityId, nome, descrición e marca de tempo son todos os campos obrigatorios.
- Os seguintes campos son obrigatorios: PostId, título, texto, authorId e timestamp.
- marca de tempo, url e mediaId
Relación
- Outros usuarios ou entidades poden ser seguidos por un usuario. (m:n)
- Autor-Publicación: tanto os usuarios como as entidades poden crear publicacións. Supoña que só os usuarios poden crear publicacións por simpleza. (1:n; authorId é incrustable).
- Cada publicación vai acompañada dalgún medio de comunicación. (1:n)
5. Deseño de Alto Nivel
arquitectura
Fluxos de traballo
Produción de pensos
Cando Jay solicite o seu fluxo de noticias, o sistema fará o seguinte:
- Recupera os ID de todas as persoas e cousas que Jay segue.
- Publicacións agregadas: dados eses ID, obtén as publicacións máis recentes, populares e relevantes.
- Clasifica as publicacións segundo a súa relevancia e momento.
- Caché: garda as fontes creadas e envía a Jay as 20 publicacións principais.
- Cando Jay rematou de ler as 20 primeiras publicacións, envíase outra solicitude para obter as seguintes 20.
Distribución de pensos
Supoña que Jay segue a Aayush e que Aayush publica algo novo. A fonte de noticias de Jay terá que ser actualizada polo sistema:
- Recupera os ID dos seguidores de Aayush.
- Engade novos artigos: engade a publicación de Aayush ao grupo de noticias dos seguidores deses ID.
- Clasifica as publicacións segundo a súa relevancia e momento.
- Actualiza a caché da publicación de clasificación.
- Os seguidores deben ser notificados cando se publiquen novas publicacións.
Compoñentes
As conexións dos usuarios son mantidas por servidores web.
Os procedementos indicados anteriormente son executados polo servidor de aplicacións.
Caché e base de datos:
- Usuario/entidade da base de datos relacional
- Base de datos relacional (publicación)
- Atributo imaxe/vídeo: Aayush storge
- Metadatos de bases de datos relacionais
Servizos personalizados:
- Produción de pensos
- Notificación de feeds
6. Deseño detallado
Xeración de penso
Implementación inxenua de lectura fan-out:
Os problemas con esta implementación descoidada inclúen:
- Os usuarios cun gran número de amigos/seguidores notarán unha desaceleración significativa xa que debemos filtrar, combinar e clasificar un gran número de publicacións.
- Cando un usuario carga a súa páxina, construímos a liña de tempo. Isto pode ser lento e ter moita latencia.
- Cada actualización de estado dará lugar a actualizacións de feed para todos os seguidores para actualizacións en directo. Isto pode provocar atrasos importantes no noso servizo de xeración de fontes de noticias.
Podemos xerar previamente a cronoloxía e gardala na memoria para aumentar a eficiencia.
Produción fóra de liña (escritura fan-out)
Podemos ter servidores dedicados que crean e almacenan constantemente as fontes de noticias dos usuarios na memoria. Só podemos entregar a fonte de noticias desde a localización prexerada e gardada sempre que un usuario o desexe.
Cantos elementos de feed debe almacenarse na memoria o feed dun usuario?
Adapte en función do seu comportamento de uso.
Deberiamos facer unha fonte de noticias para todos os usuarios (e conservala na memoria)?
- Para persoas que non inician sesión moi a miúdo.
- O caché baseado en LRU é un enfoque sinxelo.
- Unha mellor solución é descubrir como inician sesión os usuarios. Cando é? De que días laborais falas?
Publicación do feed
Fanout é o proceso de enviar unha publicación a todos os teus seguidores.
Fanout lectura (pull)
Cando solicita unha fonte de noticias, o sistema recibe unha solicitude de lectura. Fanout read envía unha solicitude de lectura a todos os teus seguidores, pedíndolles que lean o seu contido.
Pros:
- O procedemento de escritura é barato.
- Ao ler datos, é máis fácil usar varios algoritmos de agregación.
Contra:
- Para unha persoa con moitos seguidores, a operación de lectura é bastante cara.
- Os usuarios non verán os datos novos ata que os extraen.
- Cando tiramos para buscar as publicacións máis recentes de forma regular, é difícil atopar a cadencia de extracción adecuada e a maioría das solicitudes de extracción devolverán unha resposta baleira, desperdiciando recursos.
Escritura fanout (push)
Realízase unha solicitude de escritura ao sistema cando envía unha nova publicación. A solicitude de escritura envíase a todos os teus seguidores para que actualicen a súa fonte de noticias usando Fanout write.
por
- O proceso de lectura é barato.
con
- Para un usuario con millóns de seguidores, o escribir procedemento é demasiado caro.
O rango do Feed
En lugar de ordenar só cronoloxicamente as fontes, os algoritmos de clasificación actuais tamén tentan garantir que se prioricen os elementos con maior relevancia.
- Escolle factores que che poden axudar a decidir a relevancia dun elemento de feed, como o número de Gústame, comentarios e comparticións, a hora da última actualización do elemento se o artigo contén fotos ou vídeos, etc.
- Calcula a puntuación en función das características.
- Usa a puntuación para clasificar as publicacións.
Configura KPI como retención de usuarios, ingresos por anuncios, etc. para ver o eficaz que é o noso sistema de clasificación.
Conclusión
A pesar de que Instagram ou a súa empresa matriz, Facebook é unha enorme corporación, entende mellor deseño do sistema.
Intentei ofrecerche un resumo de alto nivel do feed de Instagram.
Espero que fose útil e que o fagades ben.
Deixe unha resposta