Quarkus
En esta nueva edición de Inspiring Technology, nuestros Hunters, cazadores de tendencias tecnológicas, nos hablan de Quarkus, un marco desarrollado con el objetivo de ejecutar programas de Java en contenedores. ¡Continúa leyendo!
Quarkus es un framework de Java creado por Red Hat con un enfoque en entornos basados en la nube, específicamente Kubernetes y serverless. Además, el framework realiza un esfuerzo en ofrecer la mejor experiencia de desarrollo posible, mediante la adopción de estándares, integraciones y configuraciones sencillas.
Kubernetes-native
Quarkus incorpora elementos fundamentales para el desarrollo y despliegue en Kubernetes como son las métricas, trazas, reportes de estado de salud, depuración en máquinas alojadas en un clúster remoto y configuraciones basadas directamente en ConfigMaps de Kubernetes.
Adicionalmente, con la instalación de una extensión, Quarkus es capaz de generar todos los artefactos y configuraciones necesarias para el desplegar y actualizar versiones de un servicio, en un clúster de Kubernetes.
Consumo de recursos y tiempo de inicialización reducidos
El tiempo de inicialización y el consumo de recursos son dos aspectos con una gran relevancia en entornos basados en la nube. La reducción de estos permite un escalado rápido, una reducción de costes en sistemas con facturación por recursos consumidos, tiempos de respuesta rápidos en funciones como servicio y eficiencia en sistemas con una gran cantidad de servicios en ejecución simultánea.
Para conseguir esto, Quarkus realiza el máximo de procesos posibles en tiempo de compilación, como son análisis de configuraciones, resolución del classpath, carga de clases, etc. Este preprocesado consigue un ejecutable más optimizado, con un tiempo de inicio y uso de recursos reducidos frente a otros frameworks que realizan estas acciones en tiempo de ejecución, como podría ser Spring.
Compilaciones nativas con GraalVM
Las compilaciones nativas pueden reducir aún más el tiempo de inicialización y consumo de recursos, mediante la creación de un artefacto ejecutable por el sistema operativo, sin el requerimiento de una máquina virtual Java.
Quarkus ofrece la capacidad de realizar compilaciones nativas de forma sencilla, sin la necesidad instalar librerías ni realizar configuraciones adicionales. Para realizar una compilación nativa, únicamente es necesario ejecutar el goal “quarkus:build” con el perfil “native” habilitado.
Además, es posible realizar la propia compilación en un contenedor Docker, con la opción “-Dquarkus.native.container-build=true”, permitiendo realizar una compilación sin necesidad de configurar el entono.
Ejemplo de comando utilizado para realizar una compilación nativa
Extensiones
Quarkus cuenta con amplio ecosistema de extensiones, con una configuración estandarizada, que permiten integrar diversos servicios y librerías, como podrían ser clientes para proveedores de identidad como Keycloak, desarrollo de funciones como servicio en la nube de AWS con lambda, gestión de configuraciones en Azure, etc.
Estas extensiones facilitan la integración, configuración y mantenimiento de servicios y librerías soportados.
Basado en estándares
La adopción de estándares ya existentes en la industria es uno de los aspectos clave que ofrece Quarkus, aprovechando herramientas y conocimientos ya existentes.
La utilización de estándares permite minimizar la curva de aprendizaje y tiempo de adopción para desarrolladores que con experiencia previa en estos estándares.
Comparativa en consumo de recursos durante la inicialización.
Quarkus adopta los siguientes estándares:
- Java EE (Jakarta):Definición de servicios REST, persistencia, trabajos en lotes, inyección de dependencias, validaciones, mapeado JSON y trabajos en lotes.
- Microprofile: Configuraciones del entorno, autenticación, documentación de endpoints, telemetría, tolerancia a fallos y comunicaciones entre servicios.
- OpenTelemetry: Trazabilidad y recolección de métricas.
Dev services
Quarkus configura y provisiona automáticamente servicios locales para desarrollo, en forma de contendores, totalmente preconfigurados y de forma automática.
Entre otros, Dev Services ofrece configuraciones de desarrollo automatizadas para los siguientes servicios: AMQP, Apicurio Registry, múltiples bases de datos relacionales, Elasticsearch, Kafka, Keycloak, RabbitMQ, Redis, Vault y clientes de Kubernetes.
Por ejemplo, al iniciar un proyecto en el modo de desarrollo y la extensión de PostgreSQL instalada, Quarkus automáticamente creará un contendor Docker con un servidor PostgreSQL y creará la configuración en el proyecto para utilizar este contendor.
Compatibilidad con Spring
Mientras que Quarkus recomienda utilizar sus propias APIs, ofrece una capa de compatibilidad que permite la utilización de las anotaciones definidas por Spring, realizando un mapeado a las librerías implementadas y optimizadas por Quarkus.
Existen capas de compatibilidad para las siguientes APIs de Spring: Spring Web, Data, Data Rest, Security, Cache y Dependency Injection.
Esta capa de compatibilidad, por una parte, podría ayudar con la migración de proyectos previamente implementados con Spring Boot. Además, por otra parte, podría ser utilizada temporalmente para facilitar la adopción del framework por un equipo con experiencia previa en Spring.
Comparación con Spring Boot
Con el fin de realizar una comparativa, se ha implementado una API equivalente en Spring Boot y en Quarkus. Utilizando estas implementaciones, se han realizado pruebas de carga que consisten en la ejecución de 80 hilos, los cuales ejecutan un bucle con 80 repeticiones de 4 peticiones.
Además, se han compilado ambos proyectos tanto de forma estándar como de forma nativa.
Inicialización
Se han recogido las siguientes métricas en a los contenedores Docker durante la inicialización de los servicios.
Comparativa en consumo de recursos durante la inicialización.
Se puede apreciar que, en la versión estándar, Quarkus consume una cantidad notablemente inferior tanto de CPU como de memoria.
Mientras que, en las versiones con compilación nativa, Quarkus consume una cantidad considerable menor de memoria, 25 Mb contra 130 Mb. En cuanto al consumo de CPU, por unos instantes Spring consume una cantidad superior de CPU, aunque esta rápidamente se iguala en los dos servicios a cero.
Comparativa en consumo de recursos durante la inicialización, compilación nativa.
Prueba de carga
Una vez se han ejecutado las pruebas de carga se han obtenido los siguientes resultados.
Comparativa en consumo de recursos durante la prueba de carga.
En este caso se puede apreciar que, en las versiones estándar, el uso de CPU se mantiene en unos valores similares, mientras que el uso de memoria es considerablemente menor en el caso de Quarkus.
En cuanto a las versiones compiladas de forma nativa, se mantiene un consumo de CPU similar, superando la versión de Spring en algunos picos a la versión de Quarkus, manteniendo un consumo de memoria superior.
Comparativa en consumo de recursos durante la prueba de carga, compilación nativa.
Métricas adicionales
Adicionalmente, se han recogido los tiempos de inicialización, compilación y creación de la imagen Docker.
Teniendo en cuenta estos datos, la versión que mejor rendimiento es Quarkus con compilación nativa. Aunque, al realizar una compilación nativa podrían llegar a producirse problemas con librerías externas, por lo que es muy importante realizar pruebas para verificar su correcto funcionamiento.
Conclusiones
Quarkus es una opción a tener en cuenta a la hora de implementar microservicios o funciones, especialmente aquellos que residan contenedores ubicados clústeres Kubernetes y entornos en la nube.
Quarkus ofrece una selección de herramientas escogidas con la intención de mejorar la experiencia y tiempo de desarrollo, contando con configuraciones, estructuras e integraciones ya establecidas y preconfiguradas.
Además, al basarse en estándares, en el caso de que el equipo tenga experiencia en el desarrollo de aplicaciones basadas en Java EE, la curva de aprendizaje se puede ver reducida notablemente.
Hay que tener en cuenta que, pese a que Quarkus ofrece una extensa documentación, otros frameworks como Spring cuentan con una mayor comunidad y número de desarrolladores.
¿Conoces el programa Hunters?
Ser un hunter es aceptar el reto de probar nuevas soluciones que aporten resultados diferenciales. Un grupo transversal con capacidad de generar y transferir conocimiento con la habilidad de ver anticipadamente las soluciones digitales que nos harán crecer.
Consulta más información sobre los Hunters.