Mis à jour le mardi 2 janvier 2018
  • 10 heures
  • Difficile

Ce cours est visible gratuitement en ligne.

Ce cours existe en livre papier.

Vous pouvez obtenir un certificat de réussite à l'issue de ce cours.

Vous pouvez être accompagné et mentoré par un professeur particulier par visioconférence sur ce cours.

J'ai tout compris !

Optimiser son application

Connectez-vous ou inscrivez-vous gratuitement pour bénéficier de toutes les fonctionnalités de ce cours !

Par conception, le moteur v8 de Node.js ne prend pas pleinement capacité des machines multi-coeur actuelles.

Pour pallier cela, les développeurs Node.js ont prévus le mode cluster. Grâce à lui, Node.js va lancer une application maître (master) qui va ensuite lui-même créer des travailleurs (worker) et leur donner des ordres.

Mais alors... Je vais devoir changer le code de mon application ?  :o

Le mode cluster dans PM2

Pas de panique ! PM2 implémente le système de cluster Node.js automatiquement et peut l'utiliser pour votre application. Pour lancer 4 instances de votre application, il suffit de faire :

pm2 start app.js -i 4

Voyons à quoi ressemble maintenant notre pm2 ls :

pm2 ls cluster
pm2 ls cluster

Vous voyez maintenant 4 processus, chacun avec un ID différent et sa propre gestion des ressources de l'ordinateur. Et au niveau des logs ?

pm2 logs cluster
pm2 logs cluster

Chacune des instances de l'application a bien envoyé son message. Et elles écoutent toutes le même port !

(Stress) Testons tout ça !

C'est bien beau mais comment pouvons-nous vérifier que les charges sont bien réparties ? Nous allons utiliser un module Node.js appelé artillery qui va nous permettre d'ouvrir un grand nombre de connexions simultanées sur notre application. Elle va avoir chaud. :diable:

Installation d'artillery :

npm install artillery -g

Pour les besoins du test, j'ai corrigé l'application précédente :

var http = require('http');

var server = http.createServer(function(req, res) {
  res.writeHead(200);
  res.end('Salut tout le monde !');
});

server.listen(8080); // Démarre le serveur
console.log("j'ecoute sur 8080")

Maintenant que c'est fait, je vous explique la procédure : grâce à la commande pm2 scale, PM2 peut augmenter ou réduire le nombre d'instances déployées.

Dans un premier temps, nous allons tester sur une seule instance : on va donc écrire la commande pm2 scale app 1.

Artillery possède un bon nombre d'options. Ici, nous allons simuler 100 nouveaux utilisateurs par seconde qui feront 20 requêtes chacun pendant un total de 10 secondes. Cela fait 20 000 requêtes en 10 secondes ! :waw:

artillery quick -d 10 -r 100 -n 20 http://127.0.0.1:8080

Pour pouvoir suivre le déroulement en temps réel de la charge de votre application, lancez une nouvelle fenêtre de console et tapez pm2 imonit. Vous devriez voir un résultat similaire à l'image ci-dessous :

single load
single load

Voici les logs finaux de notre application. Selon votre machine, la performance peut varier énormément :

artillery cluster 1
artillery cluster 1

Et maintenant, place à 4 instances ! pm2 scale app 4, et on est parti pour relancer la commande artillery. :)

pm2 monit load
pm2 monit load

Et hop ! Chacune des instances reçoit une partie de la charge, et la répartition reste assez égale. Regardez les résultats du test :

artillery mode cluster 4 instances
artillery mode cluster 4 instances

Et voilà ! Le rapport d'artillery est assez complet, mais la statistique la plus importante est le median, la médiane du temps de requête. Elle permet de prévoir en combien de temps un nouveau client sera servi dans ces conditions de trafic. Et ici on passe de 1.2 ms sur une instance à 0.4 ms sur 4, soit trois fois plus rapide ! Pas mal pour 2000 requêtes par seconde. :soleil:

 

Cette partie vous a permis de connaître les notions nécessaires à l'opération d'un serveur Node.js en production, depuis les erreurs basiques à éviter jusqu'au benchmark (banc d'essai) d'une application simple ! Si vous avez trouvé cela intéressant, alors vous avez peut-être l'âme d'un DevOps (cf Wikipédia), un hybride entre développement et gestion opérationnelle qui s'occupe de problématiques de déploiement et d'optimisation d'applications. N'hésitez pas à vous renseigner sur le sujet !

 

Exemple de certificat de réussite
Exemple de certificat de réussite