Quarkus & GreenIT
Regard d'Elosien (Alexandre)
Odoo • Image et Texte

Quarkus & le GreenIT

L’écologie est devenu un enjeu majeur pour les entreprises, y compris pour le secteur informatique. Le numérique et les nouvelles technologies ont profondément changé nos modes de vie et ont un impact non négligeable sur l’environnement, notamment en termes d’émissions de gaz à effet de serre et de consommation d’énergie.
Pour répondre à ces problématiques, les entreprises cherchent à réduire au maximum leur empreinte environnementale, tout en continuant à offrir des produits et services de qualité.

Comment Quarkus peut répondre à cet enjeu ? Comment fonctionne-t-il ? Quels sont ses avantages et inconvénients ?

Qu'est-ce que Quarkus ?

Quarkus est un framework open source qui permet de créer des applications web et des APIs en langage Java.

Il permet d’activer de nombreuses extensions comme Hibernate, Jackson, RESTEasy, Swagger, ...


Pourquoi utiliser le framework Quarkus ?

Quarkus a été conçu pour fonctionner de manière native avec des technologies telles que Kubernetes, OpenJDK et GraalVM.

Comparé à d’autres frameworks, Quarkus est conçu pour être très léger et rapide, ce qui permet une utilisation plus efficace des ressources informatiques.
Il offre une empreinte mémoire plus faible et un temps de lancement réduit.
L’utilisation de GraalVM permet également de compiler l’application en code natif, réduisant ainsi sa consommation d’énergie et sa production de gaz à effet de serres.
Quarkus représente une vraie option pour réduire son empreinte écologique.

Un mode développeur est accessible et permet de lancer un environnement de développement via une simple commande : « mvn clean quarkus:dev » :

Odoo • une photo avec une légende

En résumé :

-    Fonctionne de manière native avec des technologiques telles que Kubernetes, OpenJDK et GraalVM ;
-    Empreinte mémoire faible et temps de lancement réduit ;
-    Mode développeur facilement accessible ;
-    Intégration de GraalVM qui permet une compilation d’application en code natif.

Qu'en est-il des inconvénients ?

Malgré ses nombreux avantages, Quarkus a encore de quoi s’améliorer. 3 inconvénients selon moi :
-    Un outil encore jeune qui n’a pas (encore) atteint la maturité d’un Spring Boot ;
-    Parfois difficile de trouver de l’aide si vous rencontrez des problèmes ;
-    Temps de compilation plus long.

Comment Quarkus exécute-t-il les applications ?

À noter qu’à la différence de Spring Boot, Quarkus supporte deux modes d’exécution :
•    Mode JVM : Quarkus utilise le runtime JVM pour exécuter les applications Java ;
•    Mode natif : Quarkus utilise GraalVM pour compiler les applications Java en code natif.

Le mode JVM :
Pour ce mode, Quarkus utilise la JMV pour lancer l’application et offre des avantages par rapport à une application Java traditionnelle.
Il utilise diverses optimisations pour réduire la consommation mémoire et le temps de démarrage. Pour cela, certaines étapes habituellement effectuées au démarrage sont effectuées à la compilation (chargement et analyse des configurations, résolution des annotations, création des modèles d’entités).  
=> Quarkus met en cache ses différentes étapes pour les réutiliser lors du prochain démarrage de l’application.
Il réduit également le nombre d’instructions dynamiques qui sont exécutées par la JVM en les remplaçant par des instructions statiques.

Le mode natif :
En plus du mode JMV, un second mode est proposé. Le mode natif permet de compiler l’application en code natif, ce qui permet d’obtenir des performances similaires à celles d’un programme en C ou C++.
La compilation génère donc du code machine qui sera directement exécutable sur la machine hôte. Cela signifie que l’application n’a pas besoin de la JVM pour fonctionner.
Cependant, cela implique que l’application ne peut être exécutée que sur une machine avec architecture différente, à l’inverse de la JVM.
Exemple : l’application est construite sur une machine x86, elle ne pourra pas être exécutée sur une machine ARM. Il faut utiliser la même architecture pour la compilation et l’exécution.

Pour compiler l'application en mode natif, Quarkus utilise GraalVM. GraalVM est un compilateur qui permet de compiler du code Java en code natif. Il est basé sur le projet OpenJDK et utilise le compilateur LLVM.

Cas concret

Quarkus vs Spring Boot

Pour comparer ces deux framework, nous allons nous appuyer sur un cas concret : création d’une application de gestion des utilisateurs.
Cet API REST permet de créer, lire, mettre à jour et supprimer des utilisateurs. Nous créons donc une base de données pour stocker les utilisateurs.
Odoo • Image et Texte

Création de notre endpoint et service avec Spring Boot

Odoo • Image et Texte

Création de notre endpoint et service avec Quarkus

Les deux framemork sont assez similaires

La différence majeure est que chaque framework possède sa propre bibliothèque d’annotations.

Odoo • une photo avec une légende
Comparaison détaillée en terme de performances

Résultat : Quarkus est bien plus compact qu’une application Java traditionnelle et le temps de lancement est particulièrement rapide.

Imaginons ici la mise en place d’une application en mode Faas (Function as a Service). Quarkus embarque un runtime qui permet de déployer des fonctions en mode serverless.

Odoo • Image et Texte

Comparatif de performance

Quarkus se rapproche ainsi des performances qu'il est possible d'obtenir avec des langages bas niveau comme le Go ou bien le Rust.

En se basant sur les différents benchmarks réalisés par la communauté, on peut voir que Quarkus est bien plus performant que Spring Boot. En effet, Quarkus JVM est capable de démarrer une application en moins de 3 secondes alors que Spring Boot met environ 6 secondes pour démarrer une application.
Mais ce n'est pas tout, Quarkus natif est capable de démarrer une application en moins d'une seconde. C'est 10 fois plus rapide que Spring Boot. On remarque également que Spring Boot natif à également de bons résultats. Le soucis c'est que Spring Boot natif est beaucoup plus lourd que Quarkus natif. En effet, Spring Boot natif pèse 129 Mo alors que Quarkus natif pèse 77 Mo. Cela signifie que Quarkus natif est 1.7 fois plus léger que Spring Boot natif. Le deuxième soucis que l'on peut reprocher à Spring Boot natif c'est qu'il c'est que le mode natif n'est pas encore stable. En effet, il est encore en version beta. Quarkus natif est quant à lui en version stable.

Conclusion

Pour conclure, je dirai que l’avenir de Quarkus est prometteur, surtout si sa communauté continue de croître et que nous sommes de plus en plus de développeurs à l’adopter.

Sa légèreté et rapidité tout en utilisant des technologies modernes comme GraalVM ou Kubernetes sont un atout majeur. En réduisant la consommation énergétique et l’empreinte carbone des applications, Quarkus répond à une problématique incontournable pour les entreprises aujourd’hui : l’écologie. Il est indéniable que les avancées de Quarkus sont à suivre.

Sources : QuarkusMaddevsHashdorkGraalVM 
Apér'Ops #22 : Kubernetes
Comment déployer une appli en prod sans sueur froide ?