Marcio Cunha

Desacoplamiento de Dominios en Microservicios con Strangler Fig y Proxy Inverso

Aprenda a migrar sistemas heredados monolíticos a microservicios de forma segura utilizando el patrón Strangler Fig y enrutamiento dinámico con proxy inverso adaptativo.

Marcio Cunha•4 min
También disponible en:EnglishPortuguês
Resumen
  • El patrón Strangler Fig reemplaza gradualmente partes de un sistema monolítico antiguo por nuevos servicios independientes.
  • El proxy inverso actúa como un portero inteligente que redirige el tráfico de rutas específicas hacia los nuevos microservicios de forma transparente.
  • Las estrategias de enrutamiento basadas en encabezados HTTP permiten pruebas de carga en producción sin afectar a los usuarios habituales.
  • La replicación asíncrona de datos mitiga los problemas de inconsistencia transaccional temporal entre el monolito y los nuevos servicios.
  • El monitoreo continuo de latencia y tasas de error garantiza la reversibilidad inmediata en caso de fallas durante la migración.

El Desafío de los Sistemas Heredados y la Necesidad de Cambio

Muchas empresas crecen utilizando arquitecturas monolíticas, donde todo el código de un sistema vive en un único gran repositorio y se ejecuta como una aplicación unificada. En la práctica, esto significa que un error en una funcionalidad secundaria puede derribar todo el sistema, haciendo que las actualizaciones sean lentas y riesgosas. El desafío surge cuando este monolito se vuelve demasiado grande para mantenerse, exigiendo una transición hacia microservicios, que son pequeños servicios independientes enfocados en tareas específicas.

Reemplazar un sistema antiguo de golpe es un error clásico de ingeniería que suele fallar de forma catastrófica. Es el equivalente a cambiar el motor de un avión mientras vuela a velocidad de crucero sin poder aterrizar. Para evitar esta catástrofe, la ingeniería de software moderna ha adoptado enfoques incrementales que permiten la evolución continua de la arquitectura sin interrupción del negocio.

El Patrón Strangler Fig en la Práctica

El patrón Strangler Fig, inspirado en una planta parásita que envuelve árboles en el bosque hasta reemplazarlos, propone la sustitución gradual de un sistema heredado. En lugar de reescribir todo desde cero, el equipo crea nuevos microservicios junto al monolito antiguo y migra una funcionalidad a la vez. En la práctica, esto significa que el sistema antiguo sigue funcionando y atendiendo a la mayoría de los clientes mientras las nuevas piezas asumen responsabilidades específicas de forma aislada.

Este proceso reduce drásticamente el riesgo del proyecto, ya que el impacto de un error queda restringido a la funcionalidad que acaba de ser migrada. Si algo sale mal en el nuevo servicio, el alcance del problema es pequeño y fácil de aislar. Con cada nueva funcionalidad migrada, el sistema heredado se reduce orgánicamente hasta que el código antiguo puede ser apagado por completo y descartado sin dolor.

El Papel del Proxy Inverso Adaptativo

Para que el mundo externo no note que el sistema está siendo reconstruido desde adentro, se utiliza un componente llamado proxy inverso, que funciona como un portero inteligente en la entrada de la infraestructura. Intercepta todas las solicitudes que llegan de los usuarios y decide a dónde enviarlas basándose en reglas predefinidas. Un proxy inverso adaptativo va más allá del enrutamiento estático, ajustando el destino del tráfico de manera dinámica según métricas de salud, carga y versiones de software.

Cuando un cliente accede al sistema para consultar su perfil, por ejemplo, el proxy inverso verifica si el módulo de perfiles ya ha sido migrado al nuevo microservicio. Si la respuesta es afirmativa, el tráfico se dirige a la nueva API moderna. De lo contrario, la solicitud sigue siendo reenviada al monolito heredado, garantizando una transición totalmente imperceptible para quien está al otro lado de la pantalla.

Implementación de Enrutamiento Dinámico

En la capa de infraestructura, herramientas como Nginx o Caddy pueden configurarse para realizar este cambio de tráfico utilizando reglas basadas en rutas de URL o encabezados HTTP. A continuación, un ejemplo práctico de configuración en Nginx utilizando variables dinámicas para dirigir el tráfico según la presencia de una cookie de pruebas:

http {
upstream monolith {
server legacy-app.internal:8080;
}

upstream new_service {
server modern-service.internal:3000;
}

server {
listen 80;
server_name api.empresa.com;

location /api/v1/users {
# Si el usuario tiene una cookie de beta tester, va al microservicio
if ($cookie_beta_tester = "true") {
proxy_pass http://new_service;
break;
}

# De lo contrario, el valor predeterminado va al monolito heredado
proxy_pass http://monolith;
}
}
}

Este fragmento de código demuestra cómo aislar una ruta específica para pruebas controladas en producción. En la práctica, esto permite que los equipos de ingeniería validen el comportamiento del nuevo microservicio con un porcentaje real de usuarios reales antes de cambiar de ruta definitivamente para toda la base de clientes.

Estrategias de Consistencia de Datos y Migración

El mayor obstáculo en las migraciones a microservicios no es el código de la aplicación, sino la base de datos compartida. En el monolito, todas las tablas se comunican libremente entre sí, mientras que en los microservicios cada servicio posee su propia base de datos aislada. Para resolver esto durante la transición, se utiliza la replicación de datos en tiempo real o patrones como Outbox Pattern para sincronizar información entre la base de datos heredada y las nuevas.

Esta sincronización garantiza que, mientras el monolito y el microservicio coexisten, ambos tengan acceso a la información necesaria para operar sin corromper el estado del negocio. Cuando la migración de esa funcionalidad se considera estable y madura, se revoca el acceso directo a la base de datos heredada, completando otra etapa más del ciclo de estrangulamiento del sistema antiguo.

Consideraciones Finales

Desacoplar microservicios heredados utilizando el patrón Strangler Fig combinado con un proxy inverso adaptativo transforma un proyecto de alto riesgo en un viaje controlado e iterativo. La ingeniería moderna exige resiliencia y capacidad de entrega continua sin comprometer la operación actual. Al centrarse en migraciones granulares, enrutamiento inteligente y sincronización segura de datos, las organizaciones pueden modernizar su infraestructura técnica de forma sostenible, garantizando estabilidad para el negocio y agilidad para los desarrolladores.