Eclipse Adoptium utiliza Quarkus para una API de distribución de Java SE de gran volumen
Java es utilizado por millones de desarrolladores en todo el mundo y, según Redmonk, recientemente ha pasado a ser el segundo lenguaje de programación más utilizado. Hay muchas distribuciones del kit de desarrollo y tiempo de ejecución de Java, pero la distribución Eclipse Temurin (antes conocida como AdoptOpenJDK) ha demostrado ser la más popular. Recientemente, el proyecto AdoptOpenJDK se trasladó a la Fundación Eclipse como Eclipse Adoptium. El objetivo de Adoptium es promover y apoyar tiempos de ejecución de alta calidad con certificación TCK y la tecnología asociada para su uso en todo el ecosistema Java. Para ello, realiza compilaciones periódicas, pruebas, certificaciones y, por supuesto, suministra binarios a los millones de desarrolladores que necesitan evaluar, crear prototipos y ejecutar cargas de trabajo de producción con Java. Al igual que otros proyectos de código abierto de Eclipse, el equipo que está detrás de la API de distribución es mayoritariamente voluntario, por lo que busca constantemente optimizar su tiempo y recursos y la tecnología utilizada para cumplir su misión.
El desafío
Mientras que los desarrolladores pueden descargar las distribuciones directamente desde el sitio web de Adoptium con un solo clic, resulta más complicado automatizar este proceso, por ejemplo, en una canalización CI/CD. Esto es especialmente cierto debido a la cantidad de variantes de versiones de Java, tipos de distribución, sistemas operativos, arquitecturas, implementaciones de JVM, etc. Para ello, Adoptium necesitaba ofrecer una forma de descubrir y acceder mediante programación a los binarios preconstruidos en función de estas variables, y produjo una API para el usuario final.
El gran volumen de descargas de AdoptOpenJDK, unas 500.000 al día, significaba que el rendimiento se convertiría en una consideración clave para la API. Además, Adoptium no tiene un centro de datos tradicional, por lo que todo esto se ejecuta en la nube en Microsoft Azure, donde los costes pueden aumentar cuando se tienen cargas de trabajo en ejecución continua que ocupan un espacio innecesario.
En 2017, el primer intento del equipo técnico de exponer una API fue utilizando Node.js + Express. A medida que el volumen de solicitudes y el número de variantes de distribución aumentaban, el equipo descubrió que los tiempos de respuesta eran cada vez más lentos, no solo por el volumen, sino también por las decisiones arquitectónicas tomadas al principio. En particular, la arquitectura monolítica de la aplicación, en la que el frontend y el backend se encontraban en la misma aplicación, provocaba una aparente lentitud en el frontend, mientras el backend procesaba peticiones concurrentes. Además, la falta de paginación en la API significaba que las solicitudes podían devolver resultados enormes, incluso cuando sólo se necesitaban los primeros elementos del resultado.
El desarrollador principal del Comité Directivo Técnico responsable del mantenimiento de la API explica:
La API existente tenía fallos de diseño que no habrían sido fáciles de arreglar, así que nos planteamos sustituirla por una nueva implementación. Nuestro pequeño equipo tenía más experiencia en lenguajes JVM que en JavaScript, y como se trataba de una API que servía datos de Java, pensamos que comer nuestra propia comida para perros sería algo bueno!
-Lead Developer on the Adoptium Technical Steering Committee
Entra Quarkus
En julio de 2019, el equipo descubrió Quarkus a través de su trabajo relacionado con otros frameworks del ecosistema Java. Estaban especialmente interesados en la promesa de Quarkus de un rendimiento estelar y una huella más pequeña, que es comparable a Node.js e incluso a Golang. Incluso mejor, el soporte de primera clase de Quarkus para Kotlin significaba que el equipo podía reutilizar tanto su experiencia en Java como en Kotlin con Quarkus.
The team found Quarkus extremely easy to develop, especially the Live Coding capability. The familiar JAX-RS APIs in Quarkus made it easy to create the necessary endpoints. The lead engineer explains further:
Nos gustó mucho el hecho de que Quarkus utiliza JAX-RS, con el que ya estábamos familiarizados. Tener una integración inmediata con RESTEasy reactivo fue un buen bono de rendimiento, y la extensión OpenAPI disponible en Quarkus hizo que fuera bastante simple exponer la API como un navegador de API Swagger sin necesidad de trabajo adicional.
-Lead Developer on the Adoptium Technical Steering Committee
El Live Coding con Quarkus también resultó muy útil a la hora de desarrollar la aplicación:
El bucle de retroalimentación rápida de la codificación en vivo fue muy útil al desarrollar con Quarkus. Aunque el inicio rápido era bueno, no era crítico ya que nuestras aplicaciones son de larga duración, pero durante el desarrollo, a medida que ajustábamos nuestras APIs, el poder volver a probar inmediatamente nos ahorró una tonelada de tiempo de desarrollo.
-Lead Developer on the Adoptium Technical Steering Committee
El rendimiento inmediato de Quarkus en JVM superó sus expectativas con bastante facilidad:
We initially wanted sub-second response times for most of the API, and be able to handle around 10 thousand requests per second. With zero optimizations, our app was responding within 1ms for most APIs, and easily surpassed our throughput requirements. This is way more than we will need for the foreseeable future. The Quarkus app also uses less than half the CPU time [compared to Node.js], despite handling more traffic and providing more functionality.
-Lead Developer on the Adoptium Technical Steering Committee
En general, el cambio a Quarkus ha sido una experiencia muy positiva, con beneficios reales en términos de productividad de los desarrolladores y eficiencia operativa. El equipo ha estado utilizando Quarkus en producción para la API de Adoptium desde noviembre de 2019 y ha demostrado ser extremadamente estable.
Una comunidad activa
Las comunidades son un aspecto crítico para el éxito de cualquier proyecto de código abierto, incluido Quarkus. No es de extrañar que la salud de una comunidad sea una consideración importante cuando hay que tomar una decisión de adopción. En el caso de Adoptium, esto queda claro con el ejemplo:
A principios de este año descubrimos una fuga de memoria en el componente RESTEasy Reactive de Quarkus. En pocos días, trabajando con la comunidad de Quarkus, fuimos capaces de identificar y solucionar el problema. Esto nos dio la confianza de que, a largo plazo, seremos capaces de resolver los problemas rápidamente.
-Lead Developer on the Adoptium Technical Steering Committee
Lo que viene para Adoptium
Adoptium está muy contento con su decisión de adoptar Quarkus, y está deseando probar las nuevas capacidades de Quarkus, como las pruebas continuas y el soporte de servicios de desarrollo para MongoDB (su base de datos elegida).
En general, hemos quedado muy impresionados con las capacidades de Quarkus, y nuestra experiencia con la comunidad de Quarkus ha sido fantástica. Estamos deseando ver cómo evoluciona y mejorar la forma en que servimos a las necesidades de distribución de Java de la comunidad en los próximos años!
-Lead Developer on the Adoptium Technical Steering Committee
Más información
Acerca de Eclipse Adoptium
La misión del proyecto de alto nivel Eclipse Adoptium es producir tiempos de ejecución de alta calidad y tecnología asociada para su uso dentro del ecosistema Java. Eclipse Adoptium también proporciona artefactos que incluyen la infraestructura de código abierto como código, una completa granja de construcción y pruebas de integración continua, y extensas pruebas de garantía de calidad. Estos artefactos pueden ser utilizados por los proyectos de Eclipse Adoptium y otros creadores de tecnología de tiempo de ejecución para garantizar la provisión de tiempos de ejecución seguros, probados y compatibles con el TCK de Java y listos para la producción.