Saltar al contenido

Arquitectura del Sistema

Monolith, Modular Monolith, Microservices y SOA: cómo dividir y desplegar un sistema, con sus trade-offs reales en deployment, boundaries, escalabilidad y modelo de fallos — no una jerarquía donde una opción sea siempre mejor.

6 min. de lectura

La Arquitectura del Sistema cambia de escala. DDD nos ayuda a entender:

¿Cómo dividir conceptualmente el dominio?

Ahora preguntamos:

¿Cómo dividimos y desplegamos el sistema?

Las opciones principales son Monolith, Modular Monolith, Microservices y SOA.

Monolith

Un monolith tiene un único deployment unit principal:

Es importante separar dos ideas que suelen confundirse: Monolith ≠ Bad Architecture. Un monolith puede estar muy bien diseñado internamente. También puede escalar horizontalmente:

Ventajas

  • deployment simple;
  • debugging más sencillo;
  • menor latencia interna;
  • transacciones locales;
  • menor complejidad operativa.

Desventajas

  • todos los módulos comparten deployment;
  • scaling menos granular;
  • los boundaries internos pueden degradarse;
  • cambios en un módulo pueden afectar todo el deployment.

Modular Monolith

Mantiene un deployment, pero con boundaries internos claros:

Los módulos tienen una API interna explícita. La diferencia entre un buen y un mal modular monolith suele estar en esto:

El objetivo

Obtener alta modularidad, deployment sencillo y transacciones locales, sin pagar todavía el costo de la red, el estado distribuido y los fallos distribuidos.

Cuándo usarlo

Es especialmente apropiado cuando:

  • la aplicación es compleja;
  • hay dominios bien definidos;
  • el equipo todavía es relativamente pequeño;
  • no existe una necesidad clara de deployment independiente;
  • la distribución agregaría complejidad sin resolver un problema concreto.

Cuándo puede quedarse corto

Puede resultar insuficiente cuando:

  • determinados componentes necesitan escalar independientemente;
  • distintas partes tienen ciclos de deployment muy diferentes;
  • los equipos necesitan ownership y deployment autónomos;
  • hay razones de peso para aislar componentes;
  • existe una necesidad real de distribución.

Microservices

Una arquitectura de microservices distribuye el sistema en varios servicios autónomos:

Un servicio debería representar una business capability suficientemente cohesionada y tener un boundary claro. Microsoft recomienda utilizar domain analysis y bounded contexts como base para definir estos límites.

Ventajas

  • despliegue independiente
  • escalabilidad independiente
  • ownership
  • aislamiento potencial de fallos
  • autonomía tecnológica

Costos

La distribución introduce toda una nueva categoría de problemas: fallos de red, timeouts, reintentos, fallos parciales, distributed tracing, consistencia eventual, descubrimiento de servicios, sincronización de datos y complejidad de deployment.

Adoptar microservicios es también decidir asumir la complejidad de un sistema distribuido.

Un mal microservicio

No todo servicio pequeño es un buen microservicio:

Si una única operación simple requiere ocho network hops, probablemente la granularidad sea incorrecta. Microsoft también advierte sobre servicios excesivamente granulares, porque pueden aumentar la complejidad y degradar la performance.

SOA

Service-Oriented Architecture es una familia de arquitecturas orientadas a servicios, especialmente relevante en contextos enterprise. Un esquema clásico:

Históricamente, SOA estuvo asociado a la integración empresarial, la gobernanza centralizada, los ESB, la reutilización de servicios, la orquestación y la integración de sistemas heterogéneos.

Microservicios comparte algunos principios, pero suele enfatizar más la autonomía, el despliegue independiente, la responsabilidad descentralizada y los bounded contexts. No existe una frontera universalmente aceptada entre ambos.

Monolith vs. Modular Monolith vs. Microservices

MonolithModular MonolithMicroservices
DeploymentUnoUnoMúltiples
BoundariesPueden ser débilesFuertesDistribuidos
NetworkNo entre módulosNo entre módulos
ACID localSencilloSencilloLimitado entre services
ScalingGlobalGlobalIndependiente
OperacionesSimplesSimples/moderadasComplejas
Modelo de fallosPrincipalmente localPrincipalmente localDistribuido

No existe una jerarquía donde “Monolith → peor” y “Microservices → mejor”. Existe un conjunto diferente de trade-offs. Fowler destaca precisamente el costo adicional —el llamado Microservice Premium— asociado a operar una arquitectura distribuida.

Herramientas y tecnologías

Microservicios suele combinarse con Docker, Kubernetes, AWS ECS/EKS, Azure Kubernetes Service, service mesh, Kafka, REST/gRPC y distributed tracing. Pero ninguna de estas tecnologías convierte automáticamente una aplicación en una buena arquitectura de microservicios.

Referencias

Te sirvió, compartilo

// ¿te sirvió?
// compartilo