Esta obra es una fuente de información privilegiada, basada en las preguntas que se realizan en las más difíciles entrevistas técnicas. Los entrevistadores piden a los entrevistado...
Esta obra es una fuente de información privilegiada, basada en las preguntas que se realizan en las más difíciles entrevistas técnicas. Los entrevistadores piden a los entrevistados que diseñen una arquitectura para un sistema de software, que puede ser un news feed (noticias), una búsqueda en Google, un sistema de chat, etc. Las empresas adoptan las entrevistas de diseño de sistemas porque las habilidades de comunicación y resolución de problemas que se ponen a prueba en estas entrevistas son similares a las requeridas en el trabajo cotidiano de un ingeniero de software. Son evaluados basándose en el modo en el que cada uno analiza un problema impreciso y en cómo resuelve el problema paso a paso. Las habilidades sometidas a prueba implican además el modo en el que explica la idea, discute con otros y evalúa y optimiza el sistema. El objetivo de este libro es ofrecer una estrategia fiable y una base sólida de conocimiento para abordar no solo las preguntas de diseño de sistemas en una entrevista laboral, sino para que el ingeniero de software pueda contar con la estrategia correcta para crear un sistema escalable o solucionar problemas en la arquitectura de los sistemas. Esta obra cuenta con: * Una estructura en cuatro pasos para resolver cualquier pregunta en una entrevista de diseño de sistemas. * 16 preguntas realizadas en la vida real en entrevistas de diseño de sistemas con soluciones detalladas. * 188 diagramas que explican de manera visual el funcionamiento de los distintos sistemas. * Ejemplos que ilustran un acercamiento sistemático y práctico con pasos detallados.Índice Sobre el autor Prólogo 1. Pasar de cero a millones de usuarios Configuración de un solo servidor Base de datos Qué bases de datos utilizar Escalabilidad horizontal y vertical Equilibrador de carga Replicación de bases de datos Caché Nivel de caché Apreciaciones en el uso de la caché Red de entrega de contenidos o CDN (Content Delivery Network) Apreciaciones en el uso de una CDN Capa web sin estado (stateless) Arquitectura con estado (stateful) Arquitectura sin estado (stateless) Centros de datos Cola de mensajes Registros, métricas, automatización Añadir colas de mensajes y distintas herramientas Escalabilidad de base de datos Escalabilidad vertical Escalabilidad horizontal Millones de usuarios y más allá 2. Estimación preliminar Potencia de dos Números de latencia que todo programador debe conocer Números de disponibilidad Ejemplo: estimación de CPS y requisitos de almacenamiento de Twitter Consejos 3. Estructura para una entrevista de diseño de sistemas Un proceso en cuatro pasos para una entrevista de diseño de sistemas eficaz Paso 1 - Comprender el problema y establecer el alcance del diseño Paso 2 - Proponer un diseño de alto nivel y obtener aceptación Paso 3 - Estudiar el diseño con detenimiento Paso 4 - Conclusión Asignación de tiempos a cada paso 4. Diseñar un limitador de frecuencia Paso 1 - Comprender el problema y establecer el alcance del diseño Requisitos Paso 2 - Proponer un diseño de alto nivel y obtener aceptación ¿Dónde colocar el limitador de frecuencia? Algoritmos para limitación de frecuencia Arquitectura de alto nivel Paso 3 - Estudiar el diseño con detenimiento Reglas de limitación de frecuencia Exceder el límite de frecuencia Diseño detallado El limitador de frecuencia en un entorno distribuido Optimización del rendimiento Monitorización Paso 4 - Conclusión 5. Diseñar hashing consistente El problema de la redistribución Hashing consistente Espacio hash y anillo hash Servidores hash Claves hash Búsqueda del servidor Añadir un servidor Eliminar un servidor Dos problemas con el enfoque básico Nodos virtuales Encontrar las claves afectadas Conclusión 6. Diseñar un almacén de clave-valor Comprender el problema y establecer el alcance del diseño1 Almacén de clave-valor de un solo servidor Almacén de clave-valor distribuido Teorema CAP Componentes del sistema Partición de datos Replicación de datos Consistencia Resolución de inconsistencias: control de versiones Gestión de fallos Diagrama de la arquitectura del sistema Ruta de escritura Ruta de lectura Resumen 7. Diseñar un generador de identificador único en sistemas distribuidos Paso 1 - Comprender el problema y establecer el alcance del diseño Paso 2 - Proponer un diseño de alto nivel y obtener aceptación Replicación multimaestra UUID Servidor de tickets Método Snowflake (copo de nieve) de Twitter Paso 3 - Estudiar el diseño con detenimiento Marca de tiempo Número secuencial Paso 4 - Conclusión 8. Diseñar un reductor de URL Paso 1 - Comprender el problema y establecer el alcance del diseño Estimaciones preliminares Paso 2 - Proponer un diseño de alto nivel y obtener aceptación Endpoints API Redirección de URL Reducción de URL Paso 3 - Estudiar el diseño con detenimiento Modelo de datos Función hash Reducción de URL en profundidad Redirección de URL en profundidad Paso 4 - Conclusión 9. Diseñar un rastreador web Paso 1 - Comprender el problema y establecer el alcance del diseño Estimaciones preliminares Paso 2 - Proponer un diseño de alto nivel y obtener aceptación URL iniciales Frontera URL HTML downloader Resolutor DNS Analizador de contenido ¿Contenido visto? Almacenamiento de contenido Extractor de URL Filtro URL ¿URL vista? Almacenamiento URL Flujo de trabajo del rastreador web Paso 3 - Estudiar el diseño con detenimiento DFS frente a BFS Frontera URL HTML downloader Robustez Extensibilidad Detectar y evitar contenido problemático Paso 4 - Conclusión 10. Diseñar un sistema de notificaciones Paso 1 - Comprender el problema y establecer el alcance del diseño Paso 2 - Proponer un diseño de alto nivel y obtener aceptación Distintos tipos de notificaciones Flujo de recogida de información de contacto Flujo de envío y recepción de notificaciones Paso 3 - Estudiar el diseño con detenimiento Fiabilidad Componentes adicionales y otras consideraciones Diseño actualizado Paso 4 - Conclusión 11. Diseñar un sistema de noticias Paso 1 - Comprender el problema y establecer el alcance del diseño Paso 2 - Proponer un diseño de alto nivel y obtener aceptación API de news feed Publicación de feeds Creación de flujos de noticias Paso 3 - Estudiar el diseño con detenimiento Publicación de feeds en detalle Recuperación de news feed en detalle Arquitectura de la caché Paso 4 - Conclusión 12. Diseñar un sistema de chat Paso 1 - Comprender el problema y establecer el alcance del diseño Paso 2 - Proponer un diseño de alto nivel y obtener aceptación Sondeo Sondeo largo WebSocket Diseño en el alto nivel Modelos de datos Paso 3 - Estudiar el diseño con detenimiento Descubrimiento de servicio Flujos de mensajes Presencia en línea Paso 4 - Conclusión 13. Diseñar un sistema para completar palabras de forma automática en un motor de búsqueda Paso 1 - Comprender el problema y establecer el alcance del diseño Requisitos Estimación preliminar Paso 2 - Proponer un diseño de alto nivel y obtener aceptación Servicio de recogida de datos Servicio de consulta Paso 3 - Estudiar el diseño con detenimiento Estructura de datos trie Servicio de recogida de datos Servicio de consultas Operaciones del trie Dimensionar el almacenamiento Paso 4 - Conclusión 14. Diseñar YouTube Paso 1 - Comprender el problema y establecer el alcance del diseño Cálculos preliminares Paso 2 - Proponer un diseño de alto nivel y obtener aceptación Flujo de subida de vídeos Flujo de transmisión de vídeos Paso 3 - Estudiar el diseño con detenimiento Transcodificación de vídeo Modelo DAG Arquitectura de transcodificación de vídeo Optimizaciones del sistema Manejo de errores Paso 4 - Conclusión 15. Diseñar Google Drive Paso 1 - Comprender el problema y establecer el alcance del diseño Cálculos preliminares Paso 2 - Proponer un diseño de alto nivel y obtener aceptación Interfaces API Cuando un solo servidor no es suficiente Conflictos de sincronización Diseño en el alto nivel Paso 3 - Estudiar el diseño con detenimiento Servidores de bloques Requisito de alta consistencia Base de datos de metadatos Flujo de subida Flujo de descarga Servicio de notificaciones Ahorrar espacio de almacenamiento Manejo de fallos Paso 4 - Conclusión 16. El aprendizaje continúa Sistemas reales Blogs de ingeniería de empresas