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ítulosSolo 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í.
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
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 appLecturas recomendadas
- Fundamentals of Software Architecture (2nd edition), Mark Richards and Neal Ford (2025), O'Reilly Media. Un capítulo por estilo, incluidos el de capas, el monolito modular, el pipeline y el microkernel, cada uno con una valoración de sus características; el modelo de las comparaciones de este capítulo.
- Pattern-Oriented Software Architecture, Volume 1: A System of Patterns, Frank Buschmann, Regine Meunier, Hans Rohnert, Peter Sommerlad and Michael Stal (1996), John Wiley and Sons. El catálogo clásico de patrones arquitectónicos, incluidos Capas (Layers), Tuberías y filtros (Pipes and Filters) y Microkernel, cada uno con su contexto, sus fuerzas y sus consecuencias.
- An Introduction to Software Architecture, David Garlan and Mary Shaw (1994), Carnegie Mellon University, Software Engineering Institute (CMU/SEI-94-TR-021). El breve artículo que definió los estilos arquitectónicos como componentes, conectores y restricciones, con las tuberías y filtros y los sistemas en capas entre sus ejemplos.
- Software Architecture: The Hard Parts, Neal Ford, Mark Richards, Pramod Sadalage and Zhamak Dehghani (2021), O'Reilly Media. Desarrolla el cuanto de arquitectura y el análisis del acoplamiento y de la propiedad de los datos que decide por dónde se puede dividir un sistema.
- Monolith to Microservices, Sam Newman (2019), O'Reilly Media. Una guía equilibrada sobre cuándo, si conviene y cómo descomponer un monolito, con argumentos sólidos a favor del monolito modular.
- Domain-Driven Design: Tackling Complexity in the Heart of Software, Eric Evans (2003), Addison-Wesley. El origen de los contextos delimitados, los mapas de contextos y el lenguaje ubicuo que se usan para encontrar los límites de módulos y servicios.
- Hexagonal Architecture, Alistair Cockburn (2005), alistair.cockburn.us. La descripción original de puertos y adaptadores, breve y todavía la exposición más clara de la idea.
- Deconstructing the Monolith: Designing Software that Maximizes Developer Productivity, Kirsten Westeinde (2019), Shopify Engineering. Un relato de primera mano sobre cómo se convirtió una aplicación Rails muy grande en un monolito modular en lugar de en microservicios.