Guía de diseño del sistema

Desarrollar un sistema robusto, escalable y eficiente puede resultar abrumador. Sin embargo, comprender los conceptos y componentes clave puede hacer que el proceso sea más manejable. En esta publicación de blog, exploraremos los componentes básicos del diseño del sistema, como DNS, equilibrio de carga, puertas de enlace API, etc., así como una hoja de referencia concisa que puede ayudar a los desarrolladores a diseñar sistemas de diversa complejidad.

Plano de diseño del sistema/hoja de referencia

Una guía visual completa que proporciona a los desarrolladores una referencia rápida y sencilla a conceptos clave y mejores prácticas en el diseño de sistemas. Esta práctica hoja de trucos o modelo cubre temas básicos como DNS, equilibrio de carga, puertas de enlace API, procesamiento de imágenes y videos, almacenamiento en caché, bases de datos, generación de ID única, componentes estándar como servicios de pago y referencia, y protocolos de chat y transmisión. Con este valioso recurso, estará equipado para afrontar los desafíos de diseñar e implementar sistemas escalables, eficientes y confiables.

Plano de diseño del sistema: la guía definitiva: resolución completa:  https://drive.google.com/file/d/1OGC55KQqTpeUnpiT6glq_6mNpRfl4rD2/view?usp=sharing

Primera parte: Principios de diseño del sistema

1.1: Modularización—Modularización

Dividir el sistema en módulos más pequeños y manejables ayuda a reducir la complejidad, mejorar la mantenibilidad y aumentar la reutilización.

1.2: Abstracción

Ocultar detalles de implementación y mostrar solo características básicas ayuda a simplificar sistemas complejos y promover la modularidad.

1.3: Capas—Capas

Dividir el sistema en varias capas, donde cada capa proporciona un conjunto específico de funciones, promueve la separación de preocupaciones y mejora la mantenibilidad.

1.4: Escalabilidad

Diseñe el sistema para manejar una mayor carga agregando más recursos (ampliación horizontal) u optimizando la capacidad del sistema (ampliación horizontal).

1.5: Rendimiento—Rendimiento

Optimizar el tiempo de respuesta, el rendimiento y la utilización de recursos de su sistema es clave para un diseño exitoso.

1.6: Seguridad—Seguridad

Garantizar la confidencialidad, integridad y disponibilidad de los sistemas mediante la implementación de medidas y prácticas de seguridad adecuadas.

1.7: Tolerancia a fallos y resiliencia

Diseñe sistemas para resistir fallas y recuperarse exitosamente de los errores, garantizando confiabilidad y disponibilidad.

Parte 2: Componentes clave del diseño del sistema

2.1: DNS (Sistema de nombres de dominio)

DNS es un sistema de nombres jerárquico y descentralizado para computadoras, servicios u otros recursos conectados a Internet o redes privadas. Traduce nombres de dominio legibles por humanos (por ejemplo, www.example.com ) en direcciones IP, lo que permite a los usuarios acceder a sitios web y servicios de manera más eficiente.

2.2: Equilibrio de carga: equilibrio de carga

El equilibrio de carga se refiere a distribuir el tráfico de la red entre múltiples servidores para garantizar que ninguno de ellos se vea abrumado. Este enfoque mejora la disponibilidad, la confiabilidad y el rendimiento del sistema. Los algoritmos de equilibrio de carga estándar incluyen pi, conexiones mínimas y hash de IP.

2.3: Puerta de enlace API - Puerta de enlace API

Una puerta de enlace API es un servidor que actúa como intermediario entre clientes y microservicios en un sistema distribuido. Gestiona y enruta solicitudes, aplica políticas de seguridad y puede proporcionar funciones adicionales como almacenamiento en caché, registro y supervisión.

2.4: Red de entrega de contenido (CDN)

Una CDN es una red de servidores distribuidos en diferentes ubicaciones diseñada para entregar contenido a los usuarios con menor latencia y mayor ancho de banda. CDN almacena en caché el contenido en servidores perimetrales cercanos a los usuarios finales, lo que mejora el rendimiento del sistema y reduce la carga en el servidor de origen.

2.5: Cola de mensajes—Cola de mensajes

Las colas de mensajes facilitan la comunicación entre los componentes del sistema distribuido al almacenar temporalmente mensajes en colas. Implementan procesamiento asincrónico, ayudan a desacoplar componentes y mejoran la escalabilidad y la tolerancia a fallas del sistema.

2.6: Protocolos de comunicación

En el diseño del sistema se utilizan diferentes protocolos de comunicación como HTTP/HTTPS, WebSocket y gRPC. Estos protocolos tienen ventajas y desventajas, y la elección depende de factores como la latencia, la seguridad y los requisitos de transmisión de datos.

2.7: caché

El almacenamiento en caché es una técnica temporal para almacenar copias de datos, lo que permite una recuperación rápida en solicitudes futuras. Ayuda a reducir la latencia, la carga del servidor y el consumo de ancho de banda. Los mecanismos de almacenamiento en caché más populares incluyen el almacenamiento en caché en memoria, el almacenamiento en caché distribuido y el almacenamiento en caché del navegador.

2.8: Base de datos—Base de datos

La elección de la base de datos adecuada para un sistema depende de la estructura de los datos, la escalabilidad, la coherencia y la latencia. Los tipos de bases de datos comunes incluyen bases de datos relacionales (como MySQL, PostgreSQL), bases de datos NoSQL (como MongoDB, Cassandra) y bases de datos NewSQL (como Cockroach DB, Google Spanner).

2.9: Replicación—Técnicas de replicación

La replicación es el mantenimiento de múltiples copias de datos en diferentes nodos para mejorar la confiabilidad, la disponibilidad y la tolerancia a fallas. Las tecnologías de replicación estándar incluyen replicación sincrónica, replicación asincrónica y replicación semisincrónica.

2.10: Generación de UUID distribuida: generación de ID única distribuida

Crear identificadores únicos en un sistema distribuido puede ser un desafío, pero es fundamental para mantener la coherencia e integridad de los datos.

Parte 3: cargar videos e imágenes en fragmentos usando URL firmadas

En esta sección, exploraremos cómo cargar archivos de imágenes y videos de gran tamaño en fragmentos utilizando URL firmadas. Este método puede mejorar significativamente la eficiencia y confiabilidad de la carga de archivos, especialmente cuando las condiciones de la red no son ideales.

3.1: ¿Qué es una URL firmada?

Una URL firmada es una URL especialmente diseñada que permite un acceso temporal y seguro a un recurso específico, como un objeto almacenado en la nube. Estas URL contienen una firma de autenticación que permite al usuario realizar una acción específica, como cargar o descargar un archivo, durante un tiempo limitado. Los proveedores de almacenamiento en la nube populares, como Amazon S3 y Google Cloud Storage, admiten la generación de URL firmadas. A continuación se muestra un ejemplo de cómo podría verse una URL firmada:

https://example-bucket.s3.amazonaws.com/my-file.txt?\ 
  X-Amz-Algorithm=AWS4-HMAC-SHA256& 
  X-Amz-Credential=AKIAIOSFODNN7EXAMPLE%2F20220407%2Fus-east-1%2Fs3% 2Faws4_request&\ 
  X-Amz-Date=20220407T123456Z&\ 
  X-Amz-Expires=3600&\ 
  X-Amz-SignedHeaders=host&\ 
  X-Amz-Signature=a9c8a7d1644c7b351ef3034f4a1b4c9047e891c7203 eb3a9f29d8c7a74676d88

3.2: carga fragmentada

Cargar archivos grandes en una sola solicitud puede provocar tiempos de espera, un alto consumo de memoria y un mayor riesgo de fallas debido a la inestabilidad de la red. En cambio, dividir archivos grandes en partes más pequeñas y cargarlos secuencialmente o en paralelo puede mejorar la eficiencia y confiabilidad de la carga. Este método se conoce como carga "fragmentada" o "multiparte".

3.3: Combinar URL firmadas y cargas de varias partes

Para cargar archivos de vídeo e imagen en fragmentos utilizando URL firmadas, siga estos pasos generales:

  1. Divida archivos en partes más pequeñas: divida archivos grandes en partes más pequeñas en el lado del cliente, generalmente usando JavaScript. Los fragmentos pueden variar en tamaño, pero la cantidad de solicitudes y el tamaño de cada fragmento deben equilibrarse para optimizar el rendimiento de la carga.
  2. Solicite una URL firmada para cada fragmento: envíe una solicitud a su servidor para generar una URL firmada para cada fragmento. El servidor debe crear una URL firmada con la autoridad y el tiempo de vencimiento adecuados y devolverla al cliente.
  3. Cargar fragmentos utilizando URL firmadas: cargue cada fragmento al servicio de almacenamiento en la nube utilizando una URL firmada. Dependiendo del nivel deseado de concurrencia y las condiciones de la red, estas cargas pueden ocurrir de forma secuencial o en paralelo.
  4. Confirme la carga exitosa y vuelva a ensamblar: una vez que todos los fragmentos se hayan cargado exitosamente, notifique al servidor para confirmar la finalización del proceso de carga. Luego, el servidor puede volver a ensamblar los fragmentos en el archivo original, con cualquier procesamiento o validación necesarios.
  5. Manejar fallas de carga: si algún fragmento no se carga, vuelva a intentar la carga usando una nueva URL firmada o implemente una estrategia de manejo de errores para garantizar una experiencia de usuario fluida.

Al utilizar URL firmadas y cargas fragmentadas, los desarrolladores pueden manejar de manera eficiente y segura cargas de videos e imágenes de gran tamaño, mejorando la confiabilidad y el rendimiento de sus sistemas.

Parte 4: Protocolo de chat y transmisión

Esta sección analiza varios protocolos de chat y transmisión que facilitan la comunicación en tiempo real y el flujo de datos entre clientes y servidores. Comprender estos protocolos puede ayudar a los desarrolladores a crear aplicaciones interactivas y con capacidad de respuesta.

4.1: RTMP (Protocolo de mensajería en tiempo real)

RTMP es un protocolo propietario desarrollado por Adobe Systems para transmitir audio, vídeo y datos a través de Internet. Se usa comúnmente en aplicaciones de transmisión de video y proporciona comunicación de baja latencia entre clientes y servidores. Sin embargo, su popularidad ha disminuido en los últimos años debido a su dependencia del reproductor Flash.

4.2: WebRTC (comunicación web en tiempo real)

WebRTC es un proyecto de código abierto que permite comunicaciones de audio, vídeo y datos en tiempo real en navegadores web y aplicaciones móviles. Admite conexiones de igual a igual, lo que reduce la latencia y la carga del servidor. WebRTC se utiliza ampliamente para videoconferencias, juegos en línea y otras aplicaciones que requieren comunicación en tiempo real.

4.3: WebSocket

WebSocket es un protocolo de comunicaciones que permite la comunicación bidireccional full-duplex entre un cliente y un servidor a través de una única conexión a largo plazo. Debido a su baja latencia y capacidades de comunicación eficiente, WebSocket se usa a menudo en aplicaciones en tiempo real como chat, notificaciones y actualizaciones en tiempo real.

4.4: SSE (Eventos enviados por el servidor)

Server Sent Events (SSE) es una tecnología que permite a los servidores enviar actualizaciones de clientes a través de conexiones HTTP. Está diseñado para una comunicación unidireccional en tiempo real entre el servidor y el cliente, lo que lo hace adecuado para aplicaciones como actualizaciones, fuentes de noticias y notificaciones en tiempo real.

4.5: Encuesta corta HTTP

El sondeo a corto plazo implica que el cliente envíe solicitudes HTTP repetidas al servidor para buscar nuevas actualizaciones. Aunque es fácil de implementar, el sondeo breve puede generar una gran carga en el servidor y una mayor latencia debido al sondeo continuo, especialmente cuando las actualizaciones son poco frecuentes.

4.6: Encuesta larga HTTP

El sondeo largo es una mejora con respecto al sondeo corto, en el que el cliente envía una solicitud al servidor y el servidor mantiene la solicitud abierta hasta que haya nuevos datos disponibles. Este enfoque reduce la cantidad de solicitudes y la carga en el servidor, pero aún puede verse afectado por problemas de latencia y requiere una administración cuidadosa de los recursos del servidor.

4.7: Webhook

Los webhooks son devoluciones de llamadas HTTP definidas por el usuario activadas por eventos específicos en el sistema. Cuando ocurre un evento, el sitio de origen realiza una solicitud HTTP a la URL configurada para el webhook. Este enfoque permite una comunicación eficiente basada en eventos entre diferentes sistemas o servicios.

4.8: API de transmisión

Las API de transmisión permiten a los clientes consumir un flujo continuo de datos desde un servidor, generalmente mediante una conexión HTTP o WebSocket. Estas API están diseñadas para aplicaciones que requieren actualizaciones en tiempo real, como información de redes sociales, datos del mercado de valores o análisis en tiempo real.

Al comprender y aprovechar estos protocolos de chat y transmisión, los desarrolladores pueden crear aplicaciones responsivas en tiempo real que satisfagan una variedad de casos de uso y brinden una experiencia de usuario atractiva.

Parte 5: Componentes comunes en el diseño de sistemas.

Esta sección explora algunos componentes estándar que aparecen con frecuencia en el diseño de sistemas modernos. Comprender estos componentes puede ayudar a los desarrolladores a integrarlos perfectamente en sus sistemas y mejorar la funcionalidad general.

5.1: Servicio de pago—Servicio de pago

Los servicios de pago manejan transacciones entre clientes y empresas. Integrar un servicio de pago confiable es fundamental para el comercio electrónico y las plataformas basadas en suscripción. Los proveedores de servicios de pago populares incluyen Stripe, PayPal y Square. Estos servicios suelen proporcionar API para facilitar transacciones seguras y gestionar pagos recurrentes, reembolsos y más.

5.2: Servicio analítico—Servicio analítico

Los servicios de análisis permiten la recopilación, el procesamiento y la visualización de datos para ayudar a las empresas a tomar decisiones informadas. Estos servicios pueden rastrear el comportamiento del usuario, monitorear el rendimiento del sistema y analizar tendencias. Los proveedores de análisis estándar incluyen Google Analytics, Mixpanel y Amplitude. La integración de servicios de análisis en un sistema puede ayudar a las empresas a optimizar sus productos y mejorar la experiencia del usuario.

5.3: Servicio push: notificación

Los servicios de notificación mantienen a los usuarios informados sobre actualizaciones, alertas e información importante. Estos servicios pueden proporcionar notificaciones a través de varios canales, como correo electrónico, SMS y notificaciones automáticas. Ejemplos de proveedores de servicios de notificación incluyen Firebase Cloud Messaging (FCM), Amazon Simple Notification Service (SNS) y Twilio.

5.4: Buscar — Buscar

Para sistemas con grandes cantidades de datos o contenido, es esencial integrar un potente componente de búsqueda. Los servicios de búsqueda deben proporcionar capacidades de búsqueda rápidas, relevantes y escalables. Elasticsearch, Apache Solr y Amazon CloudSearch son opciones populares para implementar capacidades de búsqueda. Estos servicios suelen admitir búsqueda de texto completo, búsqueda por facetas y filtrado, lo que permite a los usuarios encontrar la información que buscan de forma rápida y eficiente.

5.5: Servicio de recomendación—Servicio de recomendación

Los servicios de recomendación utilizan algoritmos para proporcionar recomendaciones personalizadas a los usuarios en función de sus preferencias, comportamiento y otros factores. Estos servicios pueden aumentar significativamente la participación y la satisfacción del usuario. Las técnicas para generar recomendaciones incluyen filtrado colaborativo, filtrado basado en contenido y enfoques híbridos. Los algoritmos de aprendizaje automático, como la factorización matricial y el aprendizaje profundo, también se pueden utilizar para generar recomendaciones más complejas.

Al incorporar estos componentes estándar en los diseños de sus sistemas, los desarrolladores pueden mejorar la funcionalidad de sus aplicaciones y brindar una experiencia más fluida y atractiva para los usuarios.

Parte 6: Mejores prácticas de diseño de sistemas

6.1: Recopilación de requisitos

Comprenda y documente a fondo los requisitos del sistema antes de comenzar el proceso de diseño.

6.2: Patrones de diseño

Aproveche patrones de diseño probados para resolver problemas de diseño recurrentes y mejorar la arquitectura general.

6.3: Documentación—Documentación

Documente sus decisiones de diseño, suposiciones y fundamentos para garantizar una mejor comunicación y mantenibilidad.

6.4: Diseño iterativo—Diseño iterativo

Refine su diseño a través de múltiples iteraciones y comentarios para que continúe evolucionando y mejorando.

6.5: Pruebas y Validación—Pruebas y Validación

Valide su diseño según los requisitos y realice pruebas para identificar y resolver problemas potenciales.

Resumir

En resumen, el diseño de sistemas es un proceso complejo y multifacético que requiere un conocimiento profundo de diversos componentes, protocolos y tecnologías. Esta publicación de blog describe algunos temas básicos como DNS, equilibrio de carga, puertas de enlace API, componentes estándar como procesamiento de video e imágenes, almacenamiento en caché, bases de datos, generación de ID única, servicios de recomendación y pago, y protocolos de chat y transmisión.

Al aprovechar este conocimiento, los desarrolladores pueden crear sistemas escalables, eficientes y confiables que cumplan con diferentes requisitos y brinden una experiencia de usuario perfecta. La clave es recordar que el diseño del sistema es un proceso iterativo y la mejora continua es fundamental para crear y mantener aplicaciones exitosas. Con una base sólida en estos conceptos básicos y un enfoque en la adaptabilidad, los desarrolladores pueden afrontar con confianza los desafíos de diseñar e implementar sistemas robustos.

Supongo que te gusta

Origin blog.csdn.net/jeansboy/article/details/131703142
Recomendado
Clasificación