Skip to main content

Arquitectura modular monolítica

La Arquitectura Modular Monolítica es una forma de estructurar aplicaciones grandes dentro de un único despliegue (monolito), pero dividida internamente en módulos independientes, cada uno responsable de una parte del dominio. Es un punto intermedio entre un monolito tradicional (acoplado) y una arquitectura basada en microservicios.

Características

CaracterísticaDescripción
MonolitoSe ejecuta y despliega como una sola unidad
ModularLa lógica está separada en módulos bien definidos
Bajo acoplamientoLos módulos interactúan mediante interfaces o contratos
Alta cohesiónCada módulo tiene control total sobre su lógica y sus datos
Facilidad para escalarPermite extraer módulos a microservicios en el futuro
Útil para equipos pequeñosReduce la complejidad de los despliegues múltiples

¿Cuándo usarla?

  • Cuando se quiere evitar la complejidad de los microservicios.
  • En proyectos con varios dominios funcionales (ej. estudiantes, cursos, pagos).
  • Para empezar con una base escalable desde el primer día.

Ejemplo modular

Supongamos que estamos creando un sistema educativo con los módulos:

  • Students
  • Courses
  • Teachers

En NestJS, al momento de organizar nuestro proyecto para tener una estructura modular haremos:

src/
├── main.ts
├── app.module.ts
├── modules/
│ ├── students/
│ │ ├── application/
│ │ ├── domain/
│ │ ├── infrastructure/
│ │ └── student.module.ts
│ ├── courses/
│ │ ├── application/
│ │ ├── domain/
│ │ ├── infrastructure/
│ │ └── course.module.ts
│ └── teachers/
│ │ ├── application/
│ │ ├── domain/
│ │ ├── infrastructure/
│ │ └── teacher.module.ts

En este caso los módulo se importan en AppModule. Si necesitan comunicarse, lo hacen mediante interfaces o servicios exportados, no accediendo directamente a clases internas.

Tomemos como ejemplo el módulo de estudiantes, la forma en que trabajará será la siguiente:

Cuando pasamos al frontend, podemos trabajar la organización modular de la siguiente manera:

src/app/
├── core/ → servicios globales (auth, logging)
├── shared/ → componentes reutilizables
├── features/
│ ├── students/
│ │ ├── domain/
│ │ ├── application/
│ │ ├── infrastructure/
│ │ └── ui/
│ ├── courses/
│ │ ├── domain/
│ │ ├── application/
│ │ ├── infrastructure/
│ │ └── ui/
│ └── teachers/
│ │ ├── domain/
│ │ ├── application/
│ │ ├── infrastructure/
│ │ └── ui/

Cada "feature module" tiene su propio dominio, lógica y presentación, siguiendo Clean Architecture internamente.

Principios recomendados

PrincipioAplicación
ModularizaciónSeparación de responsabilidades por dominios funcionales
Single ResponsibilityCada módulo tiene una única razón para cambiar
Open/ClosedLos módulos pueden extenderse sin modificarse entre sí
Bajo acoplamientoComunicación a través de interfaces/exportaciones controladas
Clean ArchitectureCada módulo puede aplicar sus propias capas internas

Referencias

  • Martin, R. C. (2018). Clean Architecture: A Craftsman's Guide to Software Structure and Design. Pearson.
  • Khononov, M. (2021). Learning Domain-Driven Design: Aligning Software Architecture and Business Strategy. O’Reilly.
  • Modules - NestJS Documentation
  • Feature Modules - Angular Docs
  • Richardson, C. (2019). Microservices Patterns. Manning.