Archives pour la catégorie NodeJS

Profiler son application NodeJS

Je me suis essayé à un exercice dont je n’ai pas l’habitude: faire du profilage d’applications. Je n’en ai généralement pas eu besoin, les bottlenecks étant souvent faciles à identifier dans les applications sur lesquelles j’ai travaillé, mais viendra tôt ou tard le jour où on se demande si on ne peut pas simplement « faire mieux ». Il n’y a pas de problème particulier, pas d’URL ou de fonction spécifiquement lente identifiée, et dans ce cas si on veut améliorer les performances il faut qu’on trouve déjà où ça pourrait être amélioré 😉

Je pars d’assez loin, ma seule expérience tient dans XDebug et KCachegrind avec PHP. Expérience plutôt concluante d’ailleurs.

Le paysage est beaucoup moins rose du côté de Node.JS, d’une part à cause du peu d’outils « finis » disponibles. Pour résumer, la plupart des outils que j’ai trouvés me semblent plus utiles aux développeurs de V8 qu’au développeur JavaScript… Si vous avez la flemme de lire ce roman, vous pouvez passer directement à la conclusion où vous trouverez un tableau récapitulatif absolument subjectif 😉

Sommaire

Avertissement

Je préviens les pro du profiling qu’il y aura dans cet article de probables énormités sans doute impardonnables. Je vous demande deux choses: aidez-moi à corriger ces énormités :) mais prenez quand-même le temps de vulgariser à destination des débutants (m’incluant) 😉

Lire la suite

Les domaines dans Node.JS, à quoi ça sert ?

Les domaines sont l’une des grandes nouveautés de Node.JS 0.8.

J’étais un peu circonspect quand je les ai vus arriver, ayant un peu de mal à comprendre le cas pratique auquel ils répondaient. Puis je suis tombé sur un cas dans la vraie vie :) Je vais vous le partager en version simplifiée, et on va voir comment le corriger à l’aide des domaines.

Lire la suite

Maîtrisez Node.JS en 2 jours ;)

Avec ce titre un peu pompeux, je vais tacher aussi de reprendre l’animation de ce blog hyperactif.

Il y a eu pas mal de changements dans ma vie professionnelle, et je développe avec Node quotidiennement aujourd’hui sur un « vrai » projet (du genre qui sera en ligne et rapportera de l’argent, pas du genre localhost:8000), et j’ai donc encore plus de choses à dire, d’autant plus qu’il y a eu pas mal de nouveautés avec la récente 0.8. Mais pour ça il faut juste que je me sorte les doigts du c** pour m’y mettre un peu plus sérieusement 😉

Bref, pour l’instant ce billet servira surtout à faire mon auto-promotion pour vous rappeler que je fais de la formation autour de Node.JS: un atelier pratique sur 2 jours permettant de survoler une bonne partie de la techno et d’aller en profondeur sur les points les plus importants. Ça coûte moins de 1000 euros, et ça passe par l’institut de formation Clever Institut (donc pas de souci pour utiliser le D.I.F., passer tout ça en budget formation, et tous les montages dont vous avez l’habitude).

Il y a pour l’instant 2 inscrits à ma connaissance à l’atelier du 15 octobre, et il y a une autre session prévue en décembre. Autant vous dire qu’avec si peu de monde, on peut largement se permettre de sortir des clous et donc de faire du « sur mesure » si besoin. Je pense que ça reste vrai jusqu’à 4 ou 5 personnes, donc n’hésitez pas à me contacter ou à vous inscrire directement depuis le site, et si jamais vous souhaitez une session avec peu de monde dites-le qu’on décale en décembre si jamais il s’avère que ma pub est efficace 😉

Je suis à votre disposition pour en parler, le programme est sur la fiche mais je vous le remets ici.


Le stage se déroulera au fil des chapitres abordés, autour de la réalisation d’une application simple et fonctionnelle, permettant la mise en application concrète des concepts abordés.
PROGRAMME DE LA 1ERE JOURNEE DE FORMATION
Introduction

  • Présentation de NodeJS
    • Installation et utilisation du REPL
    • Le JS côté serveur, pourquoi ?
    • La « single-threaded event loop », c’est quoi ?
  • API non bloquante: pourquoi faire ?
  • La programmation asynchrone: avantages et pièges à éviter
    • Gérer la soupe de callbacks avec « Async »
  • Les modules: pourquoi, comment ?
  • Structure d’un module
  • Rechercher et installer avec NPM

Une application Web avec Node.JS : atelier

  • Description du projet fil rouge
  • Écrire un serveur avec NodeJS
  • Se simplifier la vie avec « Express »
    • Le routage
    • La vue: choisir le bon moteur de template
    • Gérer les fichiers statiques
  • Tests unitaires et fonctionnels avec « Mocha »
  • Packaging de l’application avec NPM

Bases de données SQL et NoSQL : atelier

  • Les librairies d’accès aux bases de données
  • NoSQL: MongoDB et Redis

PROGRAMME DE LA 2NDE JOURNEE DE FORMATION
La communication en temps réel : atelier

  • Intégration des WebSockets HTML5 avec « Socket.IO »
    • Présentation de la technologie
    • Intégration côté serveur
    • Intégration côté client
  • Communication inter-processus en temps réel:
    • Le pub/sub avec Redis.
    • AMQP dans NodeJS: RabbitMQ et ZeroMQ.

Hautes performances : atelier

  • Cluster: Utiliser tous les processeurs de sa machine
  • Cluster et données partagées: la solution haute performances Redis
  • Bonus spécial troll: comparons avec l’équivalent Apache/PHP

Conclusion et conseils

  • Retour sur les bonnes pratiques de développement NodeJS
  • Veille: Comment faire le tri dans les milliers de modules disponibles ?
  • Distribution du projet fil rouge séparé en étapes pédagogiques.

N’hésitez pas à me poser des questions, ou même à me faire des critiques sur ce programme :)

Et si jamais vous souhaitez me contacter hors commentaire public, j’ajoute une page « contact » :)

Écrire un service REST avec NodeJS et Express – partie 2/3: jouons avec les middlewares

Dans la première partie, nous avions écrit (en mode TDD un peu raccourci) un service REST. On est quand-même allés au bout, mais ça restait améliorable.

Dans cette seconde partie nous allons jouer avec les middlewares Express pour factoriser, ajouter diverses vérifications sur les données, etc… Afin de ne pas imposer de pavés trop lourd, je garderai finalement pour un 3e article l’intégration du support de nouveaux formats, et l’écriture d’une doc agréable à utiliser.

Sommaire

Lire la suite

Écrire un service REST avec NodeJS et Express – partie 1/3: implémentation de départ

Une fois n’est pas coutume, je découperai ce tutorial en plusieurs articles distincts, histoire de voir si j’arrive à écrire des articles plus courts 😉

Nous allons voir en détail comment mettre en place un webservice RESTful avec NodeJS et le framework Express. L’objet de ce webservice sera la gestion d’une base de favoris.

Sommaire

MÀJ Oups, j’avais oublié la partie pour réellement jouer avec notre service ^^

Lire la suite

Authentification et WebSocket, avec Node.JS, Express, et Socket.IO

ATTENTION : certaines portions de code présentées ici sont valables pour Express 2.x et ne fonctionnent plus avec Express 3.x. Il s’agit principalement de la partie traitant du parsing de cookie, l’articles reste à 95% valable, mais vous trouverez les détails pour Express 3 dans cet article → Authentification WebSocket avec les sessions Express 3.x et Socket.IO

La première fois qu’on utilise les websockets, on se dit que c’est compliqué (pas tant que ça en fait). Puis on utilise socket.io, et on se dit que c’est vraiment super simple :) Et puis un jour on aimerait bien sécuriser la connexion au socket, parce que la partie « temps réel » nécessite d’être authentifié, ou simplement parce qu’il faut un pré-requis (comme avoir donné son nom avant de pouvoir chatter) avant que l’écoute ne démarre réellement.

La première idée qu’on a est de se trimballer des flags et d’activer/désactiver l’écoute de certains messages en fonction de ces flags (par exemple: tant que l’utilisateur n’a pas donné son nom, les évènements « message envoyé » sont ignorés). Le problème est que la connexion est pourtant déjà ouverte, des données y transitent déjà, et c’est donc vraiment très loin d’être idéal. De manière plus générale, il semble très complexe de communiquer avec la session utilisateur au sein du websocket. En effet on a un code de ce genre, où l’on voit bien qu’il semble impossible de manipuler la session utilisateur dans le cadre d’un websocket vu qu’il n’y a aucune notion de « request »:

sockets.on('connection', function (socket) {
  // But...
  socket.on('msg', function (data) {
    // ... where the fuck is my session?
  });
});

On va voir que le protocole est bien fait et que la connexion se fait au sein d’une enveloppe HTTP standard, et qu’on a donc accès à tous les headers d’une requête HTTP, notamment les cookies, permettant de récupérer par exemple un ID de session, et donc de lire/modifier la session utilisateur depuis le websocket!

Sommaire:

  1. Gestion des sessions avec Express
  2. Sécuriser une page
  3. Utilisation de Socket.IO
  4. Manipulation de la session utilisateur depuis un WebSocket, et sécurisation de la connexion
  5. Gestion des connexions mutiples
  6. Aller plus loin…

Note: si vous connaissez déjà bien Express et Socket.IO, vous êtes encouragé à sauter directement au chapitre 4 (éventuellement, le chapitre 2 peut rester intéressant). Le reste ne vous apprendra rien.

Retrouvez le code complet des exemples sur GitHub.

Benchmark Node.JS: méthodes synchrones ou asynchrones ?

On dit souvent que les méthodes asynchrones apportent à Node.JS un avantage dans sa gestion des accès concurrents. On dit que pour une opération aussi coûteuse que de la lecture sur le disque par exemple, il saura gérer plus de connexions, et dans l’ensemble répondre plus vite si cette opération est faite en utilisant l’API asynchrone plutôt que l’API synchrone.

OK. Soit. En ce qui me concerne je n’ai pas le niveau technique pour comprendre les tenants et les aboutissants de tout ça, donc comment m’en convaincre? Et bien, benchmarkons :)

Partons d’un serveur HTTP très simple: il n’a qu’une page, qui affiche « coucou gamin » dès que le serveur a fini de lire un fichier local de quelques méga-octets.

Dans la suite de l’article je vais vous proposer 3 implémentations de ce serveur, et les résultats d’un test par Apache Bench.

Lire la suite

Bonnes pratiques pour gérer son code asynchrone en Javascript

Comme on l’a déjà vu, en Javascript, et principalement avec Node.JS, les appels à des méthodes non bloquantes exécutant leur traitement de manière asynchrone permet de faire du multi-tâche de manière très simple et performante. Néanmoins, un piège dans lequel on tombe rapidement est la cascade d’appels asynchrones.

On va prendre deux exemples, et voir comment les rendres plus lisibles dans la suite de cet article :)

Lire la suite

Présentation de Node.JS et du framework Express

Je me rends compte que dans ce blog je vous parle de Node.JS et d’Express, sans vous avoir jamais présenté ces technologies. Allez, revenons vite fait aux bases :)

Installation

Pour l’installation, je vous renvoie au site officiel, ou à un article en français par Atinux, mais globalement l’installation se résume à ces 3 lignes:

git clone https://github.com/ry/node.git
cd node
./configure && make && sudo make install

Présentation de Node.JS

Node.JS est un projet open-source se basant sur le moteur « V8 » de Chrome (il existe un fork « SpiderNode » par Mozilla, basé sur leur moteur SpiderMonkey).

Il s’agit donc finalement d’un simple interpréteur Javascript, exécutable, et enrichissant le langage avec sa propre API (accès au système de fichier, à la couche réseau, etc.). Ça permet, en résumé, d’exécuter des fichiers « .js » comme des scripts PHP, Python, Ruby, etc…

La spécificité n’est pas vraiment là (après tout, exécuter du JS en ligne de commande, ça se fait déjà), mais évidemment sur son API, toute entière orientée vers le non bloquant, c’est-à-dire que la plupart des commandes, notamment d’accès au système de fichier, rendront la main directement sans attendre la réponse du système, ceci étant largement simplifié par l’orientation évènementielle de Javascript. C’est ce choix de conception, ainsi que le choix du moteur V8 qui offre d’excellentes performances, qui permet d’écrire des applications avec d’excellents temps de réponse, et notamment des serveurs (web ou autres). Son API d’accès à la couche réseau (le protocole HTTP y est implémenté) couplé à cette capacité de gestion des accès concurrents en font évidemment un excellent candidat pour écrire des applications web.

Lire la suite

Node.js & Express: comment packager et partager ses applications

S’il y a bien une chose qui craint avec les technologies « cool » et récentes, c’est la doc. Et Node.JS (ou plutôt la grande majorité de ses modules, car l’API de Node elle-même est plutôt bien documentée) n’échappe pas à la règle, et les contributions de @visionmedia quoi que d’excellentes facture et très populaires, en sont hélas une illustration 😉 Du coup, il y a des fonctionnalités qu’on ne découvre qu’en farfouillant dans le code…

Je refléchissais en ce moment à un moyen de « packager » les applications Express dans Node.JS, de manière à les réutiliser. Naïvement, j’étais persuadé que ça n’était pas possible, et je suis parti dans le développement d’un framework permettant de simplifier ce packaging, avec des vues embarquées, etc… Naïf, oui, car évidemment cette fonctionnalité existe déjà dans Connect (la couche sous Express): quand on appelle app.use(une_autre_app), c’est comme si on « fusionnait » les deux applications. Ce comportement, ainsi que les valeurs de configuration disponibles, étant très mal documentées, je vais vous en parler ici :)

Lire la suite