Microservicios como infraestructura

Conoce sus características, ventajas, desventajas y las aplicaciones monolíticas.

Antonio García
Nowports Tech and Product
6 min readDec 22, 2020

--

En esta ocasión hablaremos de manera introductoria y orientada sobre los microservicios, así como sus pros y sus contras. Para entender un más sobre los microservicios y cómo llegamos a ello hablaremos un poco sobre las aplicaciones monolíticas.

¿Qué son las aplicaciones monolíticas o monolito?

Algo tradicional dentro del diseño de software es realizar una arquitectura monolítica. Es decir, en su estructura, todos los aspectos funcionales quedan acoplados y sujetos en un mismo programa. La interfaz de usuario y la capa de acceso a datos están combinadas en un mismo sistema o plataforma.

Esta es la forma más común en una aplicación en sus inicios, por ciertos temas, por ejemplo:

  • Se requiere un mvp de algún proyecto funcional.
  • El equipo es muy joven en conocimiento de arquitectura.
  • El equipo es pequeño y no puede abarcar una arquitectura compleja.
  • Se requiere que la aplicación sea autónoma e independiente.

Otras características de las aplicaciones monolíticas que nos orientan a tomar una arquitectura de microservicios son:

  • La aplicación crece con el código base y en algún punto se puede tener una estructura difícil de manejar.
  • El código es tan independiente que cuando algo falla, toda la aplicación se detiene. Esto puede ser fatal en aplicaciones de monitoreo en tiempo real.
  • Escalar la aplicación implica escalar todo el monolito. Si nuestra aplicación necesita mejor performance, su tecnología puede quedarse corta. Es ahí cuando se toma la decisión de cambiar completamente el stack de nuestra aplicación, afectando a todo el monolito.
  • La aplicación es tan independiente que es casi imposible trabajar de manera aislada sin impactar a otros desarrollos. Ojo aquí, para eso es que nos funcionan unas excelentes pruebas unitarias.
  • Para desplegar un cambio se tiene que hacer con la aplicación entera.
Aquí una esquema en imagen de como se representa una aplicación monolítica.

Entonces, como en este tipo de sistema toda la información está alojada en un servidor y no hay separación de módulos, esto nos podría generar un problema a mediano o largo plazo y el sistema no será escalable de manera sencilla. Es ahí donde surgen los microservicios.

¿Qué es un microservicio?

Podríamos imaginar estos bloques o cubos como unos contenedores de dimensiones reducidas que se acoplan entre sí, eso provoca que se convierta en el mismo que el monolito, pero de forma más organizada.

Consiste en subdividir un monolito en múltiples partes, conocidas como microservicios. Estas se comunican entre sí, creando un gobierno descentralizado que nos permite utilizar tecnologías que se adapten mejor a cada funcionalidad. Por ejemplo, si una parte del sistema necesita mejorar su rendimiento con una tecnología más complicada.

Esta arquitectura permite adoptar nuevas tecnologías más rápido y en aquellos lugares donde se puede aprovechar su potencial están, por lo general, mejor organizadas. Cada microservicio tiene su rol bien definido y no debería estar implicado en lo que hacen los demás.

Los servicios desacoplados nos permiten recomponer y reconfigurar para servir a diferentes aplicaciones y además nos brinda un diseño evolutivo. Cuando el sistema se divide en servicios, cada uno puede ser reemplazado o actualizado de forma independiente. El diseño del servicio debe evitar en lo posible que su evolución afecte a sus consumidores.

Se pueden comunicar entre sí por medio de apis y pueden o no contar con almacenamientos propios. Un ejemplo es un microservicio para procesar archivos. Si cuenta con un storage, guardará registros dentro del microservicio. De lo contrario, nuestro microservicio solo va a procesar cierta información y retorna una respuesta procesada.

Aquí un esquema que representa una aplicación con microservicios.

Repasando las características de los microservicios, podemos ver sus pros y contras.

Pros

  • Modularidad.- Al tratarse de servicios autónomos, se pueden desarrollar y desplegar de forma independiente. Además, un error en un servicio no debería afectar la capacidad de otros para seguir trabajando según lo previsto.
  • Escalabilidad.- Como aplicación modular, se puede escalar horizontalmente cada parte según sea necesario, aumentando el escalado de los módulos que tengan un procesamiento más intensivo. Para que un microservicio no llegue al punto de convertirse nuevamente en monolito, entonces podría escalarse a gran nivel.
  • Versatilidad.- Se pueden usar diferentes tecnologías y lenguajes de programación, lo que permite adaptar cada funcionalidad a la tecnología más adecuada y rentable.
  • Flexibilidad.- Los microservicios son mucho más fáciles de trabajar que las aplicaciones monolíticas. Además permiten introducir nuevos marcos, fuentes de datos y demás recursos sin dificultades.
  • Mantenimiento simple.- Al poder hacerse mejoras de un solo módulo y no tener que intervenir en toda la estructura, el mantenimiento es más sencillo y barato que en otras arquitecturas.
  • Resistencia a fallos o aislamiento de errores.- Si un microservicio falla, el resto de la aplicación no dejará de funcionar. Esto le otorga cierto grado de resistencia a fallos, lo que se traduce en que nuestra aplicación es más segura con un mejor aislamiento de fallos.

Contras

  • Requiere experiencia previa para esta arquitectura.- Los microservicios son una implementación de una arquitectura distribuida de aplicaciones, no es algo sencillo sin haberlo trabajado con anterioridad.
  • Desarrolladores poco versátiles.- Para migrar a una infraestructura de microservicios sin tomar muchos riesgos, los desarrolladores requieren ser más experimentados y con un alto nivel de experiencia. Se podría aprender sobre la marcha, pero eso implica trabajar dos veces lo mismo.
  • Tiempo para fragmentar distintos microservicios.- Se requiere cierto tiempo para generar una planeación adecuada y una buena toma de decisión tanto en tecnologías y el desacople de la aplicación, para saber qué es lo más conveniente en nuestra nueva estructura de microservicios.
  • Pruebas complicadas al despliegue distribuido.- Mientras las pruebas de cada aplicación son sencillas, se complica en soluciones que conectan varios microservicios. Se requiere gestionar que el cambio en un microservicio no afecte la operación de los otros relacionados; de lo contrario, los usuarios pueden detectar el problema. En una aplicación monolítica, es fácil de detectar porque nos daría un error de compilación.
  • Complejidad de gestión de un gran número de servicios.- Si no se maneja de manera adecuada, puede ser complejo en su gestión. Existen herramientas de soporte para esto, pero, como se mencionó con anterioridad, se requiere un cierto grado de experiencia.
  • Control de versiones.- Las actualizaciones de un servicio no deben interrumpir servicios que dependen de él. Es posible que varios servicios se actualicen en cualquier momento; por lo tanto, sin un cuidadoso diseño, podrían surgir problemas con la compatibilidad con versiones anteriores o posteriores.
  • Administracion.- Para tener éxito con los microservicios, se necesita una cultura de DevOps consolidada. Normalmente, el registro debe correlacionar varias llamadas de servicio para una sola operación de usuario, lo que puee ser un desafío. También existen orquestadores que nos pueden dar soporte con este tipo de eventos.

“Si no puede construir un monolito bien estructurado, ¿qué le hace pensar que los microservicios son la respuesta?”

— Simon Brown, arquitecto de software.

Es cierto: si el monolito no está bien estructurado, no se podría hacer una migración correcta a microservicios y probablemente falle también en esa infraestructura. Para eso, existe el monolito modular para separar poco a poco los módulos de nuestro monolito, lo cual no hace más sencillo el cambio.

Conclusión

Los microservicios son una opción de cambio de infraestructura cuando no se tiene un adecuado control de nuestro monolito o no tenemos un monolito bien modulado, lo cual nos causa problemas a mediano o largo plazo.

En lo personal, la adoptaría porque son desacoplados, nos permiten reutilizar y reconfigurar los servicios con nuevas aplicaciones, evolucionar su diseño, aprender e implementar nuevas tecnologías.

--

--