Preparación para la entrevista de diseño de sistemas | Programming Made Easy | Skillshare

Velocidad de reproducción


1.0x


  • 0.5x
  • 0.75x
  • 1x (Normal)
  • 1.25x
  • 1.5x
  • 1.75x
  • 2x

Preparación para la entrevista de diseño de sistemas

teacher avatar Programming Made Easy, Software Developer

Ve esta clase y miles más

Obtenga acceso ilimitado a todas las clases
Clases enseñadas por líderes de la industria y profesionales activos
Los temas incluyen ilustración, diseño, fotografía y más

Ve esta clase y miles más

Obtenga acceso ilimitado a todas las clases
Clases enseñadas por líderes de la industria y profesionales activos
Los temas incluyen ilustración, diseño, fotografía y más

Lecciones en esta clase

    • 1.

      ¡Bienvenido a esta clase!

      1:35

    • 2.

      ¿Qué es el diseño de sistemas?

      5:33

    • 3.

      Una plantilla para cualquier pregunta

      7:12

    • 4.

      El servicio de acortamiento de URL

      24:22

    • 5.

      La aplicación para compartir fotos

      19:02

  • --
  • Nivel principiante
  • Nivel intermedio
  • Nivel avanzado
  • Todos los niveles

Generado por la comunidad

El nivel se determina según la opinión de la mayoría de los estudiantes que han dejado reseñas en esta clase. La recomendación del profesor o de la profesora se muestra hasta que se recopilen al menos 5 reseñas de estudiantes.

83

Estudiantes

--

Proyectos

Acerca de esta clase

Hoy en día, casi todas las empresas piden el diseño de diversos sistemas en sus entrevistas de diseño de sistemas. Principalmente la ronda de diseño de sistemas es para personas con experiencia, pero empresas más importantes como las de FANG y así sucesivamente, están ansiosas por pedir a los diseños incluso más frescos. Hay una ronda dedicada de una a dos horas para el diseño de sistemas. La ronda de diseño de sistemas tiene múltiples propósitos, el entrevistador quiere conocer tu amplitud de conocimientos, quieren entender cómo abordas un problema abierto y cómo manejas situaciones estresantes.

El diseño de sistemas también se conoce como diseño de alto nivel. El diseño de alto nivel no es más que decidir qué componentes necesitaremos en nuestro sistema, cómo se comunicarán todos los componentes entre sí y sistemas externos y qué capacidad somos de nuestro sistema. Estas son cosas importantes mientras diseñas cualquier sistema para que sea confiable, disponible, consistente y eficiente.

Este curso está diseñado de una manera incremental con el propósito de comprender. Inicialmente, se discuten todos los conceptos y componentes del diseño de sistemas. Se explica un procedimiento de prueba completa para abordar cualquier problema de diseño de sistema. Todos los estudios de casos se dan de manera integral y están diseñados siguiendo estos pasos.

Conoce a tu profesor(a)

Teacher Profile Image

Programming Made Easy

Software Developer

Profesor(a)

Habilidades relacionadas

Diseño Más de diseño Escenografía
Level: All Levels

Valoración de la clase

¿Se cumplieron las expectativas?
    ¡Superadas!
  • 0%
  • 0%
  • Un poco
  • 0%
  • No realmente
  • 0%

¿Por qué unirse a Skillshare?

Mira las galardonadas Skillshare Originals

Cada clase tiene lecciones cortas y proyectos prácticos

Tu membresía apoya a los profesores de Skillshare

Aprende desde cualquier lugar

Ve clases sobre la marcha con la aplicación de Skillshare. Progresa en línea o descarga las clases para verlas en el avión, el metro o donde sea que aprendas mejor.

Transcripciones

1. ¡Bienvenido a esta clase!: Hola chicos y bienvenidos a este curso de preparación para la entrevista de diseño de sistemas. Mi nombre es Alex y soy ingeniero de software, la prueba que se está tomando y también dando entrevistas de System Design durante mi tiempo en empresas de software. Cuando me enteré de la posibilidad de crear un curso para explicar más sobre estas complejas entrevistas tipo II estaba bastante ansioso por desarrollar una. Esta clase se estructurará en cuatro lecciones que contienen pasos prácticos para que usted tome con el fin de entender exactamente lo que los entrevistadores esperarán con interés a la hora de programar estos tipos de entrevista que primero evolucionarás, presentarte qué es el diseño del sistema. Y luego veremos la plantilla que funciona a la hora resolver cualquier pregunta de entrevista de diseño de sistema. Después de esto, también resolveremos dos de las preguntas de entrevista más comunes desde este campo, diseñando una nueva URL, servicio de acortamiento, y el sistema de intercambio de fotos. Si estás interesado en perfeccionar tus habilidades de entrevista de ingeniero de software, considera este curso para ti. No hay otros requisitos entonces una conexión a Internet S para el proyecto de esta clase, será extremadamente práctico y te implicará seguir los pasos presentados en la plantilla del curso. Para que puedas comenzar en tu viaje de resolver preguntas de entrevista de diseño de sistemas. Pensamos lo dicho, creo que estamos listos. Nos vemos en la primera lección. 2. ¿Qué es el diseño de sistemas?: Hola chicos y bienvenidos de nuevo al sistema. ¿ Le contaste tutorial entrevistado. En esta conferencia vamos a discutir qué es exactamente el diseño de sistemas, lo que se supone que es una entrevista de diseño de sistemas. También vamos a echar un vistazo a algunas buenas prácticas generales cuando se trata de su propia entrevista de diseño de sistemas. Es posible que los esté ejecutando en posición donde está tratando conseguir un trabajo para una empresa de ingeniería de software. Y escuchaste a los dos, voy a tener una entrevista de diseño de sistemas junto con las entrevistas más orientadas a técnicas donde realmente se supone que debes cubrir. Bueno en general, en las entrevistas de diseño de sistemas, realmente no se te permite pelar. Quizás solo un poquito para probar tus puntos en algunas partes. Ahora, comenzar con la definición de qué exactamente el sistema diseñó facilidad. Es sólo el proceso de definición de diferentes módulos, interfaces, componentes, y también los datos para que un sistema cumpla requisitos especificados que podrían especificarse en su pregunta que obtenga un más nuevo en entrevista. Ahora, el proceso de desarrollo de sistemas es en realidad el proceso que vas a estar haciendo en tu trabajo. Si aterrizas la posición de desarrollador, donde realmente vas a crear o alterar el sistema. Junto con los procesos, modelos, metodologías, y también prácticas que se utilizan para desarrollarlos. Pero por ahora, el diseño del sistema es solo el proceso de definición de los componentes. Por lo que básicamente se trata de hablar de lo que se necesitaría al intentar pensar en desarrollar un proyecto desde cero. Llegar a la entrevista aparte esta entrevista de diseño de sistema que de nuevo, podría haber realizado con el único propósito de permitir los candidatos que lo están tomando. Como tal vez programadores, pero también pueden ser ingenieros o diseñadores. La oportunidad de demostrar su pericia en el campo al que están solicitando. El uso tangible del conocimiento en solución de un problema real que la empresa podría estar enfrentando. Entonces estos son de nuevo, problemas muy grandes y generales también. Por lo que se te va a pedir que implemente algo así como un chat de WhatsApp o algo así. Vamos a tener también ejemplos concretos más adelante en este curso. Pero de nuevo, son grandes problemas y hay que hablar de ellos y pensar en cómo los implementaría de manera óptima tanto desde el punto de vista de la complejidad del tiempo como del espacio. Ahora, esta entrevista de diseño de sistemas también se realiza posteriormente en el proceso de entrevista. En primer lugar, es posible que esté obteniendo una entrevista técnica donde realmente se le pide que codifique un problema real. Y luego más tarde en el proceso de entrevista, justo para DC, tienes conocimiento previo de algunos temas y también puedes ver las cosas desde una perspectiva más grande. También te van a dar la entrevista de diseño de sistemas. Ahora, este juicio pretendía que sea ver qué tan bien se trabaja en un equipo. Y también eres acercamiento a una solución de problemas usando preguntas que son, como mencioné anteriormente, de composición abierta. Y solo necesitas llegar a la mejor solución posible. Se supone que esta entrevista analiza tu procesamiento, resolviendo los problemas, tu proceso de pensamiento en la creación y también el diseño de los sistemas para ayudar a eventuales clientes que firma quieres entrar necesidades. También es una oportunidad para que muestres al personal contratante, ya sea al gerente u otros desarrolladores con los que te estás tomando esta entrevista. Los dos son valiosos el miembro, al mostrar sus habilidades de esta manera. Cuando se trata de entrevistar preguntas y respuestas en el diseño de sistemas, suelen ser muy ambiguas. Y esto es sólo para permitir la oportunidad de demostrar sus calificaciones. Pero no es necesario apresurarse a dar una respuesta que pueda estar equivocada o ni siquiera equivocada, pero no lo suficientemente documentada. También se reúne para hacer preguntas antes responder a su pregunta sólo con el fin de reducir el alcance. Dale una dirección para aclarar también las explicaciones. Esto fue sobre ello para una presentación general de una entrevista de diseño de sistemas. En la siguiente conferencia, vamos a discutir un poco cómo podemos abordar cada pregunta de entrevista de diseño de sistemas. Hay un proceso de cuatro pasos que se ha documentado para estar funcionando, dando vueltas para echar un vistazo a eso también. Pero por ahora muchas gracias por seguir conmigo hasta el final de esta conferencia. Y espero veros chicos en la siguiente. 3. Una plantilla para cualquier pregunta: Hola chicos y bienvenidos de nuevo al tutorial de entrevista de diseño del sistema. En esta conferencia, vamos a echar un vistazo a unos pasos que podríamos utilizar en una plantilla cuando se nos da pregunta de diseño de sistema en una entrevista. Este temporal el tiempo a punto de hablar es de una talla única se adapta a todo tipo de plantilla cuando se trata de preguntas de entrevista de diseño de sistema, solo hay unos pasos que necesitas para asegurarte de que se obtiene a través al responder a la pregunta de la entrevista de diseño del sistema. Así que al empezar con esta plantilla, lo primero que hay que compartir al ser hecho la pregunta es que la comprendas plenamente. Por lo que necesitamos entender este problema. Necesitan que resuelvas y establezcas el alcance del diseño del que vas a hablar. Esta es la parte donde necesitas hacer preguntas justo después de t te dio los detalles completos sobre las preguntas. Y también necesitarás establecer cualquier limitación que pueda aparecer. No es necesario apresurarse a tratar de resolver el problema antes de tener todos los hechos y tener otras cosas que podrían no estar claras para usted despejadas por el entrevistador. El siguiente paso sería proponer un diseño de alto nivel. Digo dicho, no es necesario saltar a la implementación sin confirmarlo. El enfoque en el que estás pensando en realidad está satisfaciendo todas las limitaciones que quieren. Por lo que podría proponer un enfoque que considere que es el mejor para resolver el problema de diseño del sistema. Ve cómo reaccionan a tu enfoque antes de saltar a implementar realmente donde incluso ir más allá en detalles en cada parte de tu propuesta. Ahora la tercera parte en realidad se hace más tiempo que consume el modo, que es el diseño Deep Dive. Esto sucede una vez que validó con su entrevistador que está en el camino correcto, ya sabe esto, en este punto, sólo tiene que entrar en todos los detalles de la aplicación resolviendo que se te ocurrió. Y esta es la parte donde se necesita tener una comprensión profunda y vocabulario del diseño de sistemas. Y en este diseño de inmersión profunda, hay muchos pasos de nuevo, y comenzando a profundizar. La primera pregunta que debes hacer son los requisitos. Y los requisitos podrían ser funcionales o no funcionales. Los requisitos funcionales son solo funcionalidades que el problema que estás resolviendo está brindando a los usuarios. Entonces por ejemplo, en tus redes sociales, hay una funcionalidad que te puede gustar un post de cualquier otro usuario. Ese es un requisito que es funcional. Es necesario establecer y ejecutar a través todos los requisitos funcionales con sus entrevistadores por curso, enumerarlos y validar su importancia. Ahora, los requisitos también pueden ser no funcionales, y aquí podrían haber algunas cosas como la latencia, que es el tiempo de respuesta de la interacción del usuario. Fiabilidad, lo que significa que no habrá pérdida de datos. La consistencia, lo que significa que alta disponibilidad. Ahora dos cosas que también debes tener en cuenta al intentar diseñar tus componentes. Necesitas hacerlos. En primer lugar, tolerante a fallas, lo que significa que su sistema está en funcionamiento en todo momento, pesar de que podría haber algunos errores o algún rasguño de base de datos. Y también necesitan ser enfermedad escalable. Otro hecho importante, escalable solo significa que necesitas manejar la creciente cantidad de tráfico en tu sistema. Ir. Además, a la segunda parte de este diseño Deep Dive. Aparte de requisitos, también necesitas hacer una estimación de almacenamiento basada en la modalidad de datos, solo necesitas dar una estimación aproximada de la cantidad de datos que se deben almacenar. Además, es necesario pensar en el número de solicitudes, el servicio que presta y la relación de lectura-escritura. Después de que hablaste de todas estas estimaciones de almacenamiento, debes pensar en un diseño de base de datos. Aquí, se están llevando a cabo las acciones que usted es usuario puede realizar para interactuar con su sistema. También puedes pensar aquí qué tipo de base de datos utilizarás y también por qué puedes ir por SQL, NoSQL, y así sucesivamente. Solo necesitas discutir sobre cada opción y pensar en cuál se ajusta mejor a tu solución. Entonces un cuarto paso sería iniciar un diseño básico de alto nivel, donde se pueda escribir sobre los clientes, los servidores, y también la base de datos. Y a partir de ese diseño básico, además se puede entrar en algunos detalles más y aislar los servicios, particionar los datos hablados sobre el almacenamiento en caché y también la replicación de los servicios y bases de datos, incluso equilibrio de carga y colas de mensajes. Si eso se ajusta a tu problema específico. Por supuesto hay opcionales en qué otras cosas que puedes pensar dependiendo exactamente del problema que te den, que puede ser el cifrado de algunos mensajes o contraseñas. Alguna telemetría que se asegura de realizar un seguimiento de las cosas que más se acostumbran en su aplicación. Algunos API gateway service discovery y también d servicio de analítica que analiza las solicitudes y la beta de usuario. Y después de este diseño deep dive, el último paso, hay que dar esto para simplemente envolver, lo que significa que con el diseño dado para, para construir. Si parece sensato, se puede pensar en identificar algunos cuellos de botella y áreas de mejora y hablar un poco sobre esos. Esta es la estructura general que debes tener en cuenta antes iniciar tu entrevista de diseño de sistemas sin siquiera que se le dé el problema. En algunas conferencias futuras, vamos a echar un vistazo a preguntas específicas de la entrevista de diseño del sistema como diseñar el pequeño sistema de URL, motores de búsqueda, unidades compartidas, y así sucesivamente celular que puede ver cómo aplico todos estos pasos desde esta plantilla exacta, mi enfoque a la hora de resolver problemas de DC. Si eso te suena interesante, espero verte en las próximas conferencias. Muchas gracias por quedarse conmigo hasta el final de éste. 4. El servicio de acortado de URL: Hola chicos y bienvenidos de nuevo al tutorial de entrevista de diseño del sistema. En esta conferencia, vamos a discutir famoso problema que a menudo se da en este tipo de entrevistas. Y más específicamente, el diseño de un nuevo servicio de acortamiento de URL. Al igual que por ejemplo, es posible que haya visto diminuta URL punto L y así sucesivamente. En esta conferencia, voy a repasar todos los aspectos que debes considerar cuando S lleva este tema en una entrevista de diseño de sistemas. Y después de ver esta conferencia, vas a saber cómo as esta pregunta. Pero no solo eso, también sabrías cómo puedes abordar estudios de problemas similares. Porque al resolver este problema, también vamos a respetar la plantilla que debemos usar en cualquier pregunta de diseño de entrevista de sistema que se nos dé. Comenzando con este problema de entrevista, necesitamos diseñar, como dije, un servicio de acortamiento de URL, como diminuta URL. Y esta superficie proporcionará, por supuesto, lisis corta, roja dirigiendo URL demasiado largas. Ahora, la dificultad de la entrevista de diseño de sistemas es bastante básica y suele ser la más dada en la entrevista de diseño de sistemas. Por lo que es muy importante que sepas resolver este problema. Lo primero que tenemos que discutir es ¿por qué necesitamos acortar la URL? Aquí hay múltiples razones y por qué necesitaríamos eso. En primer lugar, ahorran mucho espacio cuando se muestran, predicen el mensaje, y así sucesivamente. Y además si quieres escribirlos desde tu propio teclado, eres menos propenso a cometer errores al escribirlos. También se utiliza para optimizar los enlaces a través dispositivos y medir el rendimiento en los anuncios. Lo segundo que debemos abordar son los requisitos y los objetivos de nuestro sistema que necesitamos diseñar. Cuando se le da esta pregunta, les recuerdo aquí que cuando se encuentra en una pregunta de entrevista de diseño de sistema, así como otros tipos de entrevistas. Y se te está dando pregunta. Es necesario aclarar todos los requisitos al principio. Antes de tratar de responder a tu problema. Es necesario hacer llamado la pregunta para encontrar el alcance exacto del sistema que usted es entrevistador tiene en mente, yendo a las funcionalidades que esta pequeña superficie URL debe proporcionar a los usuarios finales de deber. Los tenemos divididos en las dos principales categorías de requisitos, que son funcionales y no funcionales. Al pensar en los requisitos funcionales, podemos pensar en dar una URL a nuestro servicio y poder generar de nuevo un más corto y único. Y a esto se le llama el eslabón corto. Este enlace que nuestro servicio brinda también debe ser lo suficientemente corto como para ser fácilmente copiado y pegado. Y vamos a discutir más adelante qué significa lo suficientemente corto y también acordamos ese término. Ahora el segundo requisito funcional puede ser que el usuario pueda escoger una costumbre en breve para sus URL. Entonces si no quieren uno generado aleatoriamente por nuestra superficie, también deberían poder escoger uno propio. Estos eslabones que nuestra superficie proporciona también deben tener un intervalo de tiempo después de la muerte. Deberían eliminarse y también caducar. Porque de lo contrario nuestra base de datos se desbordaría en algún momento si siguieras teniendo estos enlaces en ella. Por último, el acceso de los usuarios a un enlace corto debe por supuesto leer dirigido al enlace original que representa el enlace corto. También hay algunos requisitos no funcionales para el servicio de acortamiento de URL, que sería que la dirección roja debería ocurrir en tiempo real sin latencia alguna. Porque imagina que querrías hacer clic un poco punto L-Y link y tardará una eternidad en cargarse. Eras enlace real al que quieres acceder que no sería bueno en absoluto. Y también molesto. También otro requisito no funcional sería que el enlace abreviado que se proporciona no debe ser conjeturable o predecible en absoluto por un eventual usuario malicioso. Los últimos y más importantes requisitos no funcionales. Sería que nuestro sistema, nuestro servicio debería estar altamente disponible. Porque si fuera abajo, toda la redirección URL es que realizaría sería por supuesto, abajo con ella. Algunos requisitos adicionales aquí no pueden ser que nuestro servicio deba ser accesible para las API. Por lo que los terceros pueden hacer solicitud real a nuestros puntos finales y obtener en URL acortada unasolicitud real a nuestros puntos finales y obtener en URL acortadade nuevo como respuesta si la solicitud está bien. También algunas analíticas que podremos hacer con ese limonero. Y deben preocuparse cuantas veces ocurrió la Resurrección y también Cuanto más a menudo donde la dirección se enlaza, acceso y cosas por el estilo. Después de discutir todos estos requisitos y costos del sistema, podemos pasar a la tercera, que es la estimación de la capacidad que debe tener el servicio y también la restricción para vencer. Entonces cuando pensamos el servicio que vamos a implementar, por supuesto se leerá pesado. Eso se debe a que estarán disponibles muchas solicitudes de dirección roja en comparación con el nuevo acortamiento de URL. Y podemos asumir aproximadamente 90 a una relación entre leer y escribir. Porque si lo piensas, solo generas el enlace una vez, pero por supuesto sería leído mucho más de una vez. Ahora las estimaciones de tráfico para el servicio, podemos suponer que vamos a tener por encima 100 o 500 millones de nuevos acortamiento de URL por mes que se crean. Por lo que 500 millones de URLS siendo tal vez el servicio de torre. Con nuestro por ciento de readwrite, podemos esperar cerca de 50 mil millones de erecciones rojas durante este mes. También podemos pensar en consultas por segundo para nuestro sistema solo con el fin de que nuestra base de datos vea de estrellarse. Pero aparte de eso, también tenemos que mirar las estimaciones de almacenamiento. Aquí podemos volver a hacer estimación. Suponga que almacenamos todas las solicitudes de acortamiento de URL durante cinco años. Ya que tenemos 500 millones de nuevas URLs y objetos B y D que esperamos almacenar van a ser de unos 30 mil millones. Y asumiendo que tardaron unos 400 a 500 bytes cada uno, vamos a necesitar aproximadamente 15 terabytes para almacenar todos nuestros datos. También tenemos que pensar en las estimaciones de ancho de banda, no solo en la estimación de almacenamiento para la derecha, podemos esperar alrededor de 200 a 300 nuevas URL cada segundo. Y eso es por supuesto un top. Vamos a mirar lo más alto de esta gama. Por lo que el total de datos entrantes para nuestro servicio serían unos 500 bytes por solicitud veces dos o 300 nuevas URL y B segundo, lo que alrededor de 100 a 200 kilobytes por segundo. Una solicitud de lectura. Ya que cada segundo esperamos alrededor de 20 a 30 mil URL ya dirige el total de datos salientes va a ser de unos diez megabytes por segundo. También podemos mirar alguna estimación de memoria. ¿ Y si queremos atrapar algunas de nuestras URL cortas más utilizadas que son muy SH dijo x Bueno, podemos mirar un poco a la regla 8020. Es decir que el 20% de nuestras URLs van a generar el 80% del tráfico. Por lo que el 20% de nuestras URL cortas generadas van a ser las calientes. Y al corto vistazo, podemos ver que si tenemos 20 a 30 mil solicitudes por segundo, vamos a conseguir alrededor de 1.7 a 8 mil millones de solicitudes por día. Para atrapar el 20% de estos, vamos a necesitar aproximadamente 170 gigabytes de memoria. Como han visto en mi enfoque, la parte de la estimación de la capacidad y las limitaciones necesitan ser muy sencillas al pensar en el límite y estimar cuánta capacidad real y ancho de banda va a ser tomado por superficie implementada. Dije que también podemos mirar algunas APIs y discutir esta parte. Podemos poner a disposición algunos endpoints que nuestro servicio va a brindar para terceros que querían acceder a nuestro servicio display, hacer solicitudes a nuestros endpoints y volver como un responde la URL acortada. Entonces, por ejemplo, podemos tener un punto final que oriente llamó crear la URL. Y puede tomar la URL original como parámetro de cadena, que es por supuesto la URL original que desea haber acortado. Y también algún tipo de clave que se asocia con la clave de desarrollador API de una cuenta. Entonces sabemos quién está haciendo estas solicitudes y tenemos algún tipo de seguridad en estas partes. Como dije antes, este punto final, por supuesto devolveríamos la inserción exitosa. Por supuesto devolvería una cadena con la URL acortada si se realiza la solicitud. Bueno, y si no, tal vez un código de error, también podemos tener un endpoint de URL de eliminación. Lo que eso es importante, también puedes mencionarlo en cualquier cosa. También tenemos que pensar en cómo prevenir el abuso aquí. Si exponemos una API porque un usuario malicioso podría sacarte del negocio y destruir tus servicios si ponen alguna URL olive t es el diseño actual y llenar tu base de datos. Podemos imponer aquí algún límite a la clave de desarrollador API. Se puede limitar a un cierto número de creaciones de URL que dicen diez o 20 días o algo así. Ahora el siguiente paso sería pensar en el diseño y esquema de la base de datos. Definir el esquema en las primeras etapas de la entrevista realmente te ayudaría a entender el flujo entre los componentes, te guiaría hacia la posterior partición de los datos. Ahora algunas observaciones aquí serían que necesitamos almacenar para los servicios miles de millones de registros. Vamos a tener mucha URL acortada. Pero estos objetos van a ser muy pequeños, como ya he dicho, 500 kilobytes. No hay relaciones entre los registros. Por lo que aparte de almacenar qué usuarios crearon esa URL, eres más o menos libre de hacer lo que queramos aquí. Y otra observación respecto al diseño de la base de datos y relevante aquí es que nuestro servicio va a ser muy pesado en la parte roja. Vamos a necesitar, como dije, dos tablas, una para almacenar la información sobre las asignaciones de URL, y una para los datos del usuario, quien creó el enlace corto. Ya que anticipamos almacenar muchas filas. Y tampoco necesitamos mantener ninguna relación entre objetos. Ahora SQL tipo de elección sería muy buena aquí ya que también es muy fácil de escalar. Para que podamos mirar algo así como Dynamo DB. Vine aquí mientras usted resuelve, necesitamos crear el esquema de base de datos en una entrevista y también pensar qué tipo de base de datos se debe utilizar y además sugerir uno desde su propio conocimiento. El sexto paso aquí va a ser el diseño y algoritmo básico del sistema. Por lo que aquí vamos a entrar en realidad en la implementación de cómo va a funcionar nuestro servicio detrás de escena. El problema que estamos resolviendo aquí es generar la clave única acortada que se va a mapear a una URL SIC mayor y más grande dada. Esta situación, tenemos dos enfoques. Podemos generar estas claves de línea con un servicio de generación clave. Y va a generar seis cadenas aleatorias de letras antemano y almacenarlas en nueva base de datos. Siempre que queramos acortar aquí la URL, podemos tomar una que ya se genera por la superficie y años ella. Este enfoque es muy sencillo y rápido, pero porque no estamos codificando la URL, por lo que no necesitamos preocuparnos por la duplicación o las colusiones. El servicio de la generación clave va a asegurarse de que todas las claves van a ser únicas. También tenemos que tener en cuenta algunos problemas de concurrencia aquí, pues en cuanto se utilice una clave, se debe marcar en nuestra base de datos para asegurarnos de que vea que no se va a utilizar de nuevo. Y si hay múltiples servidores que están leyendo estas claves al mismo tiempo, podría obtener un escenario en el que dos o más servicio intentaron leer desde la base de datos, aunque de arriba al servicio puntos finales, sería muy menos probable. Ahora los servidores pueden utilizar estos sistemas de generación para leer y marquesinas en una base de datos. Y pueden usar dos mesas para almacenar las llaves. Una para las claves reales que aún no se utilizan, y otra para las claves que ya se utilizan. Y tan pronto como este servicio de generación le dará la clave a uno de los servidores, comerlos y moverlos a la mesa. Tenemos que pensar también aquí, si nuestro sistema de generación, siendo el sistema único de todo nuestro servicio, ¿no sería malo si moriría? Y ese es un punto muy bueno porque necesitamos tener una réplica en espera, este sistema de generación con el fin de tener un servidor de espera que pueda hacerse cargo para generarlas proporcionar fácil en caso de que algo le pasa a uno primario. Ahora, otro acercamiento aquí, otra degeneración muerta de las llaves con el servicio. También es codificar la codificación URL real. puede hacer una URL real calculando un hash único. O si estamos hablando del tiro 250 asientos o de los cinco vacíos, y podemos hash la URL dada con estos algoritmos, estos hashes se pueden codificar para su visualización. Y una pregunta razonable en este enfoque sería, ¿cuál sería el tamaño de la clave taquigráfica? Pueden ser de seis hasta 20 caracteres pares, pero eso sería una llave bastante larga. Podemos usar codificación base 64. Y si vamos a utilizar seis teclas largas de letra, entonces va a llevar alrededor de 64 a la potencia de seis posibles cuerdas. Si generáramos ocho letras llaves largas, vamos a tener cerca de 280 billones de posibles cadenas. Pero para nuestro sistema, el número de letra sería bastante alto. Y podemos suponer que seis letras pueden bastar para nuestro número de URLs. Ahora si usamos el algoritmo MD5 como nuestra función hash, por supuesto proporcionará, como ya sabrás, valores hash de 128 bits. Después de la codificación base-64, obtendremos cadena que tiene más de 21 caracteres. Ahora sólo tenemos espacio para seis u ocho caracteres por tecla corta. ¿ Cómo elegiremos entonces nuestra llave? Bueno, podemos tomar las primeras letras, pero esto puede resultar en duplicación de claves. Y para resolver eso, podemos optar por poner algunos otros personajes fuera de la codificación o intercambiar entre ellos para evitar este problema por completo. También podemos, después de dar la solución en una entrevista, pensar en algunos temas con nuestra solución, es que puede resultar no ser a prueba de balas y estos diferentes temas vienen de ti y no del entrevistador. Probablemente vas a conseguir puntos extra a medida que resulta ser un empleado eventual más consciente. Los diferentes tejidos con la codificación de una URL real usando un hashtag. La solución única puede ser que si varios usuarios ingresan la misma URL, pueden obtener la misma URL acortada. El problema de concurrencia es que fue el caso B, el último enfoque también. Pero aquí hay otro. ¿ Qué pasa si partes de la URL, URL codificadas? Las soluciones aquí nuevamente, la incorporación de un número de secuencia creciente a cada URL de entrada para que sea único y generar su hash. Y otra solución podría ser anexar el ID de usuario, que debería ser único a la URL de entrada. Si el usuario no ha iniciado sesión aquí, podría ser un problema porque necesitaríamos eso para confirmar la singularidad de la clave. Incluso si después de todos estos pasos que dimos para estar seguros de que nada crezca podría pasar, todavía tenemos un conflicto. Podemos seguir generando la clave hasta que consigamos la única. Envolviendo el diseño básico del sistema una parte de algoritmo. La segunda parte aquí sería la partición de datos y replicación de nuestro servicio. Para escalar nuestra base de datos, necesitamos particionarla para que pueda almacenar más información. Necesitamos alrededor de miles de millones de entradas en nuestra base de datos. Y aquí podemos echar un vistazo a los dos tipos de particionamiento que hay, que son la llave basada y la partición basada en hash. Comenzando con el rango basado particionamiento fines de semana URL del portal en particiones separadas basadas en las claves hash, caracteres, o incluso uno de ellos. Entonces podemos guardar todas las URLs empezando por ejemplo, trigo o letra a en una partición, y guardando las que empiezan con la letra B en otra, y así sucesivamente. Y mirando en contraste el particionamiento basado en hash-basado en este esquema, podemos tomar el hash del objeto que estamos almacenando y luego calcular en base a aquella que partición usar. En nuestro caso, podemos tomar el hash de la clave o el acortamiento para determinar la partición que vamos a iniciar esa URL específica. Lo siguiente que debemos pensar al acercarnos al problema de diseño del sistema es la parte de efectivo. Por lo que podemos coger URLs a las que se accede con frecuencia como ya sugerimos anteriormente. Y podemos usar cualquiera de la solución de estantería que existe por ahí por memcached por ejemplo. Pero también podemos almacenar URLs completas. Y al hacer eso almacenar la URL completa dulces sus respectivos hashes en su dedicación surfista. En este enfoque, antes de que puedas pensar, el almacenamiento back-end puede comprobar rápidamente si la caché ya tiene la URL de diseño. Y de esta manera un servicio más óptimo. También tenemos que pensar aquí en cuánta memoria caché deberíamos tener. Para que podamos empezar. Alrededor del 20% del tráfico diario y en base a los patrones de uso del cliente, ajustar además, cuántos casos servidores necesitamos. Según lo estimado anteriormente, necesitamos unos 170 gigabytes de memoria para cobrar el 20% del tráfico. Dado que un servicio moderno puede tener 256 gigabytes de memoria, puede caber fácilmente todo el efectivo en una sola máquina. Esto fue por ello con la parte de almacenamiento en caché. También podemos pensar en el equilibrador de carga en nuestro sistema, que es bastante sencillo. Podemos pensar en agregar estas capas de equilibrio de carga en tres lugares. Y esos serían entre clientes y los servidores de aplicaciones, y también entre servidores de aplicaciones y servidores de bases de datos y servidores de caché. Pasando a la cosa de la danza en la que tenemos que pensar cuando se dan estos sistemas diseño entrevista pregunta nosdan estos sistemas diseño entrevista preguntaes la purga o la limpieza de la base de datos. El ingreso, por supuesto, no debe quedarse para siempre en nuestra base de datos ya que la llenaría y se desbordaría causando un accidente. Época. ¿ Se alcanza un tiempo de caducidad especificado? ¿ Qué debe pasar con el enlace? Bueno, si decidimos buscar continuamente experimentos para eliminarlos, también pondría mucha presión en nuestra base de datos. Entonces en cambio podemos eliminar lentamente los enlaces vencidos haciendo una limpieza perezosa. Y la forma en que nuestro servicio se asegurará que solo los enlaces caducados serán eliminados con B por cada vez que el usuario intente acceder al enlace inspirado, eliminamos haciéndolos el código de entrada al usuario. De esta manera no eliminar todas las URL expiraron a la vez y arriesgando un bloqueo de la base de datos. También podemos tener un tiempo de caducidad predeterminado para cada enlace en lo que va este aspecto. Por último, también hay que tener en cuenta que el árbol de límites, que debe responder a algunas preguntas ya que cuántas veces es URL corta se ha utilizado. ¿ Cuál fue la ubicación del usuario? ¿ Cuál sería la fecha y hora de acceso y así sucesivamente. Parte de seguridad y permisos, que es otra importante. Podemos almacenar el nivel de permisos con cada URL en la base de datos siendo pública o privada. Para los privados, también podemos crear una tabla separada para almacenar los ID de usuario que tengan permisos para ver esa URL específica. Por supuesto, si no tiene ese permiso, nuestro punto final o x está en la URL corta, puede devolver un HTTP para un código uno, significa que no hay suficiente eje. Por supuesto. Esto fue sobre todo los ángulos que hay que tener en cuenta al acercarse a una solución a la pregunta de superficie URL de acortamiento en una revisión del diseño del sistema. Espero que ustedes realmente hayan sacado algo de esta conferencia. Y muchas gracias por quedarse conmigo hasta el final de la misma. También espero veros chicos en la siguiente. 5. La aplicación de compartir fotos: Hola chicos y bienvenidos de nuevo al tutorial de entrevista de diseño del sistema donde entendemos cómo podemos pasar una entrevista que se compone de preguntas de C3b firmar. En esta conferencia, vamos a discutir otro problema muy común que se da este tipo de entrevistas y echar un vistazo a exactamente cómo podemos resolverlas para pasar, como ya he dicho, la entrevista. El problema que no vamos a ver en esta conferencia es diseñar un servicio de intercambio de fotos. Aquí los usuarios pueden subir fotos para compartirlas con otros usuarios. Y por supuesto, algunos servicios similares pueden ser Flickr o algunas plataformas de redes sociales, aunque tengan más funcionalidades integradas dentro de ellas. En primer lugar, a la hora de abordar este problema, voy a utilizar la plantilla general que se ajusta para cualquier pregunta de diseño de sistema que se pueda dar en una entrevista de la que hablé en una conferencia previa. Y el primer paso después de entender a fondo la pregunta y hacer cualquier otra aplicación de consulta que pueda tener de su entrevistador es definir los requisitos y los objetivos de el sistema del que vas a hablar. Al diseñar nuestra aplicación para compartir fotos, nos gustaría tener algunos requisitos funcionales que incluyen que un usuario pueda seguir algunos otros usuarios que tienen una cuenta en esta plataforma. El usuario también puede realizar algunas búsquedas que pueden basarse en las fotos que se comparten. ¿ Ha buscado también puede subir fotos ellos mismos desde su cuenta. Y el sistema que vamos a implementar también debe generar y mostrar algún tipo de feed de noticias donde un usuario, cuando abra la aplicación, verá las mejores fotos de la gente que luchó arcos. Estos son, como dije, los requisitos funcionales, pero también hay que pensar en los funcionales. El requisito no funcional número uno tiene que ser que el sistema sea muy confiable, lo que significa que una vez que el usuario sube una foto en nuestra superficie, la foto no se perderá. A continuación, nuestra superficie necesita estar altamente disponible, por lo que cualquier duda no está permitida. Además, debemos mantener nuestra latencia baja para la regeneración de noticias y cosas así. Significa la cantidad de tiempo que el usuario realmente esperará desde el inicio de la aplicación hasta el punto en que realmente verá algunas fotos de otros usuarios que sigue. Por lo que ahora se hace el primer paso. Y definimos los requisitos y los objetivos del sistema que estamos a punto de diseñar. Podemos hacer algunas otras consideraciones de diseño. Aquí. Podemos empezar por el hecho de que todos estos servicios que vamos a implementar, es bastante obvio que será muy leído pesado porque la deuda neta cuando los usuarios realmente subirán fotos, pero un número mucho mayor de usuarios en realidad verá las fotos que vi otros usuarios. Puedes pensar esto, como pensarías al publicar una fotografía en tu aplicación de redes sociales. Publica muy pocas veces, pero en realidad ves muchas otras características en comparación para ver que realmente subes. Entonces por eso este sistema se leerá pesado. el hecho de que nuestro servicio se leerá pesado, necesitamos enfocarnos en recuperar. La foto es muy rápida. Ahora, los usuarios pueden subir tantas fotos como la luz del día también. Entonces eso es algo a tener en cuenta porque necesitamos una gestión muy eficiente del almacenamiento para estas fotos. Y además, guardo dicho, si un usuario sube una foto, este sistema que diseñamos, garantizamos que no se perderá. Pasando ido a alguna estimación y limitaciones para la capacidad de las cosas que vamos a almacenar. Podemos suponer que vamos a tener 100 millones de usuarios con cerca de 10 mil usuarios activos diarios y 2 millones de fotos nuevas cada día. Eso serían alrededor de 23 fotos nuevas cada segundo. Y estos cálculos que vamos a hacer aquí con se llevan a cabo en una fecha más donde nuestro servicio será altamente adoptado y exitoso. Entonces por eso me ves romper estas cantidades muy altas para estas. Un números reales. Ahora, el espacio total requerido para un día de fotos, como dije, sería de unos 2 millones porque dijimos que tendríamos 2 millones de fotos nuevas cada día. Y podemos pensar en el tamaño promedio del archivo fotográfico, que puede ser de 100 kilobytes, que va a ser unos 200 gigabytes en total para nuestra capacidad. Ahora eso es sólo tomar en cuenta un día. Pero, ¿y si señalamos el espacio, digamos, cinco años? Bueno, podemos multiplicar 200 por 3655 años, y vamos a conseguir unos 365, por lo que 365 terabytes. Ahora que tenemos esta estimación de capacidad fuera del camino, podemos pensar en el diseño del sistema de alto nivel. Porque a un nivel alto solo necesitamos apoyar dos escenarios. Uno para subir las fotos, que es flujo de trabajo en nuestro servicio. Y sí, querían ver o buscar estas fotos. El servicio que vamos a implementar, por supuesto, necesita almacenar las fotos en alguna base de datos. Y vamos a necesitar algunos servidores de almacenamiento de objetos aquí. Además, al esquema de base de datos para almacenar estas fotos, también va a ser discutido en la entrevista. Tenemos que tener en cuenta que sí tenemos cerca de tres entidades. Uno que va a ser el usuario, a continuación, las fotos, y luego los usuarios que sigan. El esquema puede contener tres tablas. Cuando una foto, que puede tener una identificación con foto, que va a ser la clave principal. Y luego algunos otros campos como el ID de usuario, que es por supuesto que el usuario muerto lo publicó, que va a ser una clave foránea en esta tabla. Entonces un otro campo muy importante aquí va a ser fecha de creación, que va a ser de tipo datetime. Y este es un campo muy importante porque va a ser útil cuando el usuario abra su feed de noticias, queríamos conseguirle las fotos más recientes y más populares, pero para la última parte vamos a comer esa región golpeó campo. Entonces también tenemos la tabla de usuarios, que por supuesto tendrá una clave principal de User ID. Y luego algunos otros datos que queríamos almacenar para él. Si queremos hacer marketing por correo electrónico puede conservar su correo electrónico. Pero también necesitamos el nombre, la fecha de nacimiento, la fecha de cada cuenta, y tal vez el último inicio de sesión. Estoy pensando. También necesitaríamos una tabla para el seguimiento del usuario, que tomaría campo que ambos formarán parte de la clave primaria. Y eso será, por supuesto, identificadores de usuario de los usuarios que se siguen unos a otros. lo que esto por supuesto toma en cuenta en el escenario donde el usuario de seguimiento cada uno va en ambos sentidos, como en Facebook cuando se agrega un amigo. Entonces si te aceptaras a los dos como amigo, no como un Instagram donde el seguimiento puede ser unidireccional. Para que puedas seguir a alguien que no te seguiría. No tenemos ese escenario en esta discusión sólo para que podamos hacerlo un poco más sencillo. Ahora el enfoque sencillo para asaltar los detectores de esquema hablan sería un MySQL requerir obviamente las articulaciones, pero podemos almacenarlo en una tienda de valor clave distribuida para disfrutar de la beneficios que ofrece NoSQL también. Después de hablar del esquema de base de datos en nuestra entrevista, también necesitamos tomar otra estimación del tamaño de los datos. Por lo que la D decide estimación sobre el contiene información sobre los campos que se van a almacenar en nuestra base de datos. Y tenemos que pensar en los enteros, cadenas y así sucesivamente. Posteriormente se va a almacenar en nuestra base de datos. Podemos suponer que cada consulta de entrada y la DateTime más allá de cuatro bytes. Por lo que cada fila en la tabla de usuarios será de unos 68 bytes. Si hubiera, como conté antes, alrededor de seis campos. Si tendríamos, digamos, 250 millones de usuarios, vamos a necesitar alrededor de 16 gigabytes de almacenamiento solo para la parte del usuario se pueda almacenar con toda su información en nuestra base de datos. Pero ¿qué pasa con las fotos? Por lo que cada fila en la tabla fotográfica será unos 284 bytes Cs. También tenemos pack de fotos, que va a ser var gráfico hasta 265 caracteres y que lleva 265, mira la entrada fotográfica que sería bastante más larga que la del usuario, pero eso sería bastante normal. Si tomamos en cuenta alrededor de 1 millón de fotos nuevas que se suben todos los días, vamos a necesitar unos 200 y A 50 megabytes de almacenamiento por un día. Y eso va a ser en diez años, alrededor de un terabyte, casi. El último cuadro, cada el usuario sigue tabla. Y si se compone de ocho bytes, sólo teníamos la clave primaria compuesta por dos integrales, que son cada uno cuatro bytes. Podemos pensar en 250 millones de usuarios. Pueden seguir otros 250 millones de usuarios y vamos a cumplir con otro adicional petabytes de almacenamiento para el usuario seguido tabla. El espacio total requerido para todas estas mesas para los oídos, como dije, sería de unos dos terabytes, lo que en realidad es bastante grande para una aplicación. Y la superficie de este tipo. El próximo fin de semana también echó un vistazo rápido al diseño de los componentes que vamos a tener en este servicio. La foto sube o derecha skimpy lento. Lee quiénes van a ser más rápidos, sobre todo si están siendo atendidos desde efectivo. Subir, los usuarios pueden consumir conexiones de deck que están disponibles porque la carga es un proceso lento y eso significa que no se nos puede servir. Cualquiera de los dos sistemas se pone ocupado con todas las solicitudes correctas. Debemos tener en cuenta que estos servicios web tienen una conexión si nos reunimos antes de diseñar el sistema. Entonces si asumes que un servidor web puede tener un máximo de 500 conexiones a n tiempo, entonces puede tener más de 500 subidas concurrentes o lecturas manejadas estos cuello de botella, podemos dividir lecturas y escribe en servicios separados. Esto también nos permitirá en el futuro escalar estas operaciones de forma independiente y mucho más fácil ya que son dos entidades separadas. Para la parte de redundancia ahora, perder archivos es que he mencionado anteriormente, no es una opción. Podemos iniciar múltiples copias de cada archivo como solución a la deuda. Porque si uno de almacenamiento dados, podemos recuperar el cuarto demasiado fuerte, la otra copia. Pero el mismo principio también se aplica a otros componentes. Entonces si queremos tener la disponibilidad del sistema que sería alto vender nuestro sistema no estaría muriendo en ningún momento en el tiempo. También necesitamos tener réplicas del servicio funcionando. Los servicios murieron. El sistema permanece disponible en aterrador ya que esta redundancia elimina el único punto de falla en el sistema. Ese es un punto muy importante. Al tomar cualquier entrevista de diseño de sistema, hay que pensar si está implementando en realidad está haciendo un solo punto de falla La deuda S es una desventaja y hay que observar. Y también necesitas encontrar una solución para ello. Si sólo una instancia de los servicios requeridos para ejecutarlo en cualquier punto, podemos ejecutar una copia secundaria redundante del servicio que no está atendiendo ningún tráfico, pero puede tomar el control después de la fatal para sordos blancos primarios tiene problema. Como ya he dicho, son dos instancias del mismo servicio que se ejecutan en producción y una falla. El sistema puede fallar a la copia sana. Y esto puede suceder de forma automática o requerir intervención manual, aunque si no entras en tu sistema hacia abajo en ningún momento en el tiempo, mejor implementarías y recuperaras automáticamente. Porque de lo contrario, tendría que hacer observar que su sistema es goma de mascar y luego intervenir manualmente con la deuda del desarrollador puede por supuesto por sí mismo redirigir la 17ª 2D disponible. También podemos hablar del sharding de datos. Porque por supuesto creo que cantidades tan altas de datos, necesitamos de alguna manera compartirlos. Podemos trazar en el ID de usuario para que podamos mantener todas las fotos de un usuario en el mismo DB agudo y definido corto es uno terabytes. Necesitarías cuatro gráficos para almacenar unos cuatro terabytes de datos. Ahora, para el rendimiento y escalabilidad fin de semana mantén cerca de diez de ellos. Nuevamente, el sistema FOR crece cada vez más grande, vamos a ser capaces de manejar todo el tráfico de deudas. Vamos a necesitar encontrar el número agudo por usuario múltiplo de diez. Empecemos ahí. Identificar de forma única cualquier foto en nuestro sistema. Podemos anexar este número a la identificación con foto, y esa sería una solución bastante simple al respecto. ¿ Cómo podemos generar los identificadores fotográficos mientras que cada base de datos puede tener su propia secuencia de incremento automático para los identificadores fotográficos. Y como vamos a anexar esta idea de la identificación con foto aguda, hará única en todo nuestro sistema. A pesar de que se nos ocurrió este sistema de particionamiento, tiene algunas inconvenientes. Por ejemplo, si no podemos almacenar todas las imágenes en exceso usando mi gráfico, tenemos que distribuir eso a múltiples ellas y causará mayor enfermedad posterior. Y también los usuarios del corazón necesitan ser manejados de manera bastante diferente porque son seguidos por muchos otros usuarios y mucha gente. Verán su subida las fotos y la deuda puede conseguir causar problemas en ese sentido. Podemos por supuesto, particionar alrededor de la identificación con foto y no el ID de usuario, que puede ser otro enfoque. Porque si generalmente estos ID con foto es primero, podemos encontrar el número agudo a través de nuevo, el módulo de identificación con foto, lo que significa que son menos dígitos básicamente. Y por supuesto, los problemas anteriores de los que acabamos de hablar que fueron los inconvenientes después del primer acercamiento habrían sido resueltos en este punto. Nuevamente, para generar los identificadores fotográficos, no puedes tener una secuencia de auto-incremento porque necesitas saber foto ID es primero definir la solución nítida aquí podría ser dedicar una base de datos separada instancia para generar estos ID de auto-incremento, necesitamos también pensar mucho en el futuro y combinar nuestro crecimiento del sistema. Si tenemos gran cantidad de particiones lógicas para acumular el crecimiento de los datos al principio, múltiples particiones lógicas dentro en una sola base de datos física, base datos CCS, o podemos tener múltiples sistemas de bases de datos que se ejecutan en él. Podemos tener bases de datos separadas para cada partición lógica en cualquier servidor. Siempre que sentimos que un servidor de base de datos en particular tiene muchos datos, podemos crear algunas particiones lógicas a otro servidor, y podemos mantener un archivo de config. Y eso constituiría lo único que tendríamos que actualizar para anunciar un eventual cambio. El ranking y la generación de noticias es otro problema al que nos enfrentamos. La forma en que vamos a lidiar con ello. O al menos una forma en la que podemos lidiar con ello es pregenerar el feed estadounidense. Podemos tener algunos servidores que su única tarea sería generar usuarios para continuamente y almacenarlos en otra tabla llamada feed de noticias de usuario. Cuando el usuario necesite barriga esta foto para nueva suite, simplemente consultaremos esta tabla y devolveremos los resultados. Leslie, también necesitamos pensar el balanceo de efectivo y carga del sistema ya que será muy usado uno, necesitamos introducir un caché para mí a Data Service para coger las filas de la base de datos. Eso significa las carpetas calientes y los usuarios. Podemos usar caso de demanda para caso de estos datos y servidores de aplicaciones Ahí habrá antes de golpear la base de datos puede comprobar rápidamente si el caché tiene las rutas deseadas. Aquí, un enfoque que sería razonable sería la R U, que es la menos utilizada recientemente. Por la política de desalojo de caché. Podemos construir el integrador más inteligente Kiersten, estos usando la regla 8020, que establece que el 280% del volumen de fotos que se van a leer diariamente, generaremos el 80% del tráfico, por lo que sólo podemos cobrar ese primer 20%. Entonces esto fue sobre todos los pasos y datos interminables. Consideraría un impotente en la entrevista de diseño de sistemas y recibiría una implementación de diseño de servicio de intercambio de fotos. Les agradezco muchísimo chicos por quedarse conmigo hasta el final de esta conferencia. Y espero verte en la siguiente.