Hola colegas
Hoy, se propone a su tribunal una traducción del artículo de Tugberk Ugurlu, que tomó un volumen relativamente pequeño para exponer los principios del diseño de sistemas de software modernos. Esto es lo que el autor dice sobre sí mismo en el resultado final:
Dado que es absolutamente imposible cubrir un tema tan colosal en un artículo arquitectónico como patrones arquitectónicos + patrones de diseño a partir de 2019, recomendamos no solo el texto del Sr. Uruglu, sino también los numerosos enlaces que amablemente colocó en él. Si lo desea, publicaremos un texto más especializado sobre el diseño de sistemas distribuidos.
Isaac Smith disparó desde UnsplashSi nunca ha tenido que enfrentarse a desafíos como el diseño de un sistema de software desde cero, cuando comience ese trabajo, a veces ni siquiera está claro por dónde empezar. Creo que primero debes delinear los límites para imaginar con más o menos confianza lo que vas a diseñar, y luego arremangarte y trabajar sin ir más allá de estos límites. Como punto de partida, puede tomar algún producto o servicio (idealmente, uno que realmente le guste) y comprender su implementación. Es posible que se sorprenda de lo simple que se ve este producto y de la enorme complejidad que en realidad está oculto. Recuerde:
simple es generalmente complejo , y eso es normal.
Creo que el mejor consejo que puedo dar a aquellos que comienzan a diseñar el sistema es este: ¡no hagan suposiciones! Desde el principio, es necesario concretar los hechos conocidos sobre este sistema y las expectativas asociadas con él. Aquí hay algunas buenas preguntas que pueden ayudarlo a comenzar a diseñar:
- ¿Cuál es el problema que estamos tratando de resolver?
- ¿Cuál es el número máximo de usuarios que interactuarán con nuestro sistema?
- ¿Qué patrones de escritura y lectura de datos se utilizarán con nosotros?
- ¿Cuáles son las fallas esperadas, cómo vamos a lidiar con ellas?
- ¿Cuáles son las expectativas de consistencia y disponibilidad del sistema?
- ¿Tiene que tener en cuenta algún requisito relacionado con la verificación y regulación externa?
- ¿Qué tipos de datos confidenciales vamos a almacenar?
Estas son solo algunas preguntas que fueron útiles tanto para mí como para aquellos equipos en los que tuve la oportunidad de participar a lo largo de los años de actividad profesional. Si conoce las respuestas a estas preguntas (y a cualquier otra que sea relevante en el contexto en el que tiene que trabajar), puede profundizar gradualmente en los detalles técnicos de la tarea.
Establecer el nivel inicial¿Qué quiero decir aquí con "línea de base"? En realidad, en nuestros tiempos, la mayoría de los problemas en la industria del software se pueden "resolver" utilizando los métodos y tecnologías existentes. En consecuencia, al ser guiado en este panorama, obtienes cierta ventaja, frente a las tareas que alguien tuvo que resolver antes que tú. No olvide que los programas están escritos para resolver los problemas de las empresas y los usuarios, por lo que nos esforzamos por resolver el problema de la manera más directa y sencilla (desde el punto de vista del usuario). ¿Por qué es necesario recordar esto? Tal vez en su sistema de coordenadas le guste buscar soluciones únicas para todas las tareas, porque piensa: "¿qué tipo de programador soy si sigo patrones en todas partes?" De hecho, el
arte aquí es tomar decisiones sobre dónde y qué hacer . Por supuesto, cada uno de nosotros de vez en cuando tiene que enfrentar problemas únicos, cada uno de los cuales es un verdadero desafío. Sin embargo, si nuestro nivel inicial está claramente delineado, entonces sabemos en qué gastar energía: en la búsqueda de soluciones preparadas para el problema que se nos plantea, o su posterior estudio y comprensión más profunda.
Creo que logré convencerlo de que si un especialista entiende con confianza cuál es el componente arquitectónico de algunos sistemas de software maravillosos, entonces este conocimiento será indispensable para dominar el arte de un arquitecto y desarrollar una base sólida en esta área.
OK, entonces, ¿por dónde empiezas?
Donna Martin tiene un repositorio en GitHub llamado
system-design-primer , basado en el cual puede aprender cómo diseñar sistemas a gran escala, así como prepararse para entrevistas sobre este tema. El repositorio tiene una sección con ejemplos de
arquitecturas reales , donde, en particular, se examina cómo
algunas empresas conocidas , como Twitter, Uber, etc., abordan el diseño de sus sistemas.
Sin embargo, antes de pasar a este material, echemos un vistazo más de cerca a los desafíos arquitectónicos más importantes que tenemos que enfrentar en la práctica. Esto es importante porque debe especificar MUCHOS aspectos del problema intratable y multifacético, y luego resolverlo dentro del marco de la regulación vigente en este sistema.
Jackson Gabbard , un ex empleado de Facebook, grabó un
video de 50 minutos sobre entrevistas de diseño de sistemas , donde compartió su propia experiencia en la revisión de cientos de solicitantes de empleo. A pesar de que el video se refiere expresamente al diseño de sistemas grandes y criterios de éxito que son importantes cuando se busca un candidato para ese puesto, servirá como un recurso exhaustivo sobre las cosas más importantes al diseñar sistemas. También ofrezco un
resumen de este video.
Obtenga conocimiento sobre el almacenamiento y recuperación de datosComo regla general, su decisión sobre cómo almacenará y mostrará sus datos durante mucho tiempo afectará de manera crítica el rendimiento del sistema. Por lo tanto, primero debe comprender las características esperadas de escribir y leer datos en su sistema. Luego, debe poder evaluar estos indicadores y hacer una elección basada en las estimaciones realizadas. Sin embargo, solo puede hacer frente con eficacia a este trabajo si comprende los patrones existentes de almacenamiento de datos. En principio, esto implica conocimiento confiable relacionado con la
selección de la base de datos .
Las bases de datos pueden considerarse estructuras de datos que se caracterizan por una escalabilidad y durabilidad excepcionales. Por lo tanto, el conocimiento de las estructuras de datos debería serle muy útil al elegir una u otra base de datos. Por ejemplo,
Redis es un servidor de estructura de datos que admite varios tipos de valores. Le permite trabajar con estructuras de datos como listas y conjuntos, leer datos utilizando algoritmos conocidos, por ejemplo,
LRU , organizando dicho trabajo en un estilo duradero y altamente accesible.
Instantánea de Samuel Zeller de UnsplashCuando comprenda bien los diversos patrones de almacenamiento de datos, estudie la consistencia y disponibilidad de los datos. En primer lugar, deberá aprender el
teorema de CAP, al menos en términos generales, y luego pulir este conocimiento examinando con más detalle los patrones establecidos de
consistencia y
accesibilidad . Por lo tanto, desarrollará sus horizontes en esta área y comprenderá que leer y escribir datos son en realidad dos problemas muy diferentes, y cada uno de ellos tiene sus propios desafíos especiales. Armado con varios patrones para garantizar la coherencia y la accesibilidad, puede aumentar significativamente el rendimiento del sistema al tiempo que garantiza un flujo ininterrumpido de datos a sus aplicaciones.
Finalmente, concluyendo la discusión sobre los problemas de almacenamiento de datos, también se debe mencionar el almacenamiento en caché. ¿Debería ejecutarse tanto en el cliente como en el servidor? ¿Qué datos estarán en su caché? Y por que ¿Cómo se organiza la invalidación de caché? ¿Se hará regularmente, a intervalos regulares? Si es así, ¿con qué frecuencia? Recomiendo comenzar el estudio de estos temas con la
siguiente sección del manual sobre diseño de sistemas mencionado anteriormente.
Patrones de comunicaciónLos sistemas consisten en varios componentes; pueden ser diferentes procesos que se ejecutan dentro del mismo nodo físico o diferentes máquinas que operan en diferentes partes de su red. Algunos de estos recursos dentro de su red pueden ser privados, pero otros deben ser públicos y abiertos a los consumidores que acceden a ellos desde el exterior.
Es necesario garantizar la comunicación de estos recursos entre sí, así como el intercambio de información entre todo el sistema y el mundo exterior. En el contexto del diseño del sistema, aquí, nuevamente, nos enfrentamos a un conjunto de nuevos desafíos únicos. Descubrimos cómo los
flujos de tareas asíncronas pueden ser útiles y qué
diversos patrones de comunicación están disponibles .
Instantánea de Tony Stoddard de UnsplashAl organizar la comunicación con el mundo exterior, la
seguridad siempre es muy importante, que también debe abordarse con seriedad y participar activamente.
Distribución de conexiónNo estoy seguro de que poner este tema en una sección independiente parezca justificado para todos. Sin embargo, expondré este concepto aquí, y creo que el material en esta sección se describe con mayor precisión por el término "distribución de conexión".
Los sistemas se forman conectando correctamente muchos componentes, y su comunicación entre ellos a menudo se organiza sobre la base de protocolos establecidos, por ejemplo, TCP y UDP. Sin embargo, estos protocolos como tales a menudo no son suficientes para satisfacer todas las necesidades de los sistemas modernos, que a menudo funcionan bajo una carga elevada, y también dependen en gran medida de las necesidades de los usuarios. A menudo es necesario encontrar formas de distribuir compuestos para hacer frente a tan altas cargas del sistema.
Esta distribución se basa en el conocido
sistema de nombres de dominio (DNS). Dicho sistema le permite convertir un nombre de dominio, por ejemplo, round robin ponderado y métodos basados en retrasos, que ayudan a distribuir la carga.
El equilibrio de carga es fundamentalmente importante, y casi cualquier sistema grande en Internet con el que tengamos que lidiar hoy está ubicado detrás de uno o más equilibradores de carga. Los equilibradores de carga lo ayudan a distribuir las solicitudes de los clientes en las muchas instancias disponibles. Los equilibradores de carga pueden ser hardware o software, sin embargo, en la práctica, a menudo tiene que lidiar con software, por ejemplo,
HAProxy y
ELB .
Los proxys inversos son conceptualmente muy similares a los equilibradores de carga, aunque existen varias
diferencias distintas entre el primero y el segundo. Estas diferencias deben tenerse en cuenta al diseñar el sistema de acuerdo con sus necesidades.
También debe tener en cuenta
las redes de entrega de
contenido (CDN). CDN es una red distribuida global de servidores proxy que entrega información de aquellos nodos que están ubicados geográficamente más cerca de un usuario específico. Se prefieren las CDN si está trabajando con archivos estáticos escritos en JavaScript, CSS y HTML. Además, estos servicios en la nube son populares hoy en día y proporcionan administradores de tráfico, por ejemplo,
Azure Traffic Manager , que le proporciona distribución global y reducen los retrasos al trabajar con contenido dinámico. Sin embargo, tales servicios suelen ser útiles en casos en los que tiene que trabajar con servicios web sin guardar el estado.
Hablemos de lógica de negocios. Estructuración de la lógica empresarial, flujos de tareas y componentes.Entonces, logramos discutir varios aspectos de infraestructura del sistema. Lo más probable es que el usuario ni siquiera piense en todos estos elementos de su sistema y, francamente, no se preocupe por ellos en absoluto. El usuario está interesado en cómo interactuar con su sistema, qué se puede lograr al hacerlo, y cómo el sistema ejecuta los comandos del usuario, qué y cómo hacer con los datos del usuario.
Como el nombre de este artículo implica, iba a contarle sobre arquitectura de software y diseño de sistemas. En consecuencia, no tenía planeado cubrir los patrones de diseño de software que describen cómo se crean los componentes de software. Sin embargo, cuanto más lo pienso, más me parece que el límite entre los patrones de diseño de software y los patrones arquitectónicos es muy borroso, y estos dos conceptos están estrechamente relacionados. Tomemos, por ejemplo, el abastecimiento de eventos. Si adopta este patrón arquitectónico, afectará a casi todos los aspectos de su sistema: almacenamiento de datos a largo plazo, el nivel de consistencia adoptado en su sistema, los contornos de los componentes, etc., etc. Así que decidí mencionar algunos patrones arquitectónicos que están directamente relacionados con la lógica empresarial. Incluso si en este artículo tiene que limitarse a una lista simple, le recomiendo que se familiarice con ella y piense en ideas relacionadas con estos patrones. Aquí tienes
Enfoques colaborativosEs extremadamente improbable que termine en el proyecto como el participante que es el único responsable del proceso de diseño del sistema. Por el contrario, lo más probable es que tenga que interactuar con colegas que trabajan tanto dentro de su tarea como más allá. En este caso, es posible que deba evaluar las soluciones tecnológicas seleccionadas junto con colegas, aislar las necesidades comerciales y comprender cómo paralelizar mejor las tareas.
Instantánea de Kaleidico de UnsplashEn primer lugar, será necesario desarrollar una idea precisa y universalmente reconocida de cuál es el objetivo comercial que está tratando de lograr y con qué elementos móviles tendrá que lidiar. Las técnicas de modelado grupal, en particular la tormenta de eventos, pueden acelerar significativamente este proceso y aumentar sus posibilidades de éxito. Puede hacer este trabajo antes o después de delinear los
límites de sus servicios y luego profundizarlo a medida que el producto madure. Según el nivel de coherencia que se logrará aquí, también puede formular un
solo idioma para el contexto limitado en el que trabaja. Cuando necesite hablar sobre la arquitectura de su sistema, puede usar
el modelo C4 propuesto por
Simon Brown para esto , especialmente cuando necesite comprender cuánto tendrá que profundizar en los detalles del problema visualizando las cosas que desea informar.
Probablemente, hay otra tecnología madura en este tema, no menos útil que el diseño orientado a temas. Sin embargo, de una forma u otra, volvemos a comprender el área temática, por lo que el conocimiento y la experiencia en el campo del
diseño orientado a la materia deberían ser útiles para usted.