En el post anterior mencionamos el potencial del cloud computing gracias a la capa de virtualización. Ya desde hace años se vienen usando Virtual Machines (VMs) para alojar varias “copias” del mismo servicio. Esto permite añadir o quitar instancias, es decir, escalar horizontalmente. Por contra, la nueva tendencia desde hace unos años se está dirigiendo hacia el uso de contenedores. Primero con LXC, después Docker, etc.
Sin entrar en grandes detalles, VM y contenedores proporcionan una capa de “abstracción” y de aislamiento. A diferencia de las VM que virtualizan todo el “stack” (SO, etc.), los contenedores son mucho más ligeros y comparten el mismo kernel. A costa de un menor aislamiento, el overhead de los contenedores es menor, y permiten escalado de tipo vertical mucho más rápidamente (nos olvidamos de esperar minutos para arrancar una instancia de VM). La limitación de poder usar Docker únicamente en Linux ha sido finalmente resulta, tras introducir soporte para los sistemas operativos Windows y Mac.
El potencial de los contenedores es claro. Sin embargo, no debemos olvidarnos de nuestra aplicación: debe estar diseñada de tal forma que sea escalable. Es el problema de ciertas aplicaciones legacy (típicamente monolíticas o de una única capa), que no se desarrollaron con esta característica en mente. La arquitectura orientada a servicios (SOA) se pensó con este fin y más recientemente, los microservicios se han popularizado. El patrón de diseño de Microservicios tiene adeptos tan conocidos como Spotify, Netflix, Ebay, Amazon, Google y Microsoft Azure.
La idea de un microservicio es que cumpla una función muy específica. Esto tiene ventajas ya que agiliza el ciclo de desarrollo de aplicaciones (incluido el despliegue a producción y reemplazo de versiones antiguas “en caliente”). Además, cuadra perfectamente con la filosofía de los contenedores, pudiendo así desplegar un mismo microservicio en distintos contenedores. La comunicación entre servicios puede darse mediante protocolos síncronos (HTTP/REST) o asíncronos (AMQP).
Google Container Engine, Azure Container Service y Amazon EC2 Container Service (ECS) son ejemplos de proveedores que permiten el uso de contenedores para desplegar nuestras aplicaciones. Tenemos aquí un nuevo modelo de escalado de aplicaciones (microservicios + contenedores) con menos limitaciones que el tradicional escalado horizontal basado en VMs.