Skip to content

La evolución de monolito a microservicios

Prefacio

Ninguna arquitectura es "la mejor", solo "la más adecuada para la etapa actual". La transición de monolito a microservicios no es un salto que se hace de una vez, sino un proceso gradual a medida que crecen la escala del negocio y la del equipo. Dividir en microservicios demasiado pronto es tan peligroso como hacerlo demasiado tarde.

¿Qué aprenderás en este artículo?

Después de completar este capítulo, podrás:

  • Ruta de evolución: Comprender las cuatro etapas de monolito a microservicios
  • Momento adecuado para dividir: Saber cuándo conviene dividir y cuándo no
  • Estrategias de división: Dominar la metodología de división por dominios de negocio
  • Patrones de comunicación: Conocer las opciones de comunicación sincrónica y asincrónica entre servicios
  • División de datos: Entender los desafíos y las soluciones de la división de bases de datos
CapítuloContenidoConcepto clave
Cap. 1Ruta de evolución arquitectónicaMonolito → Monolito modular → SOA → Microservicios
Cap. 2Momento y principios de la divisiónLey de Conway, autonomía del equipo
Cap. 3Estrategias de divisiónContextos delimitados de DDD, patrón Strangler Fig
Cap. 4Comunicación entre serviciosREST, gRPC, colas de mensajes
Cap. 5División de datosDivisión de bases de datos, sincronización de datos

1. Ruta de evolución arquitectónica

La evolución arquitectónica no está impulsada por la tecnología, sino por la escala organizacional. Cuando un equipo crece de 5 a 500 personas, la eficiencia de colaboración en una arquitectura monolítica disminuye drásticamente.

EtapaArquitecturaTamaño del equipoCaracterísticas
InicioAplicación monolítica1~10 personasTodo el código en un proyecto, despliegue simple
CrecimientoMonolito modular10~50 personasCódigo organizado por módulos, pero se despliega junto
ExpansiónSOA (Arquitectura orientada a servicios)50~200 personasDivisión en servicios de grano grueso por línea de negocio
EscalaMicroservicios200+ personasServicios de grano fino, cada equipo desarrolla y despliega de forma independiente
Architecture Evolution Path
Click each stage to inspect its architecture characteristics
1
Monolithic architecture
2
Modular monolith
3
Service-oriented architecture
4
Microservices architecture
Monolithic architecture
All features are packaged in one application and share one database. It is simple and suitable for early rapid iteration.
User module
Order module
Payment module
Product module
Monolith app (one process)
MySQL
Suitable scale:Team < 10 people, DAU < 100k
Core challenge:Code is tightly coupled; a bug in one module may bring down the whole system

Ley de Conway

"Las organizaciones que diseñan sistemas producen arquitecturas que reflejan sus estructuras de comunicación." — Melvin Conway

En pocas palabras: si 3 equipos construyen un sistema, al final habrá 3 servicios. La esencia de la división arquitectónica es la división organizacional.

Ley inversa de Conway: Dado que la estructura organizacional determina la arquitectura del sistema, si quieres una arquitectura específica, primero ajusta la estructura organizacional en consecuencia. Por ejemplo, si quieres un servicio de pagos independiente, primero forma un equipo de pagos independiente. Muchas empresas fracasan en su división en microservicios no por problemas técnicos, sino porque la organización no se adaptó.


2. ¿Cuándo conviene dividir en microservicios?

No todos los sistemas necesitan microservicios. Dividir demasiado pronto introduce complejidad innecesaria.

SeñalDescripciónRecomendación
Conflictos de despliegue frecuentesMúltiples equipos modifican el mismo repositorio de código con conflictos constantesConsiderar división
Un módulo necesita escalado independienteEl módulo de búsqueda necesita 10 veces más recursos que los demásConsiderar división
Necesidad de diferenciación del stack tecnológicoEl módulo de IA usa Python, el sitio principal usa JavaConsiderar división
Equipo < 10 personasEl costo de comunicación es bajo, un monolito es suficienteNo dividir
El negocio aún está en fase de exploraciónLos requisitos cambian rápido, los límites no están clarosNo dividir
No hay capacidad de DevOpsNo hay CI/CD, contenedores ni sistema de monitoreoNo dividir

3. Estrategias de división

3.1 División por dominio de negocio (Contextos delimitados de DDD)

Los contextos delimitados (Bounded Context) del DDD (Diseño Dirigido por el Dominio) son el mejor principio rector para dividir microservicios. Cada contexto delimitado corresponde a un dominio de negocio independiente, con su propio modelo de datos y reglas de negocio.

¿Qué es un contexto delimitado? La misma palabra tiene significados diferentes en distintos dominios de negocio. Por ejemplo, "usuario" en el dominio de usuarios se refiere a la información de registro (nombre, email); en el dominio de pedidos se refiere al comprador (dirección de envío, método de pago); en el dominio de recomendaciones se refiere al perfil de comportamiento (historial de navegación, etiquetas de preferencia). Un contexto delimitado traza un límite dentro del cual la terminología y los modelos tienen un significado claro y unificado.

┌─────────────┐  ┌─────────────┐  ┌─────────────┐
│  Dominio de  │  │  Dominio de  │  │  Dominio de  │
│   usuarios   │  │   pedidos    │  │    pagos     │
│             │  │             │  │             │
│ User        │  │ Order       │  │ Payment     │
│ Profile     │  │ OrderItem   │  │ Refund      │
│ Address     │  │ Cart        │  │ Transaction │
│             │  │             │  │             │
│ Servicio de │  │ Servicio de  │  │ Servicio de │
│  usuarios   │  │   pedidos    │  │    pagos    │
└──────┬──────┘  └──────┬──────┘  └──────┬──────┘
       │                │                │
       └──── API calls / comunicación por eventos ────┘
Contexto delimitadoEntidades principalesServicio correspondiente
Dominio de usuariosUser, Profile, AddressServicio de usuarios
Dominio de productosProduct, Category, SKUServicio de productos
Dominio de pedidosOrder, OrderItemServicio de pedidos
Dominio de pagosPayment, RefundServicio de pagos
Dominio de logísticaShipment, TrackingServicio de logística

3.2 Patrón Strangler Fig

No reescribas todo el monolito de una vez; en su lugar, como una higuera estranguladora, reemplaza gradualmente los módulos antiguos con servicios nuevos:

  1. Crear un servicio nuevo fuera del monolito
  2. A través de una capa de proxy, dirigir parte del tráfico al servicio nuevo
  3. Una vez verificado que el servicio nuevo es estable, migrar gradualmente más tráfico
  4. Finalmente reemplazar por completo el módulo antiguo

4. Patrones de comunicación entre servicios

MétodoProtocoloCaracterísticasEscenarios aplicables
RESTHTTP/JSONSimple y universal, buen ecosistemaAPIs externas, operaciones CRUD
gRPCHTTP/2 + ProtobufAlto rendimiento, tipado fuerteLlamadas de alta frecuencia entre servicios internos
Cola de mensajesAMQP/KafkaDesacoplamiento asíncrono, recorte de picosNotificaciones de eventos, tareas asíncronas
GraphQLHTTP/JSONEl cliente consulta solo lo que necesitaCapa BFF, aplicaciones móviles

Elección entre sincrónico y asíncrono

  • Se necesita el resultado inmediatamente → Sincrónico (REST/gRPC)
  • No se necesita el resultado inmediatamente → Asíncrono (cola de mensajes)
  • Un evento dispara múltiples acciones → Asíncrono (publicar-suscribir)

Regla práctica: usa asíncrono siempre que sea posible. Cuanto más larga sea la cadena de llamadas sincrónicas, más frágil será el sistema.


5. División de datos: la parte más difícil

Lo más doloroso de la división en microservicios no es la división del código, sino la división de la base de datos. Cada servicio debería tener su propia base de datos, pero esto significa que las consultas entre servicios se vuelven difíciles.

DesafíoDescripciónSolución
JOIN entre serviciosNo se puede hacer JOIN directamente entre tablas de dos serviciosConsultas compuestas via API, redundancia de datos
Transacciones distribuidasLas transacciones entre bases de datos no se pueden resolver con transacciones localesSaga, tabla de mensajes local
Consistencia de datosLos datos de múltiples servicios pueden estar temporalmente inconsistentesConsistencia eventual, diseño basado en eventos
Migración de datosDesde una base de datos compartida a bases de datos independientesTransición con doble escritura, herramientas de sincronización

Resumen

La transición de monolito a microservicios es un proceso gradual, no una revolución de la noche a la mañana.

Repaso de los puntos clave de este capítulo:

  1. Ruta de evolución: Monolito → Monolito modular → SOA → Microservicios; cada paso tiene un impulsor claro
  2. Momento de la división: El tamaño del equipo, los conflictos de despliegue y las necesidades de escalado son señales para dividir
  3. Estrategias de división: Usar contextos delimitados de DDD para guiar la división y el patrón Strangler Fig para la migración gradual
  4. Elección de comunicación: Usar asíncrono siempre que sea posible; la cadena de llamadas sincrónicas debe ser lo más corta posible
  5. División de datos: Lo más difícil pero lo más importante; aceptar la consistencia eventual es el cambio de mentalidad clave

Lecturas complementarias