Tema 2

2. Monolito, microservicios y criterios de descomposición segura

Elegir entre monolito y microservicios no es una decisión ideológica. Es una decisión de arquitectura. Una mala descomposición puede crear más riesgo, más complejidad y menos control que el sistema original. Por eso hay que entender cuándo conviene dividir, cómo hacerlo y qué señales indican que la partición es segura y sostenible.

Objetivo Distinguir cuándo un monolito sigue siendo válido
Enfoque Diseño, límites y riesgo
Resultado Evaluar descomposiciones más seguras

2.1 Introducción

Uno de los errores más frecuentes en arquitectura de software es asumir que los microservicios son la evolución natural y obligatoria de cualquier sistema. En la práctica, muchos sistemas funcionan mejor como monolitos bien diseñados que como plataformas distribuidas prematuras.

El problema no es el monolito en sí. El problema es el monolito mal estructurado, difícil de mantener, sin límites claros y con dependencias internas desordenadas. Del mismo modo, el microservicio no es una solución mágica: si se fragmenta un sistema sin criterio, se reemplaza complejidad interna por complejidad distribuida.

Por eso este tema se centra en comparar ambos enfoques y en establecer criterios de descomposición segura. La pregunta no es solo cómo dividir, sino cuándo dividir y qué consecuencias técnicas, operativas y de seguridad trae esa decisión.

2.2 Qué es un monolito

Un monolito es una aplicación que se construye, despliega y ejecuta como una sola unidad. Puede tener módulos internos y capas bien separadas, pero desde el punto de vista operativo se trata como un sistema único.

Esto no implica necesariamente mala arquitectura. Un monolito puede ser limpio, modular, mantenible y perfectamente adecuado para muchos contextos. De hecho, para equipos pequeños o productos en etapa inicial suele ser la opción más pragmática.

Monolito no es sinónimo de sistema obsoleto. Muchas veces es la forma más simple, más económica y más segura de arrancar.

2.3 Qué es un microservicio en términos prácticos

Un microservicio es una unidad desplegable con responsabilidad bien delimitada, interfaz explícita y autonomía razonable para evolucionar. Se comunica con otros servicios por red y forma parte de un sistema mayor.

En términos prácticos, un microservicio introduce separación técnica y operativa. Esa separación permite mayor independencia, pero también exige más disciplina: versionado de contratos, observabilidad, autenticación entre servicios, políticas de red, manejo de secretos y tolerancia a fallos.

Aspecto Monolito Microservicios
Despliegue Una sola unidad Múltiples unidades independientes
Comunicación Llamadas internas en memoria Llamadas remotas por red o mensajería
Complejidad operativa Menor al inicio Mayor desde etapas tempranas
Escalado Generalmente conjunto Puede ser selectivo por servicio
Superficie de ataque Más concentrada Más distribuida y extensa

2.4 Cuándo un monolito sigue siendo la mejor opción

En muchos casos un monolito es suficiente y conveniente. Si el equipo es pequeño, el dominio aún está cambiando mucho, el producto no tiene necesidades extremas de escalado y la velocidad de coordinación es alta, separar demasiado temprano puede ser un error.

  • Cuando todavía se está descubriendo el dominio y los límites cambian con frecuencia.
  • Cuando la carga del sistema no justifica escalado independiente.
  • Cuando el equipo no tiene madurez operativa para manejar plataformas distribuidas.
  • Cuando conviene priorizar simplicidad, velocidad de iteración y costo bajo.
  • Cuando la seguridad y la observabilidad serían más difíciles de sostener si se multiplica la cantidad de componentes.

2.5 Cuándo los microservicios empiezan a tener sentido

Los microservicios empiezan a justificarse cuando existen necesidades reales que no se resuelven bien dentro de un único despliegue. No se trata solo de que el sistema sea grande, sino de que sus partes tengan ritmos, demandas o responsabilidades suficientemente distintos.

  • Distintos equipos necesitan desplegar de forma independiente y frecuente.
  • Algunas capacidades requieren escalado muy diferente del resto.
  • Existen dominios de negocio relativamente estables y separables.
  • Los tiempos de cambio en el monolito empiezan a frenar a la organización.
  • La plataforma ya cuenta con automatización, observabilidad y control operativo suficientes.

Incluso en estos escenarios, la transición debe ser gradual. Un cambio total y abrupto casi siempre incrementa riesgo técnico y riesgo de seguridad.

2.6 Riesgos de una descomposición apresurada

Descomponer demasiado pronto puede empeorar el sistema. Lo que antes era una llamada de función pasa a ser una llamada remota; lo que antes era una transacción local pasa a requerir coordinación distribuida; lo que antes era un único punto de autenticación pasa a necesitar múltiples controles de identidad y autorización.

  • Aumento artificial del número de servicios sin límites claros.
  • Acoplamiento distribuido: servicios pequeños pero fuertemente dependientes entre sí.
  • Complejidad operativa sin beneficios reales de negocio.
  • Duplicación de datos, lógica o credenciales en múltiples componentes.
  • Pérdida de trazabilidad y mayor dificultad para investigar incidentes.
Un sistema mal dividido no deja de estar acoplado. Solo cambia el lugar donde aparece el acoplamiento.

2.7 Criterios de descomposición segura

Una descomposición segura no busca generar la mayor cantidad posible de servicios, sino separar capacidades de manera que el sistema conserve claridad, control y resiliencia.

  • Alta cohesión: cada servicio debe agrupar responsabilidades relacionadas.
  • Bajo acoplamiento: debe minimizar dependencias innecesarias con otros servicios.
  • Límites de negocio claros: la separación debe responder a capacidades entendibles.
  • Aislamiento de fallos: un problema local no debería propagarse fácilmente.
  • Límites de acceso claros: cada servicio debe exponer solo lo necesario.
  • Ownership definido: debe quedar claro qué equipo es responsable de cada componente.

2.8 Cohesión y acoplamiento

La cohesión indica cuán relacionadas están entre sí las responsabilidades dentro de un componente. El acoplamiento indica cuánto depende ese componente de otros para cumplir su función. Una buena arquitectura busca alta cohesión y bajo acoplamiento.

Si una funcionalidad necesita consultar constantemente múltiples servicios para hacer una tarea simple, probablemente la partición no sea buena. Si un servicio contiene responsabilidades demasiado heterogéneas, probablemente sigue siendo demasiado grande o mal delimitado.

Señal Interpretación Riesgo
Muchas llamadas para una sola operación Acoplamiento excesivo entre servicios Más latencia, más fallos parciales y más exposición
Un servicio maneja demasiados procesos distintos Baja cohesión Límites difusos y permisos más amplios de lo necesario
Cambios coordinados frecuentes entre varios servicios Dependencias mal separadas Despliegues riesgosos y menor autonomía real

2.9 Bounded contexts y límites funcionales

Una de las ideas más útiles para descomponer sistemas es la de bounded context: un límite dentro del cual un modelo de negocio tiene sentido consistente. No todos los conceptos significan lo mismo en todas las partes del sistema, y forzar un modelo único suele generar acoplamiento innecesario.

Cuando la descomposición sigue bounded contexts razonables, cada servicio o grupo de servicios puede mantener reglas, datos y vocabulario propios sin contaminar el resto del sistema. Esto mejora claridad y también seguridad, porque ayuda a definir permisos, ownership y flujos de información más explícitos.

2.10 Datos y descomposición

Uno de los puntos más delicados al separar un sistema es decidir qué pasa con los datos. Si todos los servicios comparten la misma base de datos y escriben sobre las mismas tablas, la independencia será limitada y la seguridad más difícil de gestionar.

  • Cada servicio debería controlar su propio modelo de datos o al menos su propio acceso.
  • El acceso cruzado directo a bases ajenas debe evitarse siempre que sea posible.
  • La integración entre dominios debe ocurrir por contratos, eventos o APIs claras.
  • Los permisos sobre datos deben reflejar el límite real del servicio.

Compartir datos sin reglas claras rompe encapsulamiento, dificulta auditoría y amplía el impacto de una intrusión o de un error operativo.

2.11 Descomposición segura y seguridad de acceso

Una buena partición también ayuda a la seguridad. Si los límites están claros, resulta más fácil definir qué identidades pueden hablar con qué servicios, qué datos necesita cada componente y qué accesos sobran.

  • Servicios con responsabilidades acotadas tienden a requerir permisos más específicos.
  • Límites funcionales claros facilitan autorización contextual.
  • Aislamiento de datos reduce impacto de fuga o compromiso.
  • Menos dependencias directas significan menos caminos para movimiento lateral.
Una buena descomposición no solo mejora mantenibilidad. También facilita aplicar mínimo privilegio de forma realista.

2.12 Anti patrones frecuentes

No toda fragmentación produce microservicios sanos. Existen anti patrones que suelen aparecer cuando se adopta el estilo por presión organizativa o por seguir modas tecnológicas.

  • Monolito distribuido: muchos servicios, pero fuertemente dependientes y coordinados.
  • Nano servicios: componentes demasiado pequeños, con bajo valor y alto costo operativo.
  • Base de datos compartida: separación aparente en código, pero sin independencia real.
  • Integración implícita: contratos mal definidos y conocimiento tácito entre equipos.
  • Permisos excesivos: cuentas técnicas compartidas o accesos amplios por comodidad.

2.13 Señales de que la descomposición va bien

  • Los equipos pueden desplegar servicios concretos sin coordinar todo el sistema.
  • Los contratos entre servicios son claros, estables y observables.
  • Los permisos de cada componente son específicos y comprensibles.
  • Los fallos se aíslan mejor y la investigación de incidentes es más precisa.
  • Las necesidades de escalado son diferentes y se resuelven sin duplicar toda la plataforma.

2.14 Señales de que la descomposición fue mala

  • Cada cambio de negocio obliga a tocar muchos servicios a la vez.
  • La latencia y los timeouts aumentan por encadenamiento innecesario de llamadas.
  • Los servicios comparten demasiados datos, librerías internas o secretos.
  • El equipo necesita acceso amplio a casi todo para poder operar.
  • La plataforma requiere mucho esfuerzo, pero no entrega mayor velocidad ni control.

2.15 Estrategia de transición

Cuando existe un monolito heredado, lo más prudente suele ser una transición incremental. En lugar de reescribir todo, conviene identificar capacidades con límites razonables, extraerlas de forma gradual y validar que la operación, la observabilidad y la seguridad acompañen esa evolución.

  1. Entender el dominio y mapear capacidades de negocio.
  2. Detectar puntos de dolor reales: escalado, despliegues, ownership, riesgo.
  3. Elegir una capacidad candidata con límites relativamente claros.
  4. Extraer con contratos explícitos y controles de acceso desde el inicio.
  5. Medir si la separación mejoró autonomía, seguridad y operación.

2.16 Qué debes recordar de este tema

  • Monolito y microservicios son opciones válidas en contextos distintos.
  • El objetivo no es fragmentar más, sino diseñar límites mejores.
  • Una descomposición segura busca alta cohesión, bajo acoplamiento y ownership claro.
  • La separación de datos, permisos y contratos es clave para independencia real.
  • Una mala partición incrementa complejidad operativa y superficie de ataque.

2.17 Conclusión

Antes de construir una plataforma de microservicios hay que demostrar que el sistema necesita esa complejidad y que existen límites funcionales suficientemente claros para sostenerla. La arquitectura segura no premia la fragmentación indiscriminada. Premia las decisiones que mejoran control, claridad, resiliencia y capacidad de evolución.

En el próximo tema estudiaremos dominios, bounded contexts y diseño orientado a capacidades para profundizar cómo se identifican límites arquitectónicos sólidos.