Node.js : la tendance JavaScript côté serveur

Depuis plusieurs mois, le JavaScript est le langage le plus actif sur github, loin devant le Java ou le PHP. Outre une forte présence sur le côté « Front » des applicatifs, le JavaScript commence à gagner ses lettres de noblesse côté « Serveur ».

En témoigne aujourd’hui les nombreux projets autour de Node.js. La surcouche Node.js est de plus en plus choisie pour expérimenter des problématiques de temps réel ou de quasi-temps réel.
L’objectif est de proposer des expériences utilisateurs dans des environnements très connectés (jeux vidéo, mobiles, sondage grand public, notification, etc.). A titre d’exemple, le chat et le moteur de recherche de Facebook sont développés en partie avec Node.js.
Les premiers retours d’expérience montrent que cette technologie est encore jeune mais très prometteuse. Elle a déjà trouvé un public et une communauté passionnée et dynamique.

Node.js pour des projets « temps réels » mais pas seulement…

V8 JavaScript Engine, développé pour Chrome et noyau de Node.js, est très performant. Sa conception asynchrone évite une programmation itérative « bloquante » qui limite les attentes (wait) et maximise le traitement rapide et immédiat.
Le très bon ratio performance/taux d’utilisation des ressources rend Node.js capable de traiter une volumétrie importante de requêtes. A titre d’exemple, AF83, lors des élections présidentielles, a développé une solution de sondage en Node.js qui a permis de tenir 20 000 connexions à la seconde avec 1 seul processus attaché à un vCPU. De plus, Node.js a une capacité de traitement facilement répartie sur plusieurs vCPU.
La réduction du temps de traitement et de chargement sont les critères majeurs qui amènent une équipe projet à choisir Node.js.
D’autre part, les librairies et modules exposés par Node.js facilitent la mise en œuvre d’API REST capable d’interagir dans des univers multi-devices : mobile, desktop, tv, etc. Cet avantage, couplé avec un langage qui offre une portabilité côté serveur, navigateur ou tout terminal doté d’un moteur JS, fait du couple Node.js/JavaScript un choix de prédilection pour certaines applications multi-devices ou pure web.

Ses qualités :

  • Performance,
  • Mode asynchrone,
  • Gestion native du http,
  • Multi-plateformes (mobile, desktop, tv),
  • Portabilité du code JavaScript aussi bien côté serveur que client,
  • Une communauté très active.

Ses challengers pour du temps réel : C, Polling en PHP, Twist en Python, Red5 avec du flash, …

Node.js nécessite une bonne maitrise du langage JavaScript : exit les (Java)Script-kiddies.

Node.js, c’est du JavaScript. Or, la vraie compétence JavaScript est rare : savoir utiliser Jquery ne veut pas dire être compétent en JavaScript. Un développeur JavaScript compétent est à minima capable de faire de la programmation objet et événementielle.
La courbe d'apprentissage est donc longue, Node.js et JavaScript recèlent de nombreuses subtilités.
La montée en compétence est vite consommatrice de temps. Pour les novices en programmation, il faut compter 4 à 5 mois pour commencer à maitriser l’environnement.
Son passé associé à l’animation de page HTML, l’a rendu impopulaire auprès des développeurs expérimentés. Mais, même si les aprioris sont encore forts sur ce langage, il est normalement très accessible pour des développeurs chevronnés. Après avoir expérimenté un premier projet, ils sont souvent convaincus et même très enthousiastes à propager la bonne parole ☺

La complexité de la programmation événementielle constitue les principales limites de Node.js

Le mode asynchrone est un concept très important: Il est omniprésent dans son fonctionnement.
Même après quelques utilisations, on peut facilement tomber dans des pièges de conception asynchrone.
A titre d’exemple, même une fonction d’écoute de port est asynchrone.
Cette programmation événementielle rend le débogage  plus compliqué : il faut faire des callbacks, bien passer les contextes, gérer les exceptions... et surtout leur contexte. Pour la gestion des exceptions, 2 possibilités s’offrent aux développeurs : attraper toutes les exceptions et correctement les traiter ou simplement redémarrer. La préconisation reste de les traiter pour éviter les erreurs insidieuses comme des fuites de mémoire ou autres erreurs ésotériques dues à la jeunesse de Node.js. Heureusement, pour faciliter la tâche, on retrouve des outils comme node-inspector basé sur le debugger JavaScript de Chrome (breakpoints, stacks, etc.).
En production, il faut tout de même considérer le process Node.js comme instable et prévoir un mécanisme de surveillance. Il faut encore être très vigilant sur les mises à jour de vos modules. La communauté enrichit (trop) rapidement l’éco-système de modules (NPM) prêts à l’emploi. Il faut rester prudent sur la montée en version et avoir une politique rigoureuse de tests (Mocha).

Il manque encore des conventions de programmation

Node.js reste une technologie en pleine construction. L’environnement permet beaucoup de flexibilité et de liberté : les bonnes pratiques ou conventions ne sont pas encore répandues dans la communauté. Quand la technologie sera plus « mainstream », des conventions vont émerger avec la maturité de Node.js.

Une architecture logicielle adaptée à Node.js

Node.js exige de réaliser des applications simples et spécialisées pour maîtriser la complexité induite par l’asynchrone. Il faut concevoir une architecture logicielle adaptée à Node.js avec un découpage actions complexes avec applications simples et spécialisées. Par exemple, Fasterize a conçu son moteur de webperformance en SAAS avec les spécificités de Node.js ou encore Yahoo a créé Cocktail son framework JavaScript MVC côté mobile client et serveur.

Les projets sur Node.js se font avec une taille d’équipe réduite

C’est un constat : sur des projets Node.js, il est préférable de travailler avec des équipes de taille réduite (3/4 personnes). La complexité de conception en environnement asynchrone limite le périmètre du projet. Node.js est souvent utilisé pour des tâches simples en complément d’autres technologies. Développer un applicatif riche fonctionnellement (comme un CMS par exemple) n’a que peu d’intérêt en Node.js: ce choix apporte plus de contraintes que de solutions.

La communauté et la pérennité de Node.js :

Beaucoup de personnes de la communauté prennent un véritable plaisir à expérimenter et construire autour du projet. Elle est incroyable : bien outillée et dynamique. Les modules sont arrivés très tôt et sont un véritable vecteur pour la communauté. Ils suscitent un fort engouement des développeurs qui dynamise le participatif : les évolutions sont donc très rapides et aussi maîtrisées. Pour exemple, le développement du noyau est séparé des modules et celui qui confère une bonne stabilité au cœur de Node.js.
Aujourd’hui, Node.js est comme un nouveau continent à explorer, les contributeurs se permettent d’inventer ou réinventer des concepts. Il est peu étonnant qu’elle constitue l’une des communautés les plus actives sur GitHub. En revanche comme toute communauté naissante, elle va se structurer pour gagner en maturité et le meilleur de Node.js.

Quelques conditions et cas d’usage de projet avec Node.js

Node.js est utilisé dans certains cas, par exemple lorsque :
  • L’expérience utilisateur exige une forte réactivité de réponse
  • L’application est exposée directement à l’utilisateur final avec une forte volumétrie à traiter
En résumé, Node.js est efficient dans des cas d’usage liés à la performance mais exige une certaine rigueur dans le respect des bonnes pratiques comme :
  • Une bonne maîtrise du langage objet, événementiel et JavaScript
  • Une conception de l’architecture logicielle adaptée à Node.js `
  • Une rigueur d’écriture du code avec le JavaScript considéré comme trop permissif.

--------------------
Cette chronique a été élaborée à partir des retours d’expérience d’AF83 (Bruno Michel), Fasterize (Stéphane Rios), SkillD (Jean-Baptiste Guerraz) et Toxicode (Pierre Lancien) pendant l’Apérotech organisé par Oxalide sur le thème de Node.js.