Análisis en profundidad del diseño e implementación del sistema de suscripción de noticias

Este artículo se publicó por primera vez en la cuenta oficial: ¡Más IA (power_ai), bienvenido a prestar atención, la programación y los productos secos de IA se entregarán a tiempo!

En este capítulo, se le pide que diseñe un sistema de suscripción de noticias. ¿Qué es una suscripción al boletín? De acuerdo con la página de ayuda de Facebook, "La sección de noticias es la lista constantemente actualizada de historias en el medio de su página. La sección de noticias incluye actualizaciones de estado, fotos, videos, enlaces, actividad de aplicaciones y actualizaciones de personas, páginas y grupos. sigues en Facebook, dale me gusta” [1]. Esta es una pregunta de entrevista popular. Problemas similares comunes incluyen: Diseño de noticias de Facebook, Instagram Feed, Twitter Timeline, etc.

imagen-20230525202508214

Paso 1: comprender el problema y determinar el alcance del diseño

El primer conjunto de preguntas aclaratorias es comprender lo que estaba pensando el entrevistador cuando le pidió que diseñara un sistema de suministro de noticias. Como mínimo, debe averiguar qué funciones admitir. Aquí hay un ejemplo de un candidato comunicándose con un entrevistador:

Candidato : ¿Es esta una aplicación móvil? ¿O una aplicación web? ¿O ambos?
Entrevistador : Ambos.

Candidato : ¿Cuáles son las características importantes?
Entrevistador : un usuario puede hacer una publicación y ver las publicaciones de sus amigos en la página de suministro de noticias.

Candidato : ¿Las fuentes de noticias están ordenadas en orden cronológico inverso o en algún orden específico, como la puntuación del tema? Por ejemplo, las publicaciones de tus amigos cercanos obtienen una puntuación más alta.
Entrevistador : Para simplificar, supongamos que las suscripciones se ordenan en orden cronológico inverso.

Candidato : ¿Cuántos amigos puede tener un usuario?
Entrevistador : 5000

Candidato : ¿Cuánto tráfico hay?
Entrevistador : 10 millones de usuarios activos diarios

Candidatos : ¿Pueden los feeds contener imágenes, videos o solo texto?
Entrevistador : puede contener archivos multimedia, incluidas imágenes y videos.

Ahora que ha recopilado los requisitos, nos centramos en diseñar el sistema.

Paso 2: Proponga un diseño de alto nivel y obtenga la aprobación

El diseño se divide en dos procesos: publicación por suscripción y construcción de suscripción de noticias.

  • Publicación por suscripción: cuando un usuario publica una publicación, los datos correspondientes se escriben en el caché y la base de datos. Una publicación se envía a la sección de noticias de su amiga.
  • Construcción de la fuente de noticias: para simplificar, supongamos que una fuente de noticias se construye agregando las publicaciones de amigos en orden cronológico inverso.

API de noticias

La API de News Feed es la forma principal en que el cliente se comunica con el servidor. Estas API están basadas en HTTP y permiten a los clientes realizar operaciones, incluido el estado de publicación, la recuperación de fuentes de noticias, la adición de amigos y más. Discutimos las dos API más importantes: la API de publicación de suscripción y la API de recuperación de suscripción de noticias.

Suscríbete para publicar API

Para publicar una publicación, se envía una solicitud HTTP POST al servidor. Las API son las siguientes:

Parámetros POST /v1/me/feed
:

  • contenido: el contenido es el texto de la publicación.
  • auth_token: se utiliza para autenticar las solicitudes de la API.

API de recuperación de fuentes de noticias

La API para recuperar feeds de noticias se ve así:

GET /v1/me/
parámetros de alimentación:

  • auth_token: se utiliza para autenticar las solicitudes de la API.

Suscríbete para publicar

La figura 11-2 muestra el diseño de alto nivel del flujo de publicación por suscripción.

imagen-20230525202541527

  • Usuario: el usuario puede ver el suministro de noticias en el navegador o en la aplicación móvil. El usuario publica una publicación con contenido "Hola" a través de la API:
    /v1/me/feed?content=Hello&auth_token={auth_token}
  • Load Balancer: distribuye el tráfico a los servidores web.
  • Servidor web: El servidor web redirige el tráfico a diferentes servicios internos.
  • Servicio de publicación: publicaciones persistentes en la base de datos y caché.
  • Servicio Fanout: envíe contenido nuevo a las fuentes de noticias de sus amigos. Los datos de noticias se almacenan en caché para una recuperación rápida.
  • Servicio de notificación: notifica a tus amigos que hay nuevo contenido disponible y envía notificaciones automáticas.

Construcción de noticias

En esta sección, discutiremos cómo se construyen las fuentes de noticias bajo el capó. La Figura 11-3 muestra el diseño de alto nivel:

imagen-20230525202600750

  • Usuario: un usuario envía una solicitud para recuperar su fuente de noticias. La solicitud es la siguiente: /v1/me/feed.
  • Equilibrador de carga: un equilibrador de carga redirige el tráfico a los servidores web.
  • Servidor web: el servidor web enruta las solicitudes al servicio de suscripción de noticias.
  • Servicio de suscripción de noticias: el servicio de suscripción de noticias obtiene suscripciones de noticias de la memoria caché.
  • Caché de suministro de noticias: almacena los ID de suministro de noticias necesarios para procesar los suministros de noticias.

Paso tres: diseño en profundidad

El diseño de alto nivel cubre brevemente dos flujos: publicación por suscripción y construcción de fuentes de noticias. Aquí, discutimos estos temas con más profundidad.

Análisis profundo de liberación de suscripción

La figura 11-4 muestra el diseño detallado de una publicación por suscripción. Hemos analizado la mayoría de los componentes del diseño de alto nivel y ahora nos centraremos en dos componentes: el servidor web y el servicio de difusión.

imagen-20230525202628644

Servidor web

Además de comunicarse con los clientes, los servidores web también realizan autenticación y limitación de velocidad.

Solo los usuarios que iniciaron sesión con un auth_token válido pueden hacer publicaciones. El sistema limita la cantidad de publicaciones que un usuario puede hacer dentro de un cierto período de tiempo, lo cual es esencial para evitar el spam y el contenido malicioso.

servicio de difusión

La difusión es el proceso de pasar una publicación a todos tus amigos. Hay dos tipos de modelos de inundación: inundación en escritura (también conocido como modelo de inserción) e inundación en lectura (también conocido como modelo de extracción). Ambos modelos tienen pros y contras. Explicaremos su flujo de trabajo y exploraremos las mejores formas de respaldar nuestro sistema.

Difusión en escritura. En este enfoque, las fuentes de noticias se calculan previamente al escribir. Las nuevas publicaciones se envían a los cachés de los amigos tan pronto como se publican.

ventaja:

  • Las fuentes de noticias se generan en tiempo real y se pueden enviar a los amigos al instante.
  • Debido a que las fuentes de noticias se calculan previamente cuando se escriben, la búsqueda de fuentes de noticias es muy rápida.

defecto:

  • Si un usuario tiene muchos amigos, buscar la lista de amigos y generar fuentes de noticias para todos ellos es lento y requiere mucho tiempo. Este es el llamado problema de las teclas de acceso rápido.
  • Para los usuarios inactivos o los usuarios que rara vez inician sesión, la precomputación de las fuentes de noticias desperdicia recursos informáticos.

Difusión durante la lectura. Genera un feed de noticias al leer. Este es un modelo bajo demanda. Cuando un usuario carga la página de inicio, se extraen las publicaciones más recientes.

ventaja:

  • La difusión en lectura funciona mejor para usuarios inactivos o usuarios que rara vez inician sesión porque no desperdicia recursos computacionales en ellos.
  • Los datos no se envían a los amigos, por lo que no hay problemas con las teclas de acceso rápido.

defecto:

  • La obtención de fuentes de noticias es lenta porque las fuentes de noticias no están precalculadas.

Adoptamos un enfoque híbrido para aprovechar los beneficios de ambos enfoques y evitar sus inconvenientes. Dado que obtener fuentes de noticias rápidamente es fundamental, utilizamos un modelo de inserción para la mayoría de nuestros usuarios. Para aquellas celebridades o usuarios con muchos amigos/fans, permitimos que los fans obtengan contenido de noticias a pedido para evitar sobrecargar el sistema. El hashing consistente es una técnica útil que puede ayudar a distribuir solicitudes/datos de manera más uniforme, mitigando los problemas de teclas de acceso rápido.

Echemos un vistazo más de cerca al servicio de difusión que se muestra en la figura 11-5.

imagen-20230525202659614

Los servicios de difusión funcionan de la siguiente manera:

  1. Obtenga ID de amigos de la base de datos de gráficos. Las bases de datos de gráficos son adecuadas para administrar las relaciones de amigos y las recomendaciones de amigos. Los lectores interesados ​​en aprender más sobre este concepto pueden consultar la referencia [2].
  2. Obtenga información de amigos del caché de usuario. Luego, el sistema filtra a los amigos según la configuración del usuario. Por ejemplo, si bloquea a alguien, sus publicaciones no aparecerán en su suministro de noticias, incluso si todavía son amigos. Otra razón por la que las publicaciones pueden no aparecer es que los usuarios pueden compartir información de forma selectiva con amigos específicos u ocultar información a otros.
  3. Enviar lista de amigos y nueva identificación de publicación a la cola de mensajes.
  4. Los trabajadores de difusión obtienen datos de las colas de mensajes y almacenan datos de fuentes de noticias en la caché de fuentes de noticias. Puede pensar en la memoria caché del suministro de noticias como un **mapa. Siempre que se publique una nueva publicación, se agregará a la tabla de noticias que se muestra en la Figura 11-6. Si almacenamos todo el usuario y publicamos objetos en caché, el consumo de memoria puede llegar a ser muy grande. Por lo tanto, solo se almacena el ID. Para mantener el tamaño de la memoria pequeño, establecemos un límite configurable. Las posibilidades de que un usuario explore miles de publicaciones en un suministro de noticias son escasas. La mayoría de los usuarios solo están interesados ​​en el contenido más reciente, por lo que los errores de caché son bajos.
  5. Almacenar** en la memoria caché del suministro de noticias. La figura 11-6 muestra cómo se ve una fuente de noticias en el caché.

imagen-20230525202713257

Suscripción a noticias para análisis en profundidad

La figura 11-7 muestra el diseño detallado de la obtención de noticias.

imagen-20230525202726527

Como se muestra en la Figura 11-7, el contenido multimedia (imágenes, videos, etc.) se almacena en una CDN para una recuperación rápida. Veamos cómo el cliente recibe las noticias.

  1. Un usuario envía una solicitud para obtener su feed de noticias. La solicitud es la siguiente: /v1/me/feed
  2. Un equilibrador de carga redistribuye las solicitudes a los servidores web.
  3. El servidor web llama al servicio de suscripción de noticias para obtener suscripciones de noticias.
  4. El servicio de fuentes de noticias obtiene la lista de ID de publicaciones de la caché de fuentes de noticias.
  5. La fuente de noticias de un usuario no es solo una lista de ID de suscripción. Contiene nombre de usuario, foto de perfil, contenido de publicación, imagen de publicación, etc. Por lo tanto, el servicio de suministro de noticias obtiene objetos completos de usuario y publicación de las cachés (caché de usuario y caché de publicación) para crear un suministro de noticias completo.
  6. Se devuelve al cliente un suministro de noticias completo en formato JSON para su procesamiento.

arquitectura de caché

El almacenamiento en caché es fundamental para los sistemas de suministro de noticias. Dividimos la capa de almacenamiento en caché en cinco capas, como se muestra en la Figura 11-8.

imagen-20230525202745402

  • Fuente de noticias: almacena la ID de la fuente de noticias.
  • Contenido: almacena datos para cada publicación. El contenido popular se almacena en el caché activo.
  • Social Graph: Almacena datos de relaciones con los usuarios.
  • Acción: almacena información sobre si a un usuario le gusta una publicación, responde a una publicación o realiza otras acciones en una publicación.
  • Contadores: almacene contadores para me gusta, respuestas, seguidores, seguidores, etc.

Paso 4 - Resumen

En este capítulo, diseñamos un sistema de suscripción de noticias. Nuestro diseño contiene dos procesos: publicación de suscripción y recuperación de suscripción de noticias.

Como cualquier pregunta de entrevista de diseño de sistema, no existe una manera perfecta de diseñar un sistema. Cada empresa tiene sus restricciones únicas y debe diseñar un sistema que se ajuste a esas restricciones. Es importante comprender las ventajas y desventajas de sus opciones de diseño y tecnología. Si le quedan unos minutos, puede hablar sobre problemas de escalabilidad. Para evitar debates repetitivos, a continuación solo se enumeran los puntos de debate de alto nivel.

Base de datos extendida:

  • Escalado vertical frente a escalado horizontal
  • SQL frente a NoSQL
  • replicación maestro-esclavo
  • leer réplica
  • modelo de consistencia
  • Fragmentación de base de datos

Puntos de discusión adicionales:

  • Mantener la capa de red sin estado
  • Caché de datos tanto como sea posible
  • Soporte para múltiples centros de datos
  • Use colas de mensajes para reducir el acoplamiento de componentes
  • Supervise las métricas clave. Por ejemplo, es interesante monitorear QPS durante las horas pico y la latencia cuando los usuarios actualizan sus noticias.

¡Felicitaciones por llegar hasta aquí! Dése una charla de ánimo ahora. ¡bien hecho!

Referencias

[1] Cómo funciona la suscripción al boletín:

https://www.facebook.com/help/327131014036297/

[2] Recomiende a un amigo de un amigo usando Neo4j y SQL Server:

http://geekswithblogs.net/brendonpage/archive/2015/10/26/friend-of-friend-recommendations-with-neo4j.aspx

Hola, soy Shisan, un conductor veterano que se ha desarrollado durante 7 años y una empresa extranjera durante 5 años en Internet durante 2 años. Puedo vencer a Ah San y Lao Mei, y también me han arruinado los comentarios de relaciones públicas. A lo largo de los años, trabajé a tiempo parcial, comencé un negocio, me hice cargo del trabajo privado y mezclé el trabajo. Ganó dinero y perdió dinero. En el camino, mi sentimiento más profundo es que no importa lo que aprendas, debes seguir aprendiendo. ¡Mientras puedas perseverar, es fácil lograr adelantar en las curvas! Así que no me preguntes si es demasiado tarde para hacer lo que hago ahora. Si aún no tiene una dirección, puede seguirme [cuenta pública: Más IA (power_ai)], donde a menudo compartiré información de vanguardia y conocimientos de programación para ayudarlo a acumular capital para tomar curvas y adelantar.

Supongo que te gusta

Origin blog.csdn.net/smarter_AI/article/details/131798061
Recomendado
Clasificación