Présentation

Node s'appuie sur V8, le moteur JavaScript de Google utilisé dans Chrome, qui fait partie des moteurs JavaScript les plus puissants du marché actuellement. Node va nous permettre de développer très simplement des applications scalables. Comment ? Un petit tour sur le site nous explique son approche : http://nodejs.org/#about. En français et en quelques mots : l'idée est d'utiliser des IO non bloquantes pour gérer toutes les requêtes entrantes, sortantes, ainsi que tout le process lié à la requête.

Prenons l'exemple du serveur Apache. Chaque requête HTTP entrante se voit allouer un thread. Celui-ci est utilisé pendant toute la durée du traitement de la requête : lecture / écriture en base de données, lecture / écriture dans des fichiers de log ou autres, exécution de code… Ainsi, si votre code côté serveur fait un accès à la base de données, celui-ci est en attente de la réponse. De plus, durant toute la durée de la requête, le client sera bloqué, en attente de la réponse du serveur.

Node et plus globalement les serveurs dits non bloquants (comme Netty ou Deft pour ceux qui tournent sur JVM) adoptent une autre approche. Node n'utilise qu'un seul thread pour gérer les requêtes entrantes. De plus, Node ne propose pas, dans ses API, de fonctions bloquantes. Ainsi, tout notre code est asynchrone. L'avantage immédiat à cela est la simplification à l'extrême de la gestion de la concurrence dans nos applications qui n'est ici plus gérée par le développeur mais directement par l'OS. Concrètement, toutes les fonctions fournies par Node prennent en paramètre une fonction de rappel (callback). Une fois que la fonction aura terminé son traitement, elle sera appelée avec le résultat en paramètre et une éventuelle erreur. Ainsi, pendant toute la durée du traitement, le thread sera relâché et pourra être donné à une autre requête pour effectuer un autre traitement. Nous sommes donc face à un système événementiel. JavaScript est un très bon choix de langage du fait que l'on peut programmer de manière fonctionnelle avec celui-ci. Les callbacks dans tous les sens, nous connaissons très bien avec des bibliothèques comme jQuery qui nous habituent depuis déjà quelque temps à ce type de développement.

Juste pour pinailler, il y a quand même un élément de la bibliothèque Node qui est bloquant à savoir require (module compatible commonJS) qui fait un appel synchrone pour récupérer la dépendance demandée. D'ailleurs, lors d'une séance de questions / réponses donnée il y a quelques mois, Ryan Dahl (le créateur de Node) a admis qu'il serait possible de rendre cela asynchrone mais que cela n'avait pas forcément un sens puisqu'on pouvait considérer cela comme un prérequis de développement. Cela ne me choque pas non plus.

Cas réels d'utilisation

Car oui, sur le papier c'est beau :

  • un serveur qui tient une charge très importante en termes de connexions par seconde ;
  • peut-être 100 000 connexions sur un seul serveur ;
  • et pourquoi pas 1 000 000 d'utilisateurs comme dans cet article : une webapp Comet qui utilise Mochiweb (Serveur lightweight HTTP en Erlang).

Mais a-t-on déjà quelques retours d'utilisation en production ? Et c'est là que ça coince car malheureusement les retours sont assez rares… Node est évidemment un projet très récent et beaucoup pensent qu'il serait suicidaire de partir en production avec ce serveur. L'argument de la jeunesse peut tenir la route, mais je me rappelle avoir entendu des choses douteuses comme : « tant que le numéro de version n'a pas atteint au moins un 1.x, c'est du suicide ! ». Là, j'ai envie de renvoyer ces personnes vers Hadoop avec sa version 0.21 qui est juste utilisée par Twitter, Facebook ou bien encore eBay. Comme quoi le numéro de version ne veut pas forcément dire grand-chose et surtout pas interdit en production !

Après quelques soirées JavaScript diverses et variées et quelques investigations auprès de la communauté, il ressort qu'actuellement Node est beaucoup utilisé comme serveur de développement, pour une productivité accrue, sur des frameworks comme Sproutcore. Le build final de l'application étant dans ce cas composé de fichiers statiques, celui-ci n'est dès lors plus dépendant de Node et peut tourner sur n'importe quel serveur HTTP. Node uniquement pour le développement ? Tout ça ne nous aide pas beaucoup…

Mais voilà, un petit billet est sorti avec un titre plutôt accrocheur : Who is Using Node.js And Why ? Yammer, Bocoup, Proxlet and Yahoo. Et en plus, il y a du lourd ! 

En regardant de plus près, on remarque déjà qu'il n'y a pas (ou peu) d'inconvénients remontés par ces entreprises, si ce n'est la jeunesse du framework. Rendez-vous compte : Proxlet a commencé à utiliser Node en version 0.1.0 !!! Pour les avantages, le retour est unanime : Node est très bon pour gérer de nombreuses requêtes en parallèle et ce n'est donc pas une surprise de se retrouver face à des applications de type proxy. Ainsi, Yammer utilise Node en tant que proxy cross-domain pour leur plateforme de développement. L'application de Proxlet est intéressante à plusieurs points, ce qui me plait plus particulièrement, c'est cette full stack JavaScript qui part d'une base de données MongoDB, accessible par requête JavaScript, qui passe par un serveur Node pour finir en tant qu'extension Chrome. Un bel exemple de réussite d'une application 100 % JavaScript !

À noter enfin que la partie threads de MySpace utilise aussi Node, le but étant d'être en temps réel avec tous les threads déposés sur le mur.

Depuis la publication de ce billet (février 2011), des acteurs majeurs d'internet s'intéressent ou intègrent Node.js : Microsoft, e-bay, LinkedIn ou Yahoo!

Quelques liens et vidéos

Tout d'abord les liens, on retiendra notamment :

  • https://github.com/ry/node/wiki/modules : une liste très complète des modules disponibles pour Node ;
  • NPM : le package manager officiel qui simplifie grandement l'installation de modules ;
  • Express : le framework Web inspiré par Sinatra avec une très bonne introduction chez mklabs ;
  • Socket.IO : le framework ultime pour une application temps réel multinavigateurs, il utilisera ainsi selon le support les Web Sockets, du Long Polling, Flash…
  • Riak-JS : un client pour se connecter à une base Riak ;
  • Connect : middleware pour application Node ;
  • Vows : Behavior Driven Development asynchrone et intégration continue pour Node ;
  • Tutoriel Blog Rolling : un article très complet pour créer un Blog en Node, Express et une base CouchDB.

En ce qui concerne les vidéos, je vous conseille cette très bonne introduction par le créateur de Node, Ryan Dahl, donnée le 28 juillet 2010 à la conférence Google Tech Talks (60 min) : http://www.youtube.com/watch?v=F6k8lTrAE2g.

Et si vous avez encore un peu de temps, trois autres vidéos sont disponibles sur InfoQ avec :

Installation

L'installation est assez simple : pour tous ceux qui fonctionnent sans package manager, cela se passe par ici et pour les autres cela se passe par .

Sans package manager, cela dépendra de votre OS. Le plus simple sous Windows sera de passer par l'installateur .msi. Étant sous OSX, l'installation chez moi s'est résumée aux deux commandes suivantes (j'utilise homebrew) :

 
Sélectionnez

rmat0n:~$ brew install node
rmat0n:~$ curl http://npmjs.org/install.sh | sudo sh

Simple non ?

Conclusion et remerciements

Fin de cette première partie, j'espère que vous avez les idées claires sur ce qu'est Node, ce qu'il apporte et sa simplicité d'utilisation, que l'on connaisse ou non JavaScript.

Dans le prochain article, je vous parlerai des IDE pour développer une application Node et surtout de l'IDE en Node pour Node à savoir Cloud9.

Cet article a été publié avec l'aimable autorisation de Web Tambouille, l'article original (Node.js partie 1 - Tout ce que vous devez savoir sur Node.js) peut être vu sur Web Tambouille.

Nous tenons à remercier ClaudeLELOUP pour sa relecture attentive de cet article.