Qu’est-ce que Node.js et pourquoi je m’y intéresse? Un gars de l’infrastructure en quête de réponse

En tant que gars de l’infrastructure, je ne me tiens pas au courant des dernières et meilleures options de développement de logiciel. J’entends souvent des développeurs parler des nouveaux langages ou bibliothèques, mais je m’y intéresse rarement au point de me dévorer le sujet et de découvrir en quoi cela est important pour moi. J’ai entendu beaucoup de discussions au sujet de Node.js et j’ai vu de nombreux tweets, blogs et articles qui reprennent ce terme ; mais jusqu’à présent, je n’ai pas vraiment éprouvé le besoin ni le désir de me jeter sur ce sujet et d’en découvrir son importance.

Pourquoi maintenant?

Il y a trois raisons principales qui m’ont poussé à en apprendre plus sur Node.js en ce moment:

  1. Maintenant que Node.js commence à apparaître partout (du moins partout où je passe du temps en mode digital), je suis contraint de me plonger dans le sujet et d’étudier cette plateforme qui grandit rapidement.
  2. L’adoption de Node.js augmente rapidement et le staff d’infrastructure a besoin de voir ce qui va arriver pour être prêt.
  3. Mon entreprise, AppDynamics, vient juste de racheter une autre entreprise, Nodetime (une entreprise de logiciel de monitoring Node.js). Vous pouvez en apprendre plus ici.

Alors… Qu’est ce que j’ai trouvé à propos de Node.js:

J’ai commencé mes recherches sur nodejs.org. Voici la définition sur leur page d’accueil: « Node.js est une plateforme construite sur le JavaScript runtime de Chrome pour facilement construire un réseau d’applications rapide et évolutif. Node.js utilise un modèle événementiel, sans blocage I/O qui le rend léger et efficace, parfait pour des applications en temps réel avec un volume de données important qui fonctionne sur les appareils distribués. »

Hmm, d’accord, cela commence à se clarifier. Node.js est une plateforme qui utilise runtime Javascript de Chrome; Il s’agit d’une référence au moteur open source Javascript V8 de Google.

Prise de conscience n°1: Node.js est un système nécessitant le moteur Javascript de Google. 

v8-javascript-engine2Question: JavaScript n’a-t-il pas les moyens d’un navigateur? Parlons-nous bien  de construire des applications rapides, évolutives pour un navigateur web? Construire des applications évolutives pour des navigateurs web n’a aucun sens à mes yeux.

Dans ma quête de réponses, je suis tombé sur ce passionnant article sur Mozilla.org https://hacks.mozilla.org/2012/01/javascript-on-the-server-growing-the-node-js-community/

Cet article Mozilla explique que JavaScript était destiné au départ à être un navigateur ET une technologie de serveur. Il explique également que Node.js est une implémentation de serveur de JavaScript et est également single threaded. Encore plus intéressant.

Prise de conscience n°2: Node.js est utilisé pour construire des applications de serveur.

Cette information nous pose une question importante : Est-ce que ce n’est pas une mauvaise chose d’avoir un serveur d’application single threaded si vous voulez un haut degré d’évolutivité? Je devais poursuivre mes recherches.

Peut-être que cette affirmation est liée au dépassement de la nature single threaded du « modèle événementiel, sans blocage I/O qui le rend léger et efficace, parfait pour des applications en temps réel avec un volume de données important qui fonctionne sur les appareils distribués. »

Tout d’abord, j’ai besoin de comprendre ce que veut dire « événementiel ». La définition en soi est facilement compréhensible. Il y a beaucoup d’informations disponibles sur le web à propos des programmations événementielles mais je préfère cette description sur le site de l’Université de Princeton:

« Dans une programmation informatique, une programmation événementielle ou une programmation basée sur l’événement est un paradigme de programmation dans lequel le flux du programme est déterminé par les événements – par exemple sortie de capteur ou actions de l’utilisateur (clicks de souris, pressions de touches) ou messages d’autres programmes ou threads.

La programmation événementielle peut également être définie comme une technique d’architecture d’application dans laquelle l’application a une boucle principale qui est clairement séparée en deux sections: la première est la sélection événementielle (ou la détection événementielle), et la seconde est la gestion événementielle. Dans des systèmes intégrés, la même chose peut être obtenue en utilisant des interruptions à la place de laisser la boucle fonctionner sans cesse; dans ce cas, la partie originelle de l’architecture de situe dans le hardware.

Les programmes événementiels peuvent être écrits dans n’importe quel langage, même si la tâche est plus aisée avec les langages qui fournissent un haut niveau d’abstractions, comme les closures. Certains environnements de développement intégrés fournissent des assistants de génération de code qui automatisent les tâches les plus répétitives requises pour la gestion événementielle. »

Voici un article intéressant qui décrit une programmation événementielle en des termes plus facilement compréhensibles… http://architects.dzone.com/articles/nodejs-php-programmers-1-event.

Prise de conscience n° 3 : La plateforme Node.js fournit des abstractions qui facilitent le travail de création d’applications événementielles.

Cette prise de conscience soulève une question dans mon esprit: est-ce mieux, plus rapide ou plus évolutif d’utiliser une programmation événementielle plutôt qu’une programmation multi-threaded? Tenter de répondre à cette question est comme tomber dans un trou sans fond. Il y a une tonne d’arguments des deux côtés et rien qui ne me fasse pencher dans une direction ou dans l’autre. C’est comme l’un de ces choix que vous faites selon ce qui vous arrange. Je suis désolé, mais vous devrez découvrir par vous-même si multi-threaded ou événementiel est mieux pour vous.

Nous arrivons dans la dernière partie de la définition de Node.js… « qui le rend léger et efficace, parfait pour des applications en temps réel avec un volume de données important qui fonctionne sur les appareils distribués. »

Je me vois obligé de croire que c’est léger et efficace, car je ne suis pas un développeur, mais la dernière partie de la définition (services distribués) me pose une nouvelle question: Comment faites-vous pour mesurer une application Node.js?  Distribués implique une méthodologie horizontale de mesure, et comme nous l’avons découvert auparavant, Node.je est single threaded, ce qui veut dire que je ne peux utiliser qu’1 CPU à tout moment. Comment mesurez-vous Node.js quand vous avez une grosse pique de charge de travail? J’ai trouvé ma réponse dans cet excellent article de blog http://cjihrig.com/blog/scaling-node-js-applications/. Je vais le résumer ici: Node.js a des fonctionnalités que vous pouvez utiliser pour avoir une multitude de processus sur le même port. Chaque processus individuel peut utiliser un seul CPU alors vous pouvez mesurer un serveur multi-CPU en utilisant des processus multiples. Vous pouvez également profiter de mesurer à travers de multiples hébergeurs en utilisant un serveur web proxy inversé et à répartition des charges. Il s’agit d’un clustering plus traditionnel, cela devrait donc vous être familier si vous avez de l’expérience dans le fonctionnement des applications distribuées. Une autre partie importante de Node.js est de s’assurer que vous utilisez Node uniquement pour servir un contenu dynamique tout en déchargeant la distribution de contenu statique sur un serveur web comme nginx ou en utilisant un CDN.

Prise de conscience n°4 : Node.js mesure sur une base de processeur aussi bien qu’à travers des serveurs. 

Il y a apparemment beaucoup de success stories pour Node.js mais comme chaque technologie, il doit être appliqué correctement. Comme chaque framework de programmation il y aura un codage efficace et un codage à faible performance. Quiconque utilise Node.js devra avec le temps dépanner son/ses application/s à cause de problèmes de performance et d’évolutivité, et c’est là que Nodetime entre en jeu. Si vous utilisez actuellement Node.js, ou que vous projetez de l’utilisez pour une application, vous devriez lire ce blog sur le monitoring de Node.js ou uniquement aller sur le site web de Nodetime et commencer votre test gratuit dès aujourd’hui.