Arquitectura de software y diseño de sistemas: panorama general y guía de recursos

Hola colegas

Hoy ofrecemos a su consideración una traducción de un artículo de Tugberk Ugurlu, quien se propuso esbozar en un volumen relativamente pequeño los principios del diseño de sistemas de software modernos. Esto es lo que el autor dice sobre sí mismo en resumen:

Arquitectura de software y diseño de sistemas: panorama general y guía de recursos
Dado que es absolutamente imposible cubrir en un artículo de habro un tema tan colosal como patrones arquitectónicos + patrones de diseño a partir de 2019, recomendamos no solo el texto del propio Sr. Uruglu, sino también los numerosos enlaces que amablemente incluyó en él. Si te gusta publicaremos un texto más especializado sobre el diseño de sistemas distribuidos.

Arquitectura de software y diseño de sistemas: panorama general y guía de recursos

Foto Isaac Smith desde Unsplash

Si nunca ha tenido que enfrentar desafíos como diseñar un sistema de software desde cero, cuando comienza ese trabajo, a veces ni siquiera está claro por dónde empezar. Creo que primero debes trazar límites para tener una idea más o menos segura de qué vas a diseñar exactamente, y luego arremangarte y trabajar dentro de esos límites. Como punto de partida, puedes tomar un producto o servicio (idealmente uno que realmente te guste) y descubrir cómo implementarlo. Es posible que se sorprenda de lo simple que parece este producto y de la complejidad que realmente contiene. No lo olvide: simple - generalmente complejo, y eso está bien.

Creo que el mejor consejo que puedo darle a cualquiera que empiece a diseñar un sistema es este: ¡no hagas suposiciones! Desde el principio es necesario especificar los hechos conocidos sobre este sistema y las expectativas asociadas con él. Aquí hay algunas buenas preguntas que puede hacer para ayudarlo a comenzar con su diseño:

  • ¿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 usaremos?
  • ¿Cuáles son los casos de fracaso esperados y cómo los vamos a manejar?
  • ¿Cuáles son las expectativas de coherencia y disponibilidad del sistema?
  • ¿Hay que tener en cuenta algún requisito relacionado con la verificación y regulación externa a la hora de trabajar?
  • ¿Qué tipo de datos sensibles vamos a almacenar?

Estas son sólo algunas preguntas que han sido de utilidad tanto para mí como para los equipos en los que he participado a lo largo de estos años de actividad profesional. Si conoces las respuestas a estas preguntas (y a cualquier otra que sea relevante para el contexto en el que tienes que trabajar), podrás profundizar poco a poco en los detalles técnicos del problema.

Establecer el nivel inicial

¿Qué quiero decir aquí con “línea de base”? De hecho, en nuestros tiempos, la mayoría de los problemas de la industria del software “pueden” resolverse utilizando los métodos y tecnologías existentes. En consecuencia, al navegar por este panorama, obtienes una cierta ventaja cuando te enfrentas a problemas que alguien más tuvo que resolver antes que tú. No olvide que los programas están escritos para resolver problemas comerciales y de 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 importante recordar esto? Quizás en tu sistema de coordenadas te gusta buscar soluciones únicas para todos los problemas, porque piensas: “¿qué clase 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 tiene que enfrentarse de vez en cuando a problemas únicos, cada uno de los cuales es un verdadero desafío. Sin embargo, si nuestro nivel inicial está claramente definido, entonces sabemos en qué gastar nuestra energía: buscar opciones ya preparadas para resolver el problema que se nos plantea, o estudiarlo más a fondo y obtener una comprensión más profunda.

Creo que pude convencerlos de que si un especialista comprende 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 este campo.

Bien, ¿por dónde empezar? Ud. doña martina Hay un repositorio en GitHub llamado cartilla-de-diseño-de-sistemas, desde donde podrá aprender a diseñar sistemas a gran escala, así como prepararse para entrevistas sobre este tema. El repositorio tiene una sección con ejemplos. arquitecturas reales, donde, en particular, se considera cómo abordan el diseño de sus sistemas. algunas empresas conocidaspor ejemplo, Twitter, Uber, etc.

Sin embargo, antes de pasar a este material, echemos un vistazo más de cerca a los desafíos arquitectónicos más importantes a los que nos enfrentamos en la práctica. Esto es importante porque hay que especificar MUCHOS aspectos de un problema persistente y multifacético, y luego resolverlo en el marco de las regulaciones vigentes en un sistema determinado. Jackson Gabbard, un ex empleado de Facebook, escribió Vídeo de 50 minutos sobre entrevistas de diseño de sistemas., donde compartió su propia experiencia al seleccionar a cientos de solicitantes. Si bien el video se centra en gran medida en el diseño de sistemas grandes y los criterios de éxito que son importantes al buscar un candidato para dicho puesto, seguirá sirviendo como un recurso integral sobre qué cosas son más importantes al diseñar sistemas. Yo también sugiero resumen este video.

Desarrollar conocimientos sobre el almacenamiento y la recuperación de datos.

Normalmente, su decisión sobre cómo almacenar y recuperar sus datos a largo plazo tiene un impacto crítico en el rendimiento del sistema. Por lo tanto, primero debe comprender las características esperadas de escritura y lectura de su sistema. Entonces es necesario poder evaluar estos indicadores y tomar decisiones basadas en las evaluaciones realizadas. Sin embargo, sólo podrá afrontar eficazmente este trabajo si comprende los patrones de almacenamiento de datos existentes. En principio, esto implica conocimientos sólidos relacionados con selección de base de datos.

Las bases de datos pueden considerarse como estructuras de datos extremadamente escalables y duraderas. Por lo tanto, el conocimiento de las estructuras de datos debería resultarle muy útil a la hora de elegir una base de datos en particular. 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, y leer datos utilizando algoritmos conocidos, por ejemplo, LRU, organizando dicho trabajo en un estilo duradero y muy accesible.

Arquitectura de software y diseño de sistemas: panorama general y guía de recursos

Foto Samuel Zeller desde Unsplash

Una vez que tenga una comprensión suficiente de los diversos patrones de almacenamiento de datos, continúe con el estudio de la coherencia y disponibilidad de los datos. Primero que nada, debes entender teorema de la PAC al menos en términos generales, y luego pulir este conocimiento observando más de cerca los patrones establecidos consistencia и disponibilidad. De esta manera, desarrollará una comprensión del campo y comprenderá que leer y escribir datos son en realidad dos problemas muy diferentes, cada uno con sus propios desafíos únicos. Armado con algunos patrones de coherencia y disponibilidad, puede aumentar significativamente el rendimiento del sistema y, al mismo tiempo, garantizar un flujo de datos fluido hacia sus aplicaciones.

Finalmente, para concluir la conversación sobre problemas de almacenamiento de datos, también debemos mencionar el almacenamiento en caché. ¿Debería ejecutarse simultáneamente en el cliente y el servidor? ¿Qué datos estarán en su caché? ¿Y por qué? ¿Cómo se organiza la invalidación de la caché? ¿Se hará periódicamente, a determinados intervalos? En caso afirmativo, ¿con qué frecuencia? Recomiendo empezar a estudiar estos temas con Siguiente sección el manual de diseño de sistemas antes mencionado.

Patrones de comunicación

Los sistemas constan de varios componentes; Estos podrían ser diferentes procesos ejecutándose dentro del mismo nodo físico o diferentes máquinas ejecutándose en diferentes partes de su red. Algunos de estos recursos dentro de su red pueden ser privados, pero otros deben ser públicos y estar abiertos a que los consumidores accedan a ellos desde afuera.

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 de sistemas, aquí nuevamente nos enfrentamos a un conjunto de desafíos nuevos y únicos. Veamos cómo pueden ser útiles. flujos de tareas asincrónicos, y que pHay una variedad de patrones de comunicación disponibles..

Arquitectura de software y diseño de sistemas: panorama general y guía de recursos

Foto Tony Stoddard desde Unsplash

Al organizar la comunicación con el mundo exterior, siempre es muy importante seguridad, cuya provisión también debe tomarse en serio y de forma activa.

Distribución de conexiones

No estoy seguro de que a todos les parezca justificado poner este tema en una sección separada. Sin embargo, presentaré este concepto en detalle aquí y creo que el material de esta sección se describe con mayor precisión mediante el término "distribución de conexiones".

Los sistemas se forman conectando adecuadamente muchos componentes y su comunicación entre sí a menudo se organiza sobre la base de protocolos establecidos, por ejemplo, TCP y UDP. Sin embargo, estos protocolos como tales a menudo son insuficientes para satisfacer todas las necesidades de los sistemas modernos, que a menudo funcionan bajo cargas elevadas y también dependen en gran medida de las necesidades del usuario. A menudo es necesario encontrar formas de distribuir las conexiones para hacer frente a cargas tan elevadas en el sistema.

Esta distribución se basa en la conocida sistema de nombres de dominio (DNS). Un sistema de este tipo permite transformaciones de nombres de dominio, como métodos round robin ponderados y basados ​​en latencia, para ayudar a distribuir la carga.

Balanceo de carga es fundamentalmente importante, y prácticamente todos los grandes sistemas de Internet con los que trabajamos hoy en día están ubicados detrás de uno o más balanceadores de carga. Los balanceadores de carga ayudan a distribuir las solicitudes de los clientes entre múltiples instancias disponibles. Los balanceadores de carga vienen tanto en hardware como en software, sin embargo, en la práctica, más a menudo hay que lidiar con los de software, por ejemplo. HAProxy и ELB. Proxies inversos conceptualmente también muy similar a los balanceadores de carga, aunque hay un rango entre el primero y el segundo diferencias claras. Estas diferencias deben tenerse en cuenta a la hora de diseñar un sistema en función de sus necesidades.

También deberías saber acerca de redes de entrega de contenidos (CDN). Una CDN es una red distribuida global de servidores proxy que entrega información desde nodos que están ubicados geográficamente más cerca de un usuario específico. Es preferible utilizar CDN si trabaja con archivos estáticos escritos en JavaScript, CSS y HTML. Además, hoy en día son habituales los servicios en la nube que proporcionan administradores de tráfico, por ejemplo, Administrador de tráfico de Azure, brindándole distribución global y latencia reducida cuando trabaja con contenido dinámico. Sin embargo, estos servicios suelen ser útiles en los casos en los que es necesario trabajar con servicios web sin estado.

Hablemos de lógica empresarial. Estructuración de la lógica empresarial, flujos de tareas y componentes.

Así logramos discutir varios aspectos infraestructurales del sistema. Lo más probable es que el usuario ni siquiera piense en todos estos elementos de su sistema y, francamente, no le importen en absoluto. El usuario está interesado en cómo es interactuar con su sistema, qué se puede lograr al hacerlo y también cómo el sistema ejecuta los comandos del usuario, qué y cómo hace con los datos del usuario.

Como sugiere el título de este artículo, iba a hablar sobre arquitectura de software y diseño de sistemas. En consecuencia, no planeé cubrir patrones de diseño de software que describan cómo se crean los componentes de software. Sin embargo, cuanto más lo pienso, más me parece que la línea entre los patrones de diseño de software y los patrones arquitectónicos es muy borrosa y que los dos conceptos están estrechamente relacionados. Tomemos por ejemplo registro de evento (abastecimiento de eventos). Una vez que adopte este patrón arquitectónico, afectará casi todos los aspectos de su sistema: almacenamiento de datos a largo plazo, el nivel de coherencia adoptado en su sistema, la forma de los componentes en él, etc., etc. Por lo tanto, decidí mencionar algunos patrones arquitectónicos que se relacionan directamente con la lógica empresarial. Aunque este artículo tendrá que limitarse a una simple lista, te animo a que lo familiarices y pienses en las ideas asociadas con estos patrones. Aquí estás:

Enfoques colaborativos

Es extremadamente improbable que usted se encuentre en un proyecto como el participante único responsable del proceso de diseño del sistema. Por el contrario, lo más probable es que tengas que interactuar con compañeros que trabajan tanto dentro como fuera de tu tarea. En este caso, es posible que deba evaluar las soluciones tecnológicas seleccionadas con colegas, identificar las necesidades comerciales y comprender cuál es la mejor manera de paralelizar las tareas.

Arquitectura de software y diseño de sistemas: panorama general y guía de recursos

Foto Kaleidico desde Unsplash

El primer paso es desarrollar una comprensión precisa y compartida de cuál es el objetivo empresarial que intenta alcanzar y con qué partes móviles tendrá que lidiar. Técnicas de modelado grupal, en particular. eventos de asalto (asalto de eventos) ayuda a acelerar significativamente este proceso y aumentar sus posibilidades de éxito. Este trabajo se puede realizar antes o después de delinear límites de sus serviciosy luego profundizarlo a medida que madura el producto. Según el nivel de coherencia que se logrará aquí, también puede formular lenguaje común para el contexto limitado en el que trabaja. Cuando necesites hablar sobre la arquitectura de tu sistema, puede que te resulte útil. modelo C4propuesto Simón Brown, especialmente cuando necesitas comprender cuánto tendrás que profundizar en los detalles del problema, visualizando las cosas que quieres comunicar.

Probablemente exista otra tecnología madura sobre este tema que no sea menos útil que el diseño basado en dominios. Sin embargo, de alguna manera volvemos a comprender el área temática, por lo que el conocimiento y la experiencia en el campo Diseño basado en dominios debería serte útil.

Fuente: habr.com

Añadir un comentario