Be Software Architecture Wise
Be Wise Apps

Read in English · Lire en français · Auf Deutsch lesen

Capítulo 5 de 12 · Intermedio

Estilos arquitectónicos I: monolitos y diseños modulares

La mayor parte del software, incluidos algunos de los productos más grandes y exitosos, se ejecuta como una única aplicación desplegable. Este capítulo explica cómo deben estructurarse por dentro esas aplicaciones. Presenta el vocabulario de los estilos arquitectónicos, los patrones, las tácticas y el cuanto de arquitectura; después trata la arquitectura en capas, el monolito modular, las tuberías y filtros, la arquitectura de microkernel y de plug-ins, las arquitecturas hexagonal, de cebolla y limpia, y el diseño estratégico guiado por el dominio, y termina con cuándo un monolito es la respuesta correcta. Está dirigido a desarrolladores y arquitectos que diseñan o mantienen aplicaciones de negocio y quieren elegir y hacer cumplir una estructura de forma deliberada.

Introducción en video al capítulo 5

6 min · narrado en inglés, con subtítulos
Solo escuchar (audio)
Leer la transcripción

Te damos la bienvenida al Capítulo 5: Estilos arquitectónicos, primera parte, monolitos y diseños modulares. La mayor parte del software, incluidos algunos de los productos más grandes y exitosos, se ejecuta como una única aplicación desplegable. Este capítulo explica cómo deben estructurarse por dentro esas aplicaciones, y cuándo una sola aplicación es la respuesta correcta.

Los Capítulos 3 y 4 te dieron los principios de una buena estructura y las herramientas para describirla. Este capítulo y el siguiente convierten esos principios en las formas recurrentes que adoptan los sistemas reales. Conocer los estilos principales te permite partir de una forma que se sabe que funciona para un conjunto dado de cualidades, explicarla en una frase y reconocer pronto cuándo un sistema se está alejando de ella. Este capítulo trata los estilos en los que toda la aplicación es una sola unidad de despliegue: una compilación, un lanzamiento, normalmente una base de datos. Eso no hace que los monolitos sean primitivos. Que trabajar en un monolito sea un placer o un suplicio depende casi por completo de cómo esté dividido por dentro.

El capítulo está dirigido a desarrolladores y arquitectos que diseñan o mantienen aplicaciones de negocio y quieren elegir y hacer cumplir una estructura de forma deliberada. Se apoya en los Capítulos 3 y 4, en especial en la modularidad, el acoplamiento y la cohesión, las dependencias y la organización en capas, y el modelo C4. Los atributos de calidad del Capítulo 2 se usan a lo largo de todo el capítulo. Y conduce al Capítulo 6, que lleva las mismas preguntas a través de una red, donde las cosas se complican. Un monolito evita los fallos de red, las caídas parciales y los problemas de consistencia de los sistemas distribuidos. De ellos se ocupa el Capítulo 6.

Primero, una definición. Un estilo arquitectónico es un conjunto con nombre de restricciones sobre los tipos de partes que tiene un sistema y sobre cómo pueden conectarse. Las restricciones son lo importante. Prohíbe, por ejemplo, que un módulo de negocio toque las tablas de otro, y obtendrás beneficios predecibles, a un precio predecible.

El capítulo tiene ocho secciones. La Sección cinco punto uno establece el vocabulario que se usa para cada estilo de los Capítulos 5 y 6: estilos, patrones, tácticas y arquitecturas de referencia. Explica la diferencia entre el particionamiento técnico, por capa, y el particionamiento por dominio, por capacidad de negocio. Y presenta el cuanto de arquitectura: una parte desplegable de forma independiente, datos incluidos, a la que se aplica un mismo conjunto de cualidades.

Veamos por qué importa el particionamiento. Supón que una empresa de reparto de comida permite a los clientes añadir una propina para el repartidor. Con el particionamiento técnico, ese único cambio toca la capa de presentación, la lógica de negocio y la capa de persistencia. Con el particionamiento por dominio, el mismo cambio cae casi por completo en el módulo de reparto, que por dentro puede seguir organizado en capas. La mayoría de las solicitudes de cambio del negocio se formulan en términos del dominio, así que el particionamiento por dominio tiende a mantener un cambio en un solo lugar. Y permite que cada equipo sea dueño de una capacidad de negocio de principio a fin.

Las Secciones cinco punto dos a cinco punto cinco describen cuatro estilos con el mismo formato, con un diagrama, un ejemplo, una tabla de características, cuándo usarlo y cómo hacerlo cumplir en el código. La arquitectura en capas es la conocida pila de capas de presentación, de negocio y de persistencia. El monolito modular divide una sola aplicación desplegable por dominio de negocio, con interfaces de módulo explícitas y una propiedad clara de los datos, ilustrado con la experiencia de Shopify. Tuberías y filtros organiza el procesamiento como una cadena de pasos independientes, desde las tuberías de Unix hasta los pipelines de datos. Y el microkernel construye un núcleo mínimo que los plug-ins amplían, como en las herramientas de desarrollo, los navegadores y los motores de reglas.

Este diagrama de la Sección cinco punto tres muestra un monolito modular por dentro. El límite discontinuo es una sola unidad de despliegue: la aplicación de reparto de comida. Cada módulo, aquí Pedidos y Pagos, tiene una pequeña API pública. Pedidos solo puede usar Pagos llamando a esa API. Todo lo demás de un módulo es interno. Está prohibido acceder desde las partes internas de un módulo a las de otro. Y cada módulo es dueño de su propio esquema, sin joins entre esquemas. Respeta estas reglas, y cualquier módulo podrá extraerse más adelante a un servicio con un esfuerzo moderado.

La Sección cinco punto seis trata las arquitecturas hexagonal, de cebolla y limpia. Ponen la lógica de negocio en el centro y hacen que las bases de datos, las interfaces de usuario y los servicios externos dependan de ella, nunca al revés. La Sección cinco punto siete, sobre el diseño estratégico guiado por el dominio, aporta el método para encontrar buenos límites: subdominios, contextos delimitados y las relaciones entre ellos en un mapa de contextos. Por último, la Sección cinco punto ocho se pregunta cuándo un monolito es la respuesta correcta, hasta dónde puede escalar y qué señales indican que ha llegado el momento de dividirlo. Termina con una guía de decisión y una tabla comparativa de todos los estilos del capítulo.

Si recuerdas una sola cosa, que sea esta: los límites dentro de un sistema importan más que los límites entre unidades de despliegue. Un conjunto de servicios que comparten una base de datos y llaman a las partes internas de los demás sigue siendo un único sistema enmarañado, ahora con fallos de red añadidos. De ahí se derivan dos hábitos. Primero, elige el estilo más sencillo cuyas características satisfagan los requisitos arquitectónicamente significativos del sistema, y registra la elección y sus compromisos en un registro de decisiones. Segundo, haz cumplir las reglas del estilo con pruebas de arquitectura en la compilación, porque todo estilo se erosiona cuando sus restricciones solo viven en la cabeza de las personas.

Lee primero la Sección cinco punto uno, porque todas las secciones posteriores usan su vocabulario. Después, puedes seguir los estilos en orden o ir directamente al que necesites. Leer el capítulo lleva unas tres horas. Sigue la plataforma de reparto de comida a medida que recorre el capítulo. Comparar los estilos sobre un único sistema conocido es mucho más fácil que sobre ejemplos de juguete sin relación entre sí. Cada sección termina con unas cuantas preguntas de autoevaluación. Respóndelos mentalmente antes de mirar. Cuando estés listo, haz la prueba opcional del capítulo: veinte preguntas de opción múltiple y dos respuestas escritas, en unos cuarenta y cinco minutos. La nota de aprobado es el ochenta por ciento.

Ese es el mapa del Capítulo 5. Empieza por la Sección cinco punto uno, donde establecemos el vocabulario de estilos, patrones y tácticas en el que se apoyan los dos capítulos siguientes. Nos vemos allí.

Descargar el capítulo (PDF)Leer en la app

De un vistazo

Aprenderás a

  • Distinguir estilos arquitectónicos, patrones, tácticas y arquitecturas de referencia, y explicar por qué las restricciones de un estilo producen sus cualidades.
  • Comparar el particionamiento técnico y el particionamiento por dominio, y predecir cómo afecta cada uno al costo de un cambio típico y a la organización de los equipos.
  • Identificar los cuantos de arquitectura de un diseño y explicar por qué las bases de datos compartidas unen los servicios en un solo cuanto.
  • Describir los estilos en capas, monolito modular, tuberías y filtros y microkernel, valorar sus características y reconocer sus antipatrones.
  • Aplicar la arquitectura hexagonal, de cebolla o limpia para mantener la lógica de negocio independiente de los frameworks y de la infraestructura.
  • Usar el diseño estratégico guiado por el dominio para encontrar contextos delimitados y describir sus relaciones en un mapa de contextos.
  • Hacer cumplir reglas estructurales en el código con pruebas de arquitectura y herramientas de módulos como import-linter, ArchUnit y Spring Modulith.
  • Decidir cuándo un monolito es la opción correcta, cómo escalarlo y qué señales indican que ha llegado el momento de extraer servicios.

Antes de empezar

Capítulo 3, en especial la modularidad, el acoplamiento y la cohesión, y las dependencias y la organización en capas; Capítulo 4, en especial el modelo C4. Los atributos de calidad del Capítulo 2 se usan a lo largo de todo el capítulo.

Tiempo

Unas 3 horas de lectura; 45 minutos para la prueba.

Términos clave

estilo arquitectónico · patrón arquitectónico · táctica · particionamiento técnico · particionamiento por dominio · cuanto de arquitectura · capas cerradas y abiertas · sumidero de arquitectura (architecture sinkhole) · monolito modular · tuberías y filtros · back pressure (contrapresión) · microkernel · puertos y adaptadores · contexto delimitado (bounded context)

Por qué importan los estilos

Los Capítulos 3 y 4 te dieron los principios de una buena estructura (modularidad, acoplamiento y cohesión, dirección de las dependencias) y las herramientas para describirla. Este capítulo y el siguiente convierten esos principios en las formas recurrentes que adoptan los sistemas reales. Un estilo arquitectónico es un conjunto con nombre de restricciones sobre los tipos de partes que tiene un sistema y sobre cómo pueden conectarse. Las restricciones son lo importante: prohíbe que las partes de un pipeline compartan estado, o que un módulo de negocio toque las tablas de otro, y obtendrás beneficios predecibles, a un precio predecible. Conocer los estilos principales permite a un arquitecto partir de una forma que se sabe que funciona para un conjunto dado de cualidades, explicarla en una frase y reconocer pronto cuándo un sistema se está alejando de ella.

Este capítulo trata los estilos en los que toda la aplicación es una sola unidad de despliegue: una compilación, un lanzamiento, normalmente una base de datos, con partes que se llaman entre sí en memoria. Una arquitectura monolítica así evita los fallos de red, las caídas parciales y los problemas de consistencia de los sistemas distribuidos, de los que se ocupa el Capítulo 6. Eso no hace que los monolitos sean primitivos. Que trabajar en un monolito sea un placer o un suplicio depende casi por completo de cómo esté dividido por dentro, y de eso trata este capítulo.

Cómo encaja el capítulo

La Sección 5.1 establece el vocabulario que se usa para cada estilo de los Capítulos 5 y 6: estilos, patrones, tácticas y arquitecturas de referencia; la diferencia entre el particionamiento técnico (por capa) y el particionamiento por dominio (por capacidad de negocio); el despliegue monolítico frente al distribuido; y el cuanto de arquitectura, la unidad desplegable de forma independiente a la que se aplica un mismo conjunto de cualidades. Termina con una tabla resumen de todos los estilos de los dos capítulos.

Las Secciones 5.2 a 5.5 describen después cuatro estilos con un formato uniforme: definición y origen, un diagrama, cómo funciona, un ejemplo, una tabla de características, cuándo usarlo y cuándo no, antipatrones y cómo hacerlo cumplir en el código. La arquitectura en capas (5.2) es la conocida pila de presentación, negocio y persistencia, con capas cerradas y abiertas y el antipatrón del sumidero. El monolito modular (5.3) divide una sola aplicación desplegable por dominio de negocio, con API de módulo explícitas y propiedad de los datos, ilustrado con la experiencia de Shopify y un mapa de módulos de una plataforma de reparto de comida. Tuberías y filtros (5.4) organiza el procesamiento como una cadena de pasos independientes, desde las tuberías de Unix hasta los pipelines de datos. El microkernel (5.5) construye un núcleo mínimo que los plug-ins amplían, como en los IDE, los navegadores y los motores de reglas.

Las Secciones 5.6 y 5.7 tratan de la estructura dentro de los módulos y entre ellos, más que del despliegue. Las arquitecturas hexagonal, de cebolla y limpia (5.6) ponen la lógica de negocio en el centro y hacen que las bases de datos, las interfaces de usuario y los servicios externos dependan de ella, nunca al revés, lo que permite probar el núcleo y reemplazar su infraestructura. El diseño estratégico guiado por el dominio (5.7) aporta el método para encontrar buenos límites: subdominios, contextos delimitados y las relaciones entre ellos en un mapa de contextos. Por último, la Sección 5.8 se pregunta cuándo un monolito es la respuesta correcta, hasta dónde puede escalar y qué señales indican que ha llegado el momento de dividirlo, y ofrece una guía de decisión y una tabla comparativa de los estilos del capítulo.

Un ejemplo recurrente

Como en capítulos anteriores, a lo largo de todo el capítulo aparece una plataforma de reparto de comida: los clientes hacen pedidos a restaurantes, los repartidores los entregan y los pagos pasan por un proveedor externo. En la Sección 5.1 se clasifica según cuatro diseños candidatos; en la 5.2 es una aplicación web clásica en capas; en la 5.3 se convierte en ocho módulos con una regla de dependencia comprobada en la compilación; en la 5.4 sus eventos de pedidos fluyen por un pipeline hasta un almacén de datos, donde encontrar el cuello de botella es un cálculo resuelto paso a paso. Las secciones posteriores vuelven a la misma plataforma, con más detalle en el mapa de contextos de la Sección 5.7, para que los estilos se puedan comparar sobre un único sistema conocido y no sobre ejemplos de juguete sin relación entre sí.

La idea que debes llevarte

Si recuerdas una sola cosa de este capítulo, que sea esta: los límites dentro de un sistema importan más que los límites entre unidades de despliegue. Un monolito dividido por dominio, con API de módulo explícitas, un único propietario para cada tabla y reglas de dependencia comprobadas automáticamente, puede ser modificado de forma segura por varios equipos durante muchos años, y cualquier módulo puede convertirse más adelante en un servicio si de verdad lo necesita. Un conjunto de servicios que comparten una base de datos y llaman a las partes internas de los demás sigue siendo un único sistema enmarañado, ahora con fallos de red añadidos. Los estilos son herramientas para crear y conservar buenos límites; ninguno de ellos es un fin en sí mismo.

De ahí se derivan dos hábitos. Primero, elige el estilo más sencillo cuyas características satisfagan los requisitos arquitectónicamente significativos del sistema, y registra la elección y sus compromisos en un registro de decisiones. Segundo, haz cumplir las reglas del estilo con pruebas de arquitectura en la compilación, porque todo estilo se erosiona cuando sus restricciones solo viven en la cabeza de las personas.

Las 8 secciones

5.1 · Intermedio · 22 minEstilos y patronesEl vocabulario de los dos capítulos siguientes: estilos, patrones, tácticas y arquitecturas de referencia, el particionamiento técnico frente al particionamiento por dominio, el despliegue monolítico frente al distribuido y el cuanto de arquitectura.Leer →5.2 · Intermedio · 24 minEn capasEl estilo más conocido: capas de presentación, de negocio, de persistencia y de base de datos. Capas cerradas y abiertas, capas de aislamiento, el antipatrón del sumidero, por qué cada funcionalidad toca todas las capas y cómo hacer cumplir las reglas.Leer →5.3 · Intermedio · 26 minMonolito modularUna única aplicación desplegable dividida por dominio de negocio en módulos con API explícitas y sus propios datos. Cómo hacer cumplir los límites, cómo se comunican los módulos, qué aprendió Shopify y cómo conserva la opción de extraer servicios más adelante.Leer →5.4 · Intermedio · 23 minTuberías y filtrosDatos que fluyen por una cadena de pasos independientes: productores, transformadores, verificadores y consumidores unidos por tuberías. De las tuberías de Unix a ETL, los compiladores y el procesamiento de flujos, con el rendimiento (throughput), el back pressure y la gestión de errores.Leer →5.5 · Intermedio · 24 minMicrokernelCómo un sistema central pequeño más plug-ins independientes ofrece extensibilidad: registros, contratos, aislamiento y versionado, ejemplos reales de IDE y navegadores, y un contrato de plug-in desarrollado para reglas fiscales específicas de cada país.Leer →5.6 · Intermedio · 25 minHexagonal y limpiaPuertos y adaptadores, arquitectura de cebolla y limpia: mantener la lógica de negocio en el centro con las dependencias apuntando hacia dentro, puertos conductores y conducidos, un ejemplo en Python con un adaptador real y un doble de prueba, y los costos.Leer →5.7 · Intermedio · 26 minDiseño guiado por el dominioEncontrar límites en el dominio de negocio: lenguaje ubicuo, subdominios centrales, de soporte y genéricos, contextos delimitados, relaciones del mapa de contextos, event storming, agregados y un mapa de contextos de la plataforma de reparto de comida.Leer →5.8 · Intermedio · 24 minElegir un monolitoMonolithFirst, la prima de los microservicios y el monolito majestuoso; cuándo una sola unidad de despliegue es la opción correcta, hasta dónde escala un monolito, las señales de que ha llegado el momento de dividirlo y una guía de decisión para los estilos del Capítulo 5.Leer →

Prueba del capítulo

Comprueba lo que has entendido del capítulo 5

Opcional: 20 preguntas de opción múltiple y 2 respuestas escritas breves, elegidas de nuevo cada vez de un banco de 72 preguntas. Nota de aprobado: 80%. Superar todas las pruebas de capítulo y después la evaluación final da derecho al Certificado de Finalización Be Wise.

Haz la prueba del capítulo 5 en la app

Lecturas recomendadas