author
Gerardo # Microservices Engineer 5 min.

Microservices

En el mundo del desarrollo de aplicaciones web modernas, sobre todo las más complejas, hace ya tiempo que se opta por la arquitectura de microservicios frente a aplicaciones monolíticas y como una evolución de la arquitectura orientada a servicios (SOA) en la que se busca, entre otras cosas, mayor encapsulamiento, tolerancia a fallos y escalabilidad.

Son claras y conocidas las ventajas de una arquitectura de aplicación basada en microservicios frente a la clásica estructura monolítica, estas son algunas:

  • Flexibilidad y solidez: dividir en módulos que tengan responsabilidades aisladas del resto de la aplicación permite un desarrollo más ágil y una mayor tolerancia a fallos en el global de la aplicación ya que el fallo de uno de los microservicios de la aplicación no tiene por qué hacer que deje de funcionar el resto o el total de la aplicación.
  • Escalabilidad y eficiencia: Si ciertos microservicios de la aplicación requieren de mayores recursos/infraestructura podemos escalar sólo esas partes de la aplicación gracias a estar desacoplados, ahorrando también costes. Además, cada microservicio se puede desarrollar en diferentes lenguajes o haciendo uso de diferentes recursos como bases de datos no relacionales (o ni siquiera necesitando persistencia alguna en sí mismos).

Proveedores Cloud

El crecimiento exponencial de las aplicaciones nativas en la nube, la necesidad de disponibilidad inmediata y casi infalible ligada a una cada vez mayor dependencia de éstas por parte de usuarios y empresas ha hecho que en pocos años las compañías proveedoras de servicios hayan experimentado un crecimiento a la par tanto en infraestructura como en nuevos productos.

Las "compañías de hosting" incluyen ahora entre sus productos servidores cloud, máquinas virtualizadas con escalabilidad automática o bajo demanda que permiten el cobro por uso con recursos escalables dinámicamente. Además de estas empresas, se han sumado grandes corporaciones que han visto nicho de negocio en ofrecer productos como el PaaS (Platform as a Service). Vender como un servicio toda una plataforma sobre la que sustentar aplicaciones completas basadas en la nube, desde el servidor de aplicaciones, la base de datos, herramientas de análisis de big data, caché, mensajería... todo ello administrado.

Google Cloud

Cloud Functions (FaaS)

Es aquí donde surge un nuevo producto en la nube, como una evolución de los microservicios y que cada proveedor nombra de forma distinta: las funciones en la nube.

Como su propio nombre indica, son funciones que definimos y configuramos en el servicio de nuestro proveedor favorito para que realicen una tarea muy específica. Código que se ejecutará sin tener que preocuparnos por configurar y levantar servidor alguno. Sólo nos centramos en programar el código en particular que nos interesa ejecutar de forma independiente, escalable y con alta disponibilidad.

Dependiendo del proveedor podremos usar lenguajes como Python, Java, Go, Javascript... y tendremos que configurar más o menos detalles como los recursos mínimos que necesitará nuestro código para ejecutarse.

El código que programemos se ejecutará cuando un evento o trigger haga que se ejecute. Estos eventos pueden ser llamadas HTTP entrantes o eventos disparados por otros servicios que tengamos contratados con el proveedor: p. ej.: la inserción de un registro en una base de datos en la nube o un evento de servicios de mensajería. En el caso de utilizar un trigger HTTP, cuando nuestro proveedor recibe una llamada a la función configurada se encarga de levantar la instancia necesaria (se encuentra latente esperando estos eventos) y de ejecutar el código. Nuestro código escalará automáticamente y dispondrá al momento de los recursos que necesite sin que nostros nos tengamos que preocupar por si nuestro microservicio se ha saturado ante un pico de solicitudes (por ejemplo).

En cuanto a costes, se nos cobrará por el tiempo que nuestro código está ejecutándose y los recursos que este consuma para su ejecución. Por ejemplo: 2GB de RAM durante 40s de ejecución: se factura por segundo, por GB consumido. Nos ahorramos los costes de tener instancias enteras de servidores, por pequeñas que sean, a la espera de llamadas que puede que la mayor parte del tiempo no se produzcan. Ganamos en eficiencia y ahorramos costes.

Ejecución del código sin pensar en los servidores. Pagar solo por el tiempo efectivamente consumido.

Podremos crear estas funciones extrayendo partes de nuestros microservicios que nos interese desacoplar por alguno de los motivos arriba expuestos e incluso, dependiendo del microservicio, podremos migrar todo a funciones Cloud. Toda implementación dependerá, como siempre, de cada caso en particular y de un análisis previo en el que considerar qué funcionalidades nos puede interesar migrar o desarrollar desde un inicio de esta forma y si es posible/rentable hacerlo para nuestro caso de uso.


eu