NodeJS vs Java EE pour une application web

Depuis 2009, NodeJS a envahi le petit monde du développement web, et petit à petit fait son trou parmi les plateformes de référence pour réaliser une application, site ou API de services. Le vieux [Java EE][2] résiste pourtant, et quiconque souhaite aujou
Florent TRIPIERMis à jour le 13 Juin 2017
node js vs java EE comparatif

Depuis 2009, NodeJS a envahi le petit monde du développement web, et petit à petit fait son trou parmi les plateformes de référence pour réaliser une application, site ou APIUne API est un programme permettant à deux applications distinctes de communiquer entre elles et d’échanger des données. de services. Le vieux Java EE résiste pourtant, et quiconque souhaite aujourdhui démarrer un nouveau projet peut se confronter à cette problématique : NodeJS ou JavaLangage de développement très populaire ! EE ?

Cest cette question que nous nous proposons de trancher, ou plus modestement déclairer de quelques éléments de comparaison qui permettront de structurer la réflexion des décideurs sur les points critiques à prendre en compte en vue de ce choix.

Dans cette analyse, nous considérerons les dernières versions de chacune de ces plateformes : NodeJS 6.10.2, et Java EE 7 sous Java 8. Cest parti !

Javascript vs Java : comparaison des langages

Le Javascript et le Java, en tant que langages de programmation, observent de nombreux points de convergence sur lesquels il est inutile de sattarder. Voyons directement leurs différences majeures.

Le typage

Le Java possède un typage statique et fort, et est massivement orienté objet. En Java, à lexception des 8 types primitifs, tout est objet, et la moindre portion de code doit sinsérer dans une classe. Ce cadre restrictif offre une solution de développement contraignante, mais par là-même sécurisante puisquelle limite les erreurs de typage dès la pré-compilation.

Le Javascript en revanche possède un typage dynamique. La programmation objet est possible mais nest pas obligatoire, et les nombreux transtypages automatiques en font un langage infiniment plus souple que Java avec la limite évidente des risques accrus pour un développeur de se perdre dans son propre code et de générer des erreurs de typage à profusion. Labsence de compilation avant le démarrage de lapplication naide pas davantage.

Lexécution

Java est un langage pré-compilé en bytecode puis exécuté dans une machine virtuelle qui interprète ce bytecode à la volée.

Comme son nom lindique, le Javascript est un langage de scripting, donc interprété à la volée. En cela, il se rapproche du Java. En réalité, si cette description est correcte pour du Javascript exécuté dans un navigateur web, elle est erronée pour une application NodeJS. En effet, le moteur dexécution compile tout ou partie le programme au lancement même de lapplication, directement en langage machine. Nous verrons cela en détails un peu plus tard.

Le paradigme de développement

Java est un langage de développement impératif de type procédural : le programme est constitué comme un ensemble dinstructions à exécuter séquentiellement. Cest le paradigme le plus courant et le plus simple à appréhender pour les développeurs, mais ce nest pas le plus optimisé en termes dutilisation des ressources de la machine. Nous y reviendrons dans la partie [« Exécution et performance »][5] .

Javascript en revanche est un langage de développement événementiel : le programme est défini comme un ensemble de réactions à des événements. Ce mode de programmation est radicalement différent du précédent dans la mesure où chaque gestionnaire dévénement doit être autonome vis-à-vis du reste du programme. Il est plus complexe à appréhender, notamment par son utilisation massive de lasynchronicité.

En un mot

Java NodeJS
Les + Langage complet, facile d’apprentissage et très encadré Langage très souple, approche événementielle particulièrement performante
Les - Lourd et monolithique, manque de souplesse dans sa syntaxe Initialement langage de scripting, plus complexe à appréhender

Environnement et framework

Lunivers Java regorge de librairies open source disponibles pour agrémenter son application web de fonctionnalités absentes du JDK. Des gestionnaires de librairies tels que Maven permettent dintégrer ces sources annexes dans votre projet, même si leur utilisation peut savérer complexe.

De son côté, NodeJS est livré avec son propre gestionnaire de paquets, npm. Celui-ci permet également dintégrer des libraires à son projet sous forme de paquets. Lutilisation en est simpliste, la fiabilité élevée, et le catalogue est très fourni.

Du point de vue de lexploitation, une application Java EE ne sexécute pas directement. Elle doit être exportée sous forme darchive, par exemple un fichier .war, puis déployée sur un serveur dapplications, comme WildFly. Le serveur dapplications lui-même est un programme Java, qui sexécute donc dans une JVM. Un serveur dapplications certifié Java EE propose de nombreuses fonctionnalités avancées (caches applicatifs, pools de connexions, clustering, haute disponibilité), mais leur paramétrage peut savérer complexe.

Une application NodeJS sexécute dune simple commande : node [nom de votre fichier main]. Quelques paramétrages sont disponibles, mais les fonctionnalités ne sont pas très avancées.

En un mot

Java EE NodeJS
Les + De nombreuses librairies et fonctionnalités d’exploitation Simplicité d’intégration des librairies et d’exploitation
Les - Gestion des dépendances et paramétrage des serveurs d’applications Fonctionnalités d’exploitation réduites

Prise en main

Le langage Java en lui-même est rarement une difficulté pour un développeur, en revanche larchitecture dun projet Java EE a le don de décontenancer ceux qui sy confrontent pour la première fois, en particulier lors de linstallation. De plus, les nombreuses couches dabstraction imposées par les frameworks de base de Java EE (Hibernate, JSF, EJB) se présentent souvent comme des boîtes noires dont le contenu est parfois obscur et réserve à loccasion quelques surprises.

NodeJS, quant à lui, ne nécessite pas de connaître autre chose que le Javascript pour démarrer. Linstallation est triviale et le démarrage ne pose en général aucun problème. Limport de modules est inévitable, et leur facilité dutilisation, en revanche, est très variable, les documentations étant très inégales.

En un mot

Java EE NodeJS
Les + Framework proposant des couches d’abstraction élevées Architecture logicielle ultra-modulaire
Les - Difficultés liées à l’utilisation de ces frameworks Nécessité de se documenter sur chaque module importé

Moteur dexécution et performance

Une application web Java EE est déployée sur un serveur dapplications Java EE. Le processus qui sexécute est donc celui du serveur, qui porte toute la configuration dexploitation via le paramétrage de la JVM.

Une application NodeJS est exécutée par le moteur de Google, V8. Le programme est (partiellement) compilé au démarrage. Quelques paramétrages dexécution existent.

Du point de vue des performances, les serveurs dapplications Java EE proposent des temps de réponse très satisfaisant dune façon générale. Toutefois, le pattern 1 requête = 1 thread limite ces résultats lors dune montée en charge, puisque la quantité de ressources croît en proportion.

Avec son pattern proactor, NodeJS évite cet écueil. Chaque requête parvient à un unique thread qui est chargé de répartir les demandes sur un pool de threads de taille fixe, avec une file de taille indéfinie. De plus, lapproche événementielle permet de libérer chaque thread de ce pool dès que le programme est en attente dune entrée-sortie (fichier, BDD). Lensemble de ce système le rend très performant et particulièrement résistant à la montée en charge. 

Schéma-Node-vs-java.jpg

En un mot

Java EE NodeJS
Les + Bonnes performances Bonnes performances, résiste à la montée en charge
Les - Baisse de régime voire crash du serveur lors de montées en charge Quelques zones dombres sur la gestion de la compilation partielle par V8

Maintenance et évolutivité

La facilité de maintenance de nimporte quelle application est avant tout liée à la manière dont elle a été développée : architecture applicative, qualité de code, qualité des commentaires, qualité de la documentation. Ces paramètres ne dépendent ni de la technologie ni de lenvironnement de développement.

Ce dernier joue un rôle important, en revanche, lorsquon hérite de la maintenance dune application que lon na pas développé soi-même, et qui (comble de malheur) souffre de lacunes documentaires. Dès lors, les facilités offertes par les IDEEnvironnement de développement permettant de faciliter le développement d'applications. Java pour naviguer dans un projet de lien en lien permettent une exploration facile du programme. Pour lheure, il nexiste rien déquivalent dans lunivers NodeJS.

Le niveau dévolutivité de lapplication se base sur les mêmes critères. Quant à lévolutivité de la technologie elle-même, Java EE est aujourdhui bien moins dynamique que NodeJS, mais encore bien plus riche en fonctionnalités diverses jusquà quand ?

En un mot

Java EE NodeJS
Les + Les IDE Plateforme très dynamique, beaucoup de nouvelles fonctionnalités à venir
Les - Peu de nouveautés à attendre La lisibilité très moyenne de la syntaxe n’est pas aidée par l’absence d’IDE digne de ce nom

Sécurité

Java EE propose toutes les fonctionnalités nécessaires pour la sécurisation des applications : stratégies dauthentification, cryptage SSL, règles daccès Toutefois, ces fonctionnalités sont assez complexes dutilisation, et le haut niveau dabstraction proposé par la plateforme a tendance à faire sur-estimer le niveau de sécurisation « par défaut » dune application. Un travail spécifique est donc nécessaire sur ce point selon le degré de sécurité souhaité.

NodeJS en revanche propose une approche beaucoup plus bas niveau (quoique de plus en plus de modules spécialisés évoluent dans le sens dun plus haut niveau dabstraction). Lavantage est clairement la maîtrise de sa stratégie de sécurité. Linconvénient est que cette maîtrise nest pas facultative : il faut maîtriser son sujet pour sécuriser son application. Rien de bien sorcier, cela dit, mais une tâche à ne pas confier à un développeur junior.

En un mot

Java EE NodeJS
Les + Tout est déjà implémenté et prêt à être intégré La possibilité de customiser entièrement sa stratégie sécuritaire par une gestion plus bas niveau
Les - Il est parfois difficile de se retrouver dans la jungle des paramétrages La nécessité de connaître le sujet, ou bien, si l’on choisit d’intégrer des modules préexistants, la difficulté de les paramétrer, comme pour Java EE

Conclusion

Les deux plateformes sont assez différentes, et possèdent chacune une identité propre assez marquée. Pour autant, malgré les développements que nous venons de faire, il nest pas évident de trancher entre lune et lautre des solutions.

Pour résumer, Java EE est une plateforme très complète, fiable et éprouvée, qui offre des facilités de développement, mais peu de souplesse. Ses performances sont bonnes, à nuancer en cas de montée de charge. On notera également la complexité des paramétrages et lâge de la technologie, qui laisse espérer peu de nouveautés à venir.

De son côté, NodeJS est une plateforme innovante, dynamique, souple et performante, qui permet une architecture logicielle modulaire. Néanmoins, le développement événementiel peut savérer complexe dapproche, et certains points techniques comme la sécurité peuvent parfois devoir être gérés à bas niveau. Il est aussi parfois difficile de choisir un module pour tel ou tel fonctionnalité, ainsi que daccéder à une documentation digne de ce nom.

Pour conclure, nous dirons que Java EE est plus adapté pour des gros projets, très cadrés, avec des perspectives dévolutions moyennes à élevées et un cycle de maintenance long. Il convient parfaitement à des développeurs de niveau technique moyen.

NodeJS sera parfait pour des projets de taille plus réduite, avec une gestion de projet plus souple, des perspectives dévolution faibles ou moyennes, et un cycle de maintenance moyen à long. Il nécessite davoir des développeurs (ou a minima un architecte) de niveau technique un peu plus élevé.