En el proceso de entrevista de ingeniería de software, la ronda de diseño del sistema se ha convertido en una parte estándar de la entrevista. El objetivo principal de esta ronda es comprobar la capacidad de un candidato para construir un sistema complejo y de gran escala. Debido a la falta de experiencia en la construcción de un sistema a gran escala, muchos ingenieros luchan con esta ronda. No existe una respuesta precisa y estándar a los problemas de diseño. Puede tener diferentes conversaciones con diferentes entrevistadores para la misma pregunta. Debido a la naturaleza abierta de esta ronda, no solo los desarrolladores junior y de nivel medio, sino también los desarrolladores experimentados se sienten incómodos en esta ronda.
Esta ronda no se centra mucho en la codificación. El entrevistador quiere saber cómo diseña todo el sistema y cómo los une. Si se está preparando para esta ronda, le recomendamos que lea el blog ¿ Cómo descifrar la ronda de diseño de sistemas en las entrevistas? . Debe conocer algunos conceptos importantes del diseño de sistemas antes de comenzar a prepararse para alguna pregunta específica. Vamos a cubrir algunos conceptos básicos de diseño de sistemas para construir una base sólida para los problemas de esta ronda.
1. Equilibrio de carga
En un sistema, un servidor tiene cierta capacidad para manejar la carga o solicitud de los usuarios. Si un servidor recibe muchas requests simultáneamente más de su capacidad, el rendimiento del servidor se reduce y puede ralentizarse. Además, puede fallar (sin disponibilidad) si continúa durante un período más largo. Puede agregar más servidores (escala horizontal) y resolver este problema distribuyendo la cantidad de requests entre estos servidores. Ahora la pregunta es quién se hará cargo de distribuir la solicitud y equilibrar la carga. ¿Quién va a decidir qué solicitud debe asignarse a qué servidor para aliviar la carga de un solo servidor? Aquí viene el papel del equilibrador de carga.
El trabajo de un balanceador de carga es distribuir el tráfico a muchos servidores diferentes para ayudar con el rendimiento, la latencia y la escalabilidad. Puede colocar el balanceador de carga frente a los clientes (también se puede insertar en otros lugares) y luego el balanceador de carga enrutará la solicitud entrante a través de múltiples servidores web. En resumen, los balanceadores de carga son administradores de tráfico y asumen la responsabilidad de la disponibilidad y el rendimiento del sistema. Nginx, Cisco, TP-Link, Barracuda, Citrix, Elastic Load Balancing de AWS… estos son algunos balanceadores de carga populares disponibles en el mercado.
2. Almacenamiento en caché
Hablamos sobre la carga en los servidores en la sección de equilibrio de carga, pero una cosa que debe saber es que, por lo general, su servidor web no es el primero en caer, de hecho, con bastante frecuencia es su servidor de base de datos el que puede estar bajo cargas altas de operaciones de escritura o lectura. Muy a menudo visitamos la base de datos para varias consultas y uniones, lo que ralentiza el rendimiento del sistema. Para manejar estas consultas y muchas lecturas y escrituras, el almacenamiento en caché es la mejor técnica para usar.
¿Vas a tu tienda más cercana a comprar algún imprescindible cada vez que necesitas algo en tu cocina? Absolutamente no. En lugar de visitar la tienda más cercana cada vez que queremos comprar y almacenar algunos elementos básicos en nuestro refrigerador y nuestra alacena. Esto es almacenamiento en caché. El tiempo de cocción se reduce si los alimentos ya están disponibles en su refrigerador. Esto ahorra mucho tiempo. Las mismas cosas suceden en el sistema. Acceder a los datos desde la memoria principal (RAM) es más rápido que acceder a los datos desde la memoria secundaria (disco). Al utilizar la técnica de almacenamiento en caché, puede acelerar el rendimiento de su sistema.
Si necesita confiar en una determinada pieza de datos a menudo, almacene en caché los datos y recupérelos más rápido de la memoria en lugar del disco. Este proceso reduce la carga de trabajo en los servidores backend. El almacenamiento en caché ayuda a reducir las llamadas de red a la base de datos. Algunos servicios de almacenamiento en caché populares son Memcache, Redis y Cassandra. Muchos sitios web usan CDN (red de entrega de contenido), que es una red global de servidores. CDN almacena en caché archivos de activos estáticos como imágenes, javascript, HTML o CSS y hace que el acceso sea muy rápido para los usuarios. Puede insertar almacenamiento en caché en el cliente (p. ej., almacenamiento del navegador), entre el cliente y el servidor (p. ej., CDN) o en el propio servidor.
3. apoderados
Con bastante frecuencia, es posible que haya visto alguna notificación en su PC para agregar y configurar los servidores proxy, pero ¿qué son exactamente los servidores proxy y cómo funcionan? Por lo general, los servidores proxy son un fragmento de código o una pieza intermedia de hardware/software que se encuentra entre un cliente y otro servidor. Puede residir en la computadora local del usuario o en cualquier lugar entre los clientes y los servidores de destino. Un servidor proxy recibe requests del cliente y las transmite a los servidores de origen, luego reenvía la respuesta recibida del servidor al cliente de origen. En algunos casos, cuando el servidor recibe la solicitud, la dirección IP no está asociada con el cliente sino que es del servidor proxy. Esto sucede cuando el servidor proxy oculta la identidad del cliente.
En general, cuando las personas usan el término proxy, se refieren a «proxy de reenvío». El ‘proxy de reenvío’ está diseñado para ayudar a los usuarios y actúa en nombre de (sustituye) al cliente en la interacción entre el cliente y el servidor. Reenvía las requests del usuario y actúa como representante personal del usuario. En el diseño de sistemas, especialmente en sistemas complejos, los proxies son muy útiles, especialmente los ‘proxies inversos’. Los ‘proxies inversos’ son lo opuesto a los ‘proxy directos’. Un proxy inverso actúa en nombre de un servidor y está diseñado para ayudar a los servidores.
En el servidor de ‘proxy directo’ no sabrá que la solicitud y la respuesta se enrutan a través del proxy, y en un proxy inverso, el cliente no sabrá que la solicitud y la respuesta viajan a través de un proxy. A un ‘proxy inverso’ se le pueden asignar muchas tareas para ayudar al servidor principal y puede actuar como un guardián, un filtro, un equilibrador de carga y un asistente completo.
Por lo general, los proxies se usan para manejar requests, filtrar requests o registrar requests o, a veces, transformar requests (agregando/eliminando encabezados, cifrando/descifrando o comprimiendo). Ayuda a coordinar las requests de varios servidores y se puede utilizar para optimizar el tráfico de requests desde una perspectiva de todo el sistema.
Reenviar proxy:
Proxy inverso:
4. Teorema de la PAC
CAP significa Consistencia, Disponibilidad y Tolerancia de Partición . El teorema establece que no puede lograr todas las propiedades al mejor nivel en una sola base de datos, ya que existen compensaciones naturales entre los elementos. Solo puede elegir dos de tres a la vez y eso depende totalmente de sus prioridades según sus requisitos. Por ejemplo, si su sistema necesita estar disponible y ser tolerante a las particiones, entonces debe estar dispuesto a aceptar cierta latencia en sus requisitos de consistencia. Las bases de datos relacionales tradicionales encajan naturalmente en el lado de CA , mientras que los motores de bases de datos no relacionales satisfacen principalmente los requisitos de AP y CP .
- Coherencia significa que cualquier solicitud de lectura devolverá la escritura más reciente. La consistencia de los datos suele ser «fuerte» para las bases de datos SQL y para la base de datos NoSQL, la consistencia puede ser desde «eventual» hasta «fuerte».
- Disponibilidad significa que un Node que no responde debe responder en un tiempo razonable. No todas las aplicaciones necesitan ejecutarse las 24 horas del día, los 7 días de la semana con una disponibilidad del 99,999 %, pero lo más probable es que prefiera una base de datos con mayor disponibilidad.
- La tolerancia a la partición significa que el sistema continuará funcionando a pesar de las fallas de la red o del Node.
Tenga en cuenta este teorema CAP en su entrevista de diseño del sistema. Toma la decisión en función del tipo de aplicación y de tus prioridades. ¿Está realmente bien si su sistema se cae durante unos segundos o unos minutos, si no, entonces la disponibilidad debería ser su principal preocupación? Si se trata de algo con información transaccional real, como una transacción de acciones o una transacción financiera, es posible que valore la coherencia por encima de todo. Intente elegir la tecnología que mejor se adapte a las compensaciones que desea realizar.
Nota: Los sistemas de CA no están definidos para sistemas distribuidos. Sin embargo, en el caso de una configuración de un solo Node, puede obtener capacidades de CA. Además, los sistemas distribuidos deben soportar la tolerancia de partición debido a fallas en la red. Por lo tanto, usted elige Consistencia o Disponibilidad, es decir, construye un sistema CP o AP.
5. Bases de datos
En las entrevistas de diseño del sistema, no es raro que se le pida que diseñe el esquema de la base de datos sobre qué tablas puede estar usando. cómo se verá la clave principal y cuáles son sus índices. También debe elegir los diferentes tipos de soluciones de almacenamiento (relacional o no relacional) diseñadas para diferentes casos de uso. Vamos a discutir algunos conceptos importantes de las bases de datos que se usan con frecuencia en el diseño de sistemas.
- Indexación de bases de datos: los índices de bases de datos suelen ser una estructura de datos que facilita la búsqueda rápida de bases de datos… pero ¿cómo? entendamos con un ejemplo. Suponga que tiene una tabla de base de datos con 200 millones de filas y esta tabla se usa para buscar uno o dos valores en cada registro. Ahora, si necesita recuperar un valor de una fila específica, debe iterar sobre la tabla, lo que puede ser un proceso lento, especialmente si es el último registro de la tabla. Podemos utilizar la indexación para este tipo de problemas.
Básicamente, la indexación es la forma de clasificar una serie de registros en varios campos. Cuando agrega un índice en una tabla en un campo, crea otra estructura de datos que contiene el valor del campo y un puntero al registro con el que se relaciona. A continuación, esta estructura de índice se ordena, lo que permite realizar búsquedas binarias en ella. Si tiene 200 millones de registros en una tabla con nombres y edades y desea recuperar listas de personas que pertenecen a un grupo de edad, debe agregar un índice en el atributo de edad en la base de datos. Lea más sobre este tema en el enlace Indexación en la base de datos.
- Replicación: ¿Qué sucederá si su base de datos maneja tanta carga? Se bloqueará en cierto punto y todo su sistema dejará de funcionar porque todas las requests dependen de los datos en los servidores. Para evitar este tipo de fallas, utilizamos la replicación, que simplemente significa duplicar su base de datos (maestro) y permitir solo la operación de lectura en estas réplicas (esclavo) de su base de datos. La replicación resuelve el problema de disponibilidad en su sistema y asegura la redundancia en la base de datos si una falla. Usted creó la réplica (esclava) de su base de datos, pero ¿cómo extraería los datos de la base de datos original (maestra)? ¿Cómo sincronizaría los datos entre las réplicas, ya que están destinados a tener los mismos datos?
Puede elegir un enfoque síncrono (al mismo tiempo que los cambios en la base de datos principal) o asíncrono según sus necesidades. Si es asincrónico, es posible que deba aceptar algunos datos inconsistentes porque los cambios en la base de datos maestra pueden no reflejarse en la esclava antes de que falle. Si necesita que el estado entre las dos bases de datos sea coherente, la replicación debe ser rápida y puede optar por un enfoque síncrono. También debe asegurarse de que si la operación de escritura en la réplica falla, la operación de escritura en la base de datos principal también falla (atomicidad).
- Fragmentación o partición de datos: la replicación de datos resuelve el problema de disponibilidad, pero no resuelve los problemas de rendimiento y latencia (velocidad). En esos casos, debe fragmentar su base de datos, lo que simplemente significa ‘fragmentar’ o particionar sus registros de datos y almacenar esos registros en varias máquinas. Por lo tanto, la fragmentación de datos divide su enorme base de datos en bases de datos más pequeñas. Tomemos el ejemplo de Twitter, donde se realizan muchas escrituras. Para manejar este caso, puede usar la fragmentación de la base de datos donde divide la base de datos en varias bases de datos maestras.
Existen principalmente dos formas de fragmentar su base de datos: fragmentación horizontal y fragmentación vertical. En la fragmentación vertical, toma cada mesa y coloca cada mesa en una nueva máquina. Entonces, si tiene una tabla de usuarios, una tabla de tweets, una tabla de comentarios, una tabla de soporte de usuarios, cada una de ellas estará en diferentes máquinas. Ahora, ¿qué pasa si tienes una sola tabla de tweets y es muy grande? En ese caso, puede usar la fragmentación horizontal donde toma una sola tabla y la divide en varias máquinas. Puede tomar algún tipo de clave como ID de usuario y puede dividir los datos en partes y luego puede asignar datos a diferentes máquinas. Entonces, la partición horizontal depende de una clave que es un atributo de los datos que está almacenando para particionar los datos.
Curso de diseño de sistemas GeeksforGeeks
¿Quiere conseguir un trabajo de desarrollador/ingeniero de software en una empresa de tecnología líder? o ¿Quiere hacer una transición sin problemas de SDE I a SDE II o perfiles de desarrollador sénior? En caso afirmativo, ¡entonces debe sumergirse profundamente en el mundo del diseño de sistemas! Un dominio decente sobre los conceptos de diseño de sistemas es muy esencial, especialmente para los profesionales que trabajan, para obtener una ventaja muy necesaria sobre los demás durante las entrevistas técnicas.
Y es por eso que GeeksforGeeks le brinda un Diseño de sistemas en vivo centrado en entrevistas en profundidad que lo ayudará a prepararse para las preguntas relacionadas con Diseños de sistemas para Google, Amazon, Adobe, Uber y otras empresas basadas en productos.
Publicación traducida automáticamente
Artículo escrito por anuupadhyay y traducido por Barcelona Geeks. The original can be accessed here. Licence: CCBY-SA