By: John Cortes – CEO & Jhoan Arias – CTO
Lucasian Labs S.A.S.
Las plataformas empresariales actuales, donde las grandes compañías realizan su operación de negocio y que son parte vital de la misma, requieren complejos sistemas de información. Sistemas construidos con múltiples módulos, cientos de formularios, miles de usuarios, transacciones medidas por segundo e infinidad de problemáticas de soporte y mantenimiento que atender, es un mundo difícil, de arduo trabajo, el de la computación empresarial.
Estas plataformas se construyen sumando muchas pequeñas partes. El código que modela las reglas de negocio, las formas que interactúan con el usuario, las consolas de procesos de ejecución nocturna, las librerías de apoyo sobre las que corre el sistema, los recursos visuales como imágenes, estilos, plantillas de documentos y otros muchos otros recursos que hacen parte del sistema.
Comúnmente, hasta ahora, estas plataformas se empaquetan, como un todo, en la arquitectura que llamamos en el medio como grandes monolitos, para darse una idea, es un gran archivo zip que en su interior amalgama los diferentes componentes del sistema y que se entrega al servidor para su publicación en el servidor que correrá el sistema; esto lo llamamos el despliegue de la plataforma y trae consigo otra serie de retos.
La problemática asociada a los despliegues es variada, es muy posible que durante el proceso de publicación se presente la indisponibilidad del sistema, tema incómodo que nadie desea y es lo que pasa cuando los bancos nos avisan que a tal hora, tal día el sistema no estará disponible. Un despliegue típico puede variar de uno a otro administrador y de la configuración del sistema incluye entre otras cosas: Borrar la carga anterior, cargar el paquete, ejecutar paquetes de actualización de bases de datos, reiniciar el sistema, realizar pruebas humo, volver a subir la plataforma y ahí estará de nuevo disponible; pueden pasar horas para este proceso completo, los grandes monolitos tienen ese problema.
«Hecha la ley, hecha la trampa». En informática, siempre estamos buscando solucionar este tipo de problemas. Por eso, las arquitecturas actuales están evolucionando hacia soluciones que eviten la indisponibilidad del sistema y sus problemas asociados. Una de las alternativas más aceptadas son las arquitecturas de Microservicios. Sin embargo, esta transición no es gratuita. Convertir los megamonolitos en microservicios es el próximo desafío y el enfoque principal de este artículo.
Por supuesto, como ocurre con todos los caminos maravillosos, también hay obstáculos. Una forma de aproximarse a esta transformación es ir transitando de los grandes monolitos a los micromonolitos, es decir, comenzar a recorrer el camino que finalmente nos llevará a los microservicios, que es nuestro destino final. Sin embargo, incluso los microservicios presentan sus propios problemas. En el resto del artículo, exploraremos qué nos depara este camino y cómo nos acercamos a él, pasando del gran monolito al micromonolito, hasta llegar a la implementación de microservicios.
En la actualidad, el despliegue de monolitos ha experimentado un cambio significativo en los últimos años. Tradicionalmente, los monolitos se desplegaban como aplicaciones de gran tamaño, donde todas las funcionalidades y componentes estaban integrados en un solo bloque de código. Sin embargo, esta aproximación ha mostrado limitaciones en términos de mantenimiento, escalabilidad y flexibilidad. Los monolitos suelen ser difíciles de mantener a medida que crecen en tamaño y complejidad. Cualquier cambio o actualización en una parte del sistema puede tener efectos inesperados en otras áreas, lo que dificulta la implementación ágil de mejoras y la resolución de problemas.
Además, la escalabilidad de los monolitos puede ser un desafío. Si una determinada funcionalidad requiere más recursos para manejar la carga, es necesario escalar todo el monolito, incluso las partes que no están experimentando una alta demanda. Esto puede resultar ineficiente y costoso en términos de recursos de hardware y rendimiento.
En cuanto a la flexibilidad, los monolitos suelen estar construidos utilizando un único lenguaje de programación y una única tecnología. Esto puede limitar las opciones de desarrollo y dificultar la adopción de nuevas tecnologías o la integración con sistemas externos que utilicen diferentes tecnologías.
Por lo anterior, se inicia una búsqueda de una transición gradual hacia arquitecturas más distribuidas, la aproximación de los micromonolitos como un paso intermedio entre los monolitos tradicionales y los microservicios. Los micromonolitos son monolitos más pequeños, donde se divide la aplicación en componentes más manejables y acotados. Esta aproximación tiene ventajas significativas, como una mayor modularidad y facilidad para el mantenimiento y escalabilidad. Al tener componentes más pequeños, los micromonolitos permiten un desarrollo más ágil, ya que los equipos pueden trabajar de manera independiente en cada componente. Además, ofrecen una mayor flexibilidad para escalar solo los módulos que experimentan una alta demanda, lo que mejora la eficiencia de recursos. Sin embargo, los micromonolitos aún presentan algunas desventajas, como la necesidad de coordinación entre los componentes y la complejidad adicional de gestionar múltiples módulos. A pesar de estas limitaciones, la aproximación de micromonolitos se considera una etapa intermedia valiosa en el camino hacia la adopción completa de arquitecturas de microservicios, ofreciendo beneficios tangibles mientras se prepara el terreno para una mayor modularidad y escalabilidad.
Y es en este punto donde héroe surge, el señor Microservicio, la solución maravillosa. Los microservicios se han convertido en una solución popular para superar las limitaciones de los monolitos. Esta arquitectura se basa en la construcción de aplicaciones como conjuntos de servicios independientes y altamente especializados. Cada microservicio se desarrolla y despliega de forma independiente, lo que permite una mayor flexibilidad y escalabilidad. Si se centra en la implementación y gestión de cada servicio de manera individual. Esto permite actualizar y desplegar servicios de forma independiente sin afectar al resto del sistema. Además, el uso de contenedores y herramientas de orquestación, como Docker y Kubernetes, simplifica aún más el proceso de despliegue y gestión de los microservicios.
Aunque la adopción de microservicios ofrece numerosos beneficios, también presenta desafíos significativos. Uno de ellos es el «millón de soluciones maravillosas». Al implementar una arquitectura basada en microservicios, cada servicio tiene su propia lógica de negocio, su propia base de datos y su propia interfaz de programación de aplicaciones (API). Esto puede llevar a una proliferación de servicios, lo que complica la gestión y el mantenimiento del sistema en su conjunto. Además, la comunicación entre los microservicios debe ser cuidadosamente gestionada para evitar una sobrecarga de red y asegurar un rendimiento óptimo.
Los riesgos de la multiplicación también deben tenerse en cuenta. A medida que se añaden más microservicios al sistema, la complejidad y la interdependencia entre ellos aumenta. Esto puede dificultar la resolución de problemas, el monitoreo y la depuración en comparación con un monolito más simple. La pérdida de control y monitoreo es otro desafío a considerar. Con un mayor número de servicios distribuidos, puede resultar más difícil tener una visibilidad completa del sistema en tiempo real. Esto puede dificultar la identificación y resolución de problemas, así como la realización de un seguimiento exhaustivo del rendimiento.
La logística del rompimiento también es una consideración importante. Migrar de un monolito a una arquitectura de microservicios implica un cambio significativo en la infraestructura y la lógica de la aplicación. Esto puede ser complejo y requerir una planificación cuidadosa para evitar interrupciones en la operación del sistema. Cambiar la llanta con el carro andando, como se suele decir, implica la necesidad de mantener la funcionalidad existente mientras se introduce gradualmente la nueva arquitectura.
Como menciona Martin Fowler, la adopción de sistemas basados en microservicios plantea diferentes retos en su operación. Uno de ellos es la necesidad de contar con habilidades de aprovisionamiento rápido de recursos, ya sea en entornos de nube o en infraestructuras locales. La capacidad de escalar y desplegar nuevos recursos de manera ágil y eficiente es fundamental para garantizar la disponibilidad y el rendimiento de los microservicios.
Además, se requieren esquemas de monitoreo adecuados para gestionar servicios distribuidos. Esto implica la recopilación y análisis de métricas de aplicación, redes y registros, así como la capacidad de trazar y enlazar una operación o transacción de un cliente a través de los diferentes microservicios que utiliza. El monitoreo efectivo es crucial para detectar y solucionar problemas de rendimiento, identificar cuellos de botella y garantizar la calidad del servicio.
Asimismo, es necesario adoptar prácticas de desarrollo ágil y contar con equipos de desarrollo enfocados en el producto. Los microservicios requieren una mentalidad centrada en la entrega de valor continuo, donde los equipos sean responsables de desarrollar, probar y desplegar sus propios servicios. Esto implica una colaboración estrecha entre los desarrolladores, los equipos de operaciones y otros stakeholders para garantizar la entrega exitosa de funcionalidades y la resolución ágil de problemas.
Finalmente, es importante reconocer la diferencia entre la teoría y la realidad en la implementación de microservicios. Si bien la idea de los microservicios suena prometedora y ofrece numerosas ventajas, en la práctica puede haber desafíos y obstáculos inesperados. La adaptación de los equipos de desarrollo y operaciones, la gestión de la complejidad y la garantía de la calidad del software son aspectos que deben abordarse de manera efectiva para lograr el éxito con los microservicios. En un próximo artículo abordaremos el arduo camino del proceso de migración y la solución a los retos que vimos en la implementación de microservicios.