Los monolitos y los microservicios son dos enfoques básicos para crear aplicaciones. Algunas personas los consideran heredados y modernos, respectivamente. Pero esto no es del todo correcto. Elegir entre ellos es una cuestión muy compleja, ya que ambos tienen sus pros y sus contras.
La mayoría de las aplicaciones nuevas no necesitan ser microservicios desde el principio. Es más rápido, más fácil y más barato empezar como un monolito y pasar a los microservicios más adelante si lo considera beneficioso.
Con el tiempo, a medida que las aplicaciones monolíticas se vuelven cada vez menos fáciles de mantener, algunos equipos deciden que la única forma de resolver el problema es comenzar a refactorizar dividiendo su aplicación en microservicios. Otros equipos toman esta decisión simplemente porque "los microservicios son geniales". Este proceso lleva mucho tiempo y, a veces, genera incluso más gastos de mantenimiento. Antes de comenzar, es fundamental considerar cuidadosamente todos los pros y contras y asegurarse de haber alcanzado los límites actuales de la arquitectura monolítica. Y recuerde, es más fácil romper que construir.
En este artículo, no vamos a comparar monolitos con microservicios. En cambio, analizaremos consideraciones, patrones y principios que le ayudarán a:
Lo primero que debes hacer es mirar la estructura de tu proyecto. Si no tienes módulos, te recomiendo encarecidamente que los consideres. No te obligan a cambiar tu arquitectura a microservicios (lo cual es bueno porque queremos evitar todo el mantenimiento correspondiente), pero te sacan muchas ventajas.
Según la herramienta de automatización de compilación de su proyecto (por ejemplo, Maven, Gradle u otra), puede dividir su proyecto en módulos separados e independientes. Algunos módulos pueden ser comunes a otros, mientras que otros pueden encapsular áreas de dominio específicas o ser específicos de una característica, lo que aporta funcionalidad independiente a su aplicación.
Te brindará los siguientes beneficios:
Como puede ver, el monolito modular es la forma de obtener lo mejor de ambos mundos. Es como ejecutar microservicios independientes dentro de un único monolito, pero evitando la sobrecarga de microservicios colaterales. Una de las limitaciones que puede tener es no poder escalar diferentes módulos de forma independiente. Tendrá tantas instancias de monolito como requiera el módulo más cargado, lo que puede generar un consumo excesivo de recursos. El otro inconveniente son las limitaciones de usar diferentes tecnologías. Por ejemplo, no puede mezclar Java, Golang y Python en un monolito modular, por lo que se ve obligado a ceñirse a una tecnología (lo que, por lo general, no es un problema).
Piense en el patrón Strangler Fig. Su nombre se debe a un árbol que envuelve y eventualmente reemplaza a su anfitrión. De manera similar, el patrón sugiere que reemplace partes de una aplicación heredada con nuevos servicios uno por uno, modernizando un sistema antiguo sin causar interrupciones significativas.
En lugar de intentar una revisión arriesgada y completa, se actualiza el sistema pieza por pieza. Este método es beneficioso cuando se trata de monolitos grandes y complejos que son demasiado difíciles de manejar para reemplazarlos en un solo esfuerzo. Al adoptar el patrón de la higuera estranguladora, los equipos pueden eliminar gradualmente el sistema antiguo mientras fomentan el crecimiento del nuevo, minimizando los riesgos y asegurando la entrega continua de valor.
Para implementar el patrón Strangler Fig, debes seguir tres pasos:
Siguiendo estos tres pasos, irás descomponiendo gradualmente un monolito en microservicios.
Los principales beneficios de utilizar el patrón Strangler Fig son:
Al aplicar el patrón Strangler Fig, se debe planificar la estrategia de migración con cuidado. Esto incluye identificar qué componentes reemplazar primero, garantizar la integración adecuada entre las piezas antiguas y las nuevas y mantener modelos de datos consistentes. Los equipos también deben establecer canales de comunicación claros y sistemas de monitoreo para realizar un seguimiento del progreso y el impacto de cada reemplazo.
Como ya comentamos antes, la transición a los microservicios trae consigo beneficios, pero también dificulta y encarece muchas otras cosas.
Por ejemplo, los equipos de control de calidad y desarrollo pueden enfrentarse a una situación en la que ya no pueden realizar pruebas en máquinas locales porque la capacidad de ejecutar varios microservicios localmente es limitada. O sus registros pueden volverse menos reveladores porque, en lugar de que un servicio procese un solo flujo, ahora lo procesan varios servicios. Como resultado, para ver la secuencia de registros completa, debe implementar la instrumentación y el seguimiento adecuados.
Analicemos algunos aspectos cruciales que debe considerar y tal vez planificar antes de que comience su transformación de microservicios.
Los monolitos y los microservicios tienen diferentes requisitos mínimos de infraestructura.
Al ejecutar una aplicación monolítica, normalmente se puede mantener una infraestructura más sencilla. Las opciones como máquinas virtuales o soluciones PaaS (como AWS EC2) serán suficientes. Además, se puede gestionar gran parte del escalado, la configuración, las actualizaciones y la supervisión de forma manual o con herramientas sencillas. Como resultado, se pueden evitar configuraciones de infraestructura complejas y confiar en desarrolladores o ingenieros de soporte sin necesidad de una amplia experiencia en DevOps.
Sin embargo, la adopción de una arquitectura de microservicios cambia esta dinámica. A medida que aumenta la cantidad de servicios, un enfoque manual y práctico rápidamente se vuelve impráctico. Para orquestar, escalar y administrar de manera eficaz múltiples servicios, necesitará plataformas especializadas como Kubernetes o, al menos, un servicio de contenedores administrado, lo que introduce una nueva capa de complejidad y demandas operativas.
Mantener una aplicación monolítica es relativamente sencillo. Si surge un error CVE, se actualiza la dependencia afectada en un solo lugar. ¿Necesita estandarizar la comunicación de servicios externos? Implemente un único contenedor y reutilícelo en todo el código base.
En un entorno de microservicios, estas tareas sencillas se vuelven mucho más complejas. Lo que antes era trivial ahora implica coordinar cambios entre múltiples servicios independientes, cada uno con su ciclo de vida y dependencias. La complejidad añadida aumenta los costos tanto en tiempo como en recursos. Y la situación empeora cuando se tienen muchos equipos y muchos servicios diferentes.
Por lo tanto, muchas organizaciones introducen una capa de plataforma dedicada, generalmente administrada por un equipo de plataforma. El objetivo es crear una base que todos los microservicios puedan heredar: administrar dependencias comunes, implementar patrones estandarizados y proporcionar contenedores listos para usar. Al unificar estos elementos a nivel de plataforma, se simplifica significativamente el mantenimiento y se fomenta la coherencia en todo el sistema.
Dividir un monolito en microservicios es una transformación arquitectónica significativa que requiere una cuidadosa consideración y planificación.
En este artículo, analizamos los pasos que puede seguir para prepararse y atravesar el proceso sin problemas. Si se atiene al patrón Strangler Fig, podrá realizar el proceso incremental y garantizar la estabilidad del sistema durante toda la transformación. Además, el monolito modular no solo puede ser un paso de preparación útil, sino que también puede aportar beneficios que pueden impulsarlo a reconsiderar su decisión de transformación de microservicios y evitar la complejidad operativa correspondiente.