Índice del contenido[Esconder][Espectáculo]
Instagram Feed es una plataforma para compartir y conectarse con las personas y las cosas que le importan. Cuando abres Instagram o actualizas tu feed, las fotografías y los videos que creemos que te interesarán se mostrarán en la parte superior.
La fuente de noticias es una colección de elementos que contienen texto, imágenes o videos creados por otras entidades en el sistema que están destinados a que los lea. Siempre está cambiando, mientras que otras organizaciones están haciendo publicaciones nuevas.
En esta publicación, veremos de cerca el diseño del sistema del feed de Instagram. Vamos a empezar.
1. Requisitos
necesidad funcional
- La fuente de noticias del usuario se crea a partir de publicaciones de otras entidades en el sistema que el usuario ha seguido o en las que está interesado.
- El texto, las imágenes y los videos se pueden encontrar en las publicaciones.
- La fuente de noticias del usuario debe actualizarse con nuevas publicaciones creadas por otros.
Criterio no funcional
- La creación de feeds de noticias debe realizarse en tiempo real. El usuario final debería experimentar solo 12 segundos de retraso.
- Agregar una nueva publicación: una nueva publicación no debería demorar más de 5 segundos en aparecer en una solicitud de fuente de noticias después de enviarla al sistema.
2. Estimación de Capacidad
- A partir de marzo de 2021, la población mundial es de solo 7.8 millones de personas. Indica que el 21% de la población mundial es un DAU (Usuario Activo Diario) de Facebook y el 32% es un MAU (Usuario Activo Mensual) de Facebook (Usuario Activo Mensual). Esto es increíble.
- Supongamos que el sistema que estamos construyendo tiene mil millones de DAU para facilitar las cosas.
- Supongamos que una persona sigue a 500 personas o empresas en Facebook. Un grupo o una página pueden considerarse una entidad.
Tráfico estimado
Suponga que un usuario descarga la fuente de noticias 10 veces al día en promedio. Por lo tanto, son aproximadamente 116 1 QPS y 10eXNUMX solicitudes por día.
Estimaciones de almacenamiento
Supongamos que mantenemos 500 publicaciones de la fuente de noticias de cada usuario en la memoria en promedio para una recuperación rápida, y cada publicación tiene un tamaño de 1 KB. Entonces, 500 KB por usuario, 500 TB para todas las DAU y 5000 computadoras con 100 GB de RAM cada una.
3. API para Sistemas
ID de usuario (GUID): el usuario cuya fuente de noticias se está recuperando.
Los siguientes campos están disponibles en el parámetro de opciones opcionales:
- afterPostId (GUID): obtenga las noticias de la publicación que sigue a esta. Si no se especifica, obtenga las publicaciones más recientes.
- count (number): el número máximo de publicaciones que cada solicitud puede devolver. El backend establece un número máximo predeterminado si no se proporciona ninguno.
- excluirReplies (booleano): evita que las respuestas se incluyan en el feed de noticias.
- El JSON devuelto contiene una lista de elementos de suministro de noticias.
4. Diseño de una base de datos
Entidades
- Usuario
- EntityId, nombre, descripción y marca de tiempo son campos obligatorios.
- Los siguientes campos son obligatorios: PostId, título, texto, authorId y marca de tiempo.
- marca de tiempo, URL y mediaId
Relaciones
- Otros Usuarios o Entidades pueden ser seguidos por un usuario. (Minnesota)
- Autor-Publicación: Tanto los usuarios como las entidades pueden crear publicaciones. Suponga que solo los usuarios pueden crear publicaciones por simplicidad. (1:n; autorId es incrustable).
- Cada publicación va acompañada de algún tipo de medio. (1:n)
5. Diseño de alto nivel
Arquitectura
Procesos
Producción de piensos
Cuando Jay solicite su flujo de noticias, el sistema hará lo siguiente:
- Recupera las identificaciones de todas las personas y cosas que sigue Jay.
- Publicaciones agregadas: dadas esas ID, obtenga las publicaciones más recientes, populares y relevantes.
- Clasifique las publicaciones según su relevancia y tiempo.
- Caché: guarda los feeds creados y envía a Jay las 20 publicaciones principales.
- Cuando Jay ha terminado de leer las primeras 20 publicaciones, se envía otra solicitud para obtener las siguientes 20 publicaciones.
Distribución de alimentos
Supongamos que Jay está siguiendo a Aayush y que Aayush publica algo nuevo. El sistema deberá actualizar las noticias de Jay:
- Recupera las identificaciones de los seguidores de Aayush.
- Agregar nuevos artículos: agregue la publicación de Aayush al grupo de noticias de los seguidores de esas ID.
- Clasifique las publicaciones según su relevancia y tiempo.
- Actualice el caché de la publicación de clasificación.
- Los seguidores deben ser notificados cuando se publiquen nuevas publicaciones.
Componentes
Las conexiones de los usuarios son mantenidas por servidores web.
Los procedimientos indicados anteriormente son ejecutados por el servidor de aplicaciones.
Caché y base de datos:
- Usuario/entidad de la base de datos relacional
- Base de datos relacional (post)
- Atributo de imagen/video: Aayush storge
- Metadatos de bases de datos relacionales
Servicios personalizados:
- Producción de piensos
- Notificación de feeds
6. Diseño detallado
Generación de pienso
Implementación ingenua de lectura fan-out:
Los problemas con esta implementación descuidada incluyen:
- Los usuarios con una gran cantidad de amigos/seguidores notarán una ralentización significativa, ya que debemos filtrar, fusionar y clasificar una gran cantidad de publicaciones.
- Cuando un usuario carga su página, construimos la línea de tiempo. Esto puede ser lento y tener mucha latencia.
- Cada actualización de estado dará como resultado actualizaciones de feed para todos los seguidores para actualizaciones en vivo. Esto puede causar retrasos significativos en nuestro servicio de generación de suministro de noticias.
Podemos generar previamente la cronología y guardarla en la memoria para aumentar la eficiencia.
Producción fuera de línea (escritura en abanico)
Podemos tener servidores dedicados que constantemente crean y almacenan noticias de los usuarios en la memoria. Simplemente podemos entregar las noticias desde la ubicación guardada y generada previamente cuando un usuario lo desee.
¿Cuántos elementos de fuente debe almacenarse en la memoria la fuente de un usuario?
Adáptese en función de su comportamiento de uso.
¿Deberíamos crear un suministro de noticias para todos los usuarios (y conservarlo en la memoria)?
- Para las personas que no inician sesión muy a menudo.
- El almacenamiento en caché basado en LRU es un enfoque simple.
- Una mejor solución es averiguar cómo inician sesión los usuarios. ¿Cuándo es? ¿De qué días de la semana estás hablando?
publicación de feed
Fanout es el proceso de enviar una publicación a todos tus seguidores.
Fanout leer (tirar)
Cuando solicita una fuente de noticias, el sistema recibe una solicitud de lectura. Fanout read envía una solicitud de lectura a todos sus seguidores, pidiéndoles que lean su contenido.
Pros:
- El procedimiento de escritura es económico.
- Al leer datos, es más fácil usar varios algoritmos de agregación.
Contras:
- Para una persona con muchos seguidores, la operación de lectura es bastante costosa.
- Los usuarios no verán datos nuevos hasta que los extraigan.
- Cuando tiramos para obtener las publicaciones más recientes de forma regular, es difícil encontrar la cadencia de extracción adecuada, y la mayoría de las solicitudes de extracción devolverán una respuesta vacía, desperdiciando recursos.
Fanout escribir (empujar)
Se realiza una solicitud de escritura al sistema cuando envía una nueva publicación. La solicitud de escritura se envía a todos sus seguidores para que actualicen su suministro de noticias mediante la escritura en abanico.
Pro
- El proceso de lectura es económico.
Con
- Para un usuario con millones de seguidores, la escribir el procedimiento es demasiado caro.
El rango de la alimentación
En lugar de simplemente ordenar los feeds cronológicamente, los algoritmos de clasificación actuales también intentan garantizar que se prioricen los elementos con mayor relevancia.
- Elija factores que puedan ayudarlo a decidir la relevancia de un elemento de noticias en tiempo real, como la cantidad de Me gusta, comentarios y acciones compartidas, la hora en que se actualizó por última vez si el artículo contiene fotos o videos, etc.
- Calcular la puntuación en función de las características.
- Utilice la puntuación para clasificar las publicaciones.
Configure KPI como retención de usuarios, ingresos publicitarios, etc. para ver qué tan efectivo es nuestro sistema de clasificación.
Conclusión
A pesar de que Instagram o su negocio matriz Facebook es una gran corporación, tiene una mejor comprensión de diseño de sistemas.
Hice todo lo posible para brindarle un resumen de alto nivel del feed de Instagram.
Espero que te haya sido útil y que le des un buen uso.
Deje un comentario