Altran360

El blog de innovación y tecnología de Altran España

¿Módulos o microservicios?

| 0 Comentarios

“La tendencia son los microservicios”

Todo el mundo habla de microservicios, pero ¿qué son?

Microservicios

Vamos a aclarar algún concepto antes. Tradicionalmente el diseño de aplicaciones se ha realizado en forma de monolitos, el código se implementaba acoplado y se desplegaba de manera fácil y rápida. Esto, a largo plazo se ha visto que genera el famoso código denominado “spaghetti code” y no es escalable, al menos de manera casi lineal y, si escalaba, era muy costoso.

Con el tiempo, grandes empresas como Netflix, Amazon, Ebay… han tenido que buscar la manera de escalar sus sistemas de manera lineal (o casi) debido a la criticidad de su negocio y la solución ha sido separar el sistema en varios subsistemas. Se han creado así, los microservicios. La idea principal de este enfoque es que dividir los sistemas en partes individuales permite tratar y abordar los problemas de manera más sencilla y acotada sin afectar al resto de partes.

Ventajas

Escalabilidad

Con el aumento de usuarios en internet, el crecimiento de los servicios de diferentes tipos y la globalización general, se ha llegado a la necesidad imperiosa de buscar maneras de escalar que sean casi lineales. A diferencia de los monolitos, donde debes escalar toda la aplicación para soportar picos en una funcionalidad concreta, con los microservicios puedes escalar partes de manera independiente al resto, por lo cual ajustas la infraestructura a las necesidades concretas del momento sin sobre dimensionar como con los monolitos.

Modularidad

Cada microservicio debe realizar una función acotada (pensemos en casos de uso). En una aplicación como un e-commerce, los usuarios del sistema se gestionarían desde un microservicio, los artículos de compra desde otro, y así sucesivamente para desacoplar funcionalidades. Esto obliga a los desarrolladores a hacer un código más aislado, limpio y mantenible, en definitiva aplica el patrón chain of responsability, entre otros. Es importante encontrar el punto adecuado para definir microservicios y no caer en la trampa o antipatrón de nanoservicios… ¡Pequeños pero lo justo!

Tecnologías

En cuanto a tecnologías, tenemos la ventaja también de utilizar la tecnología más adecuada para cada funcionalidad. Es posible que algunos microservicios sean Java y otros estén en NodeJS u otros. Nos permite adecuar funcionalidades a la tecnología que mejor aplica o mejor rendimiento nos da.

Desventajas

Complejidad

Articular un sistema de microservicios añade gran complejidad a tener en cuenta que no se tiene con un monolito. De entrada, requiere de:

  • Service discovery que tenga una visión general de todos los microservicios y sea el orquestador del sistema
  • Comunicación entre microservicios y gestión de posibles fallos en alguno de ellos.
  • Despliegues distribuidos que en productos grandes y muy evolucionados puede llegar a ser difícil de gestionar.
  • Transaccionalidad eventual entre microservicios.
  • Configuración distribuida (claves, certificados, …)
  • Testing complejo

Gestión de trazas

Implementar una arquitectura de microservicios obliga a disponer de una centralización de trazas y herramientas avanzadas de procesamiento de información del sistema que permita gestionar, controlar y administrar la plataforma. Herramientas como ELK, Zipkin, … están enfocadas a solucionar estos problemas.

Despliegues

En cuanto a los despliegues, es importante tener en cuenta que, al separar una aplicación en pequeñas partes, éstas tendrán un startup mucho más rápido, pero al ser un sistema distribuido es más complejo de administrar, ya que por lo general cada microservicio irá evolucionando de manera independiente y podemos llegar a tener que mantener varias versiones del mismo microservicio y debe funcionar de manera independiente al resto.

Pero, un momento,… ¿por qué no todo el mundo desarrolla con microservicios? Hay que tener en cuenta que el tiempo y los costes son limitados. En este sentido, hay que encontrar el punto de inflexión adecuado en el que una arquitectura de este tipo es suficientemente ventajosa y beneficiosa, o dicho de otra manera, que aporte valor.

modulos o microservicios

Cuando tenemos un sistema muy grande y con mucha evolución (Google, Netflix, Amazon, Ebay, Uber…), además de necesidades de demanda y también por negocio, es obvio que la mejor solución es una arquitectura microservicios. Pero, realmente ¿cuántos proyectos tienen las mismas necesidades que estas empresas? ¿Vale la pena este tipo de arquitecturas para muchos proyectos? ¿Realmente las necesidades de escalar que tengo son similares a esos casos? ¿El proyecto es un sistema core y crítico de la misma manera? ¿Qué impacto tiene que pueda escalar con menos exigencia?

En la mayoría de casos, las necesidades que tenemos no suelen llegar al punto de inflexión en el cual una arquitectura de este tipo pasa a ser beneficiosa y más productiva. En la siguiente imagen vemos que realmente muy pocas organizaciones tienen esa exigencia tecnológica de escalar y de rendimiento.

modulos o microservicios

Módulos

Los módulos aportan un punto de vista intermedio que cualquier tecnología actual ya soporta de base (java, javascript, c++, .net, …). Y son sistemas que permiten aislar el código y crear dependencias entre módulos a través de unas interfaces bien definidas y estandarizadas. El hecho de que todas las tecnologías consideren un sistema modular de desarrollo ya indica o nos puede dar una idea de las ventajas que proporcionan.

Los módulos proporcionan ese nivel de encapsulación que buscan los microservicios y desacoplar las funcionalidades para no caer en la trampa de los monolitos. Estos módulos se orientan a crear “servicios” a través una definición de publicación de APIs bien definida y estructurada para asegurar esa encapsulación.

En el caso de Java ya existía OSGi y ahora Java 9 incorpora de manera nativa los módulos. Permite modularizar las partes de las aplicaciones sin tener que crear microservicios. Deberíamos preguntarnos, ¿qué nos hace pensar que desarrollar microservicios nos hará un código más modular? Si un desarrollador no es capaz de modularizar un monolito difícilmente desarrollará microservicios bien aislados y encapsulados. En el mismo caso muchas veces adaptas tu arquitectura de microservicios a un sistema de despliegue particular, por lo cual ya es un error de concepto, ya que deberíamos orientar los desarrollos independientemente del sistema de despliegue final

El (casi) único punto de microservicios que no cumplen los módulos es el de que cada servicio corre su propio proceso y de ahí que no consiga la misma exigencia de escalabilidad. Pero, ¡ojo! Cabe recordar también que escalabilidad no significa alta disponibilidad. Una aplicación puede tener alta disponibilidad debido a mucha redundancia de servidores pero puede escalar mal o poco optimizada. Aun así el sistema de despliegue de los bundles OSGi se acerca mucho a un despliegue de microservicios con sus contenedores

Hay que tener en cuenta también que, si se crea en algún momento una aplicación modular, el paso para transformarlo a microservicios es bastante sencillo, por lo que, si no estamos seguros de que exigencias de escalabilidad y disponibilidad tenemos siempre podemos dirigirnos a una arquitectura de microservicios sin tener que refactorizar todo un proyecto a posteriori.

Por otro lado, varios productos como algunos CMS (liferay, opencms, …) han optado por este tipo de soluciones para mejorar su arquitectura hacia un sistema modular, lo cual da cierta confianza en cuanto a solidez de este modelo de desarrollo, ya que dan solución a multitud de organizaciones y soluciones.

Conclusión

Resumiendo lo dicho anteriormente, no defiendo ninguna opción por encima de otra, pero sí que recomiendo hacer una análisis de necesidades y exigencias del proyecto antes de tomar una decisión sobre “modulos o microservicios”. Como normal general si eres una organización tipo Netflix, Google, Ebay, Uber… seguramente tendrás que dar solución a varias exigencias del sistema y una arquitectura de microservicios sea la mejor solución. Sino simplemente plantea la posibilidad de desarrollar con módulos en la tecnología más adecuada para cumplir ciertas exigencias y reducir complejidades inherentes de arquitecturas bastante diferentes.

Referencias:

https://martinfowler.com/articles/microservices.html

https://www.osgi.org/

https://www.journaldev.com/13106/java-9-modules

https://dev.liferay.com/develop/tutorials/-/knowledge_base/7-0/osgi-basics-for-liferay-development

Juan Miguel Bonilla López

Autor: Juan Miguel Bonilla López

Team Manager en la división de Gobierno especializado en arquitectura y desarrollo de software. Más de 7 años de experiencia para sector público y enfocado en desarrollo JavaEE. Entusiasta de arquitecturas de microservicios, plataformas cloud y hacking ético.

Deja un comentario

Campos requeridos marcados con *.


Este sitio usa Akismet para reducir el spam. Aprende cómo se procesan los datos de tus comentarios.