Difference between revisions of "EA2013 Principes et canvas de programmation evenementiels"

From air
Jump to navigation Jump to search
Line 18: Line 18:
 
== Node.js arrive chez Linked'In ==
 
== Node.js arrive chez Linked'In ==
 
=== Le premier avantage: les performances dans une application riche ===
 
=== Le premier avantage: les performances dans une application riche ===
Pour leurs application mobile en HTML5, le réseau social utilisait 30 serveurs pour gérer l'application avec le framework ruby on rails. Pour des raisons de performances la société a choisit d'utiliser un canvas de programmation évenementielle et ont chosit la technologie [[Node.js]]. Résultat la nouvelle application sous node.js ne demandais que 3 serveurs avec une amélioration des performances jusqu'à 20 fois selon certains scénarios.
+
Pour leurs application mobile en HTML5, le réseau social utilisait 30 serveurs pour gérer l'application avec le framework ruby on rails. Pour des raisons de performances la société a choisit d'utiliser un canvas de programmation événementielle et ont choisit la technologie [[Node.js]]. Résultat la nouvelle application sous [[Node.js]] ne demandais que 3 serveurs avec une amélioration des performances jusqu'à 20 fois selon certains scénarios.
   
 
=== Regroupement des équipes ===
 
=== Regroupement des équipes ===
Line 26: Line 26:
 
[[File:Netcraft_server_part_market.png|thumb|upright=2.5|alt=Server market| Part des différentes solutions de serveurs web de 2000 à 2013]]
 
[[File:Netcraft_server_part_market.png|thumb|upright=2.5|alt=Server market| Part des différentes solutions de serveurs web de 2000 à 2013]]
   
Apache la solution historique est le leader des serveurs webs dans le monde avec une part de marché d'environ 60% depuis 10 ans. la solution IIS de Microsoft, historiquement 2éme du marché a quant à celle perdu au fur et à mesure des part de marché de (25% en 2000 à 10% en 2013). Seul Nginx et Google progressent et gagne des parts. Google ne partage ni ne commercialise sa solution et sa progression ne reflète que la croissance de la société et l'importance de sa présence sur le Web. Nginx est un serveur web open-source événementiel qui en cinq ans est devenus la seconde solution de serveur web, ce qui démontre l’intérêt qui est consacrer à la programmation événementielle.
+
Apache la solution historique est le leader des serveurs webs dans le monde avec une part de marché d'environ 60% depuis 10 ans. la solution IIS de Microsoft, historiquement 2éme du marché a quant à celle perdu au fur et à mesure des part de marché de (25% en 2000 à 10% en 2013). Seul [[Nginx]] et Google web server progressent et gagne des parts. Google ne partage ni ne commercialise sa solution et sa progression ne reflète que la croissance de la société et l'importance de sa présence sur le Web. [[Nginx]] est un serveur web open-source événementiel qui en cinq ans est devenus la seconde solution de serveur web, ce qui démontre l’intérêt qui est consacrer à la programmation événementielle.
   
 
=La Programmation événementielle =
 
=La Programmation événementielle =
Line 49: Line 49:
 
</pre>
 
</pre>
   
L'éxècution des lignes 2, 3, 4 ne sera pas séquentiel, le traitement de la ligne 4 peut très bien se terminer avant le traitement de la ligne 2 ou 3. Il est donc possible d'avoir un traitement des fichiers dans n'importe quel ordre (fichier 3,1,2 par exemple).
+
L’exécution des lignes 2, 3, 4 ne sera pas séquentiel, le traitement de la ligne 4 peut très bien se terminer avant le traitement de la ligne 2 ou 3. Il est donc possible d'avoir un traitement des fichiers dans n'importe quel ordre (fichier 3,1,2 par exemple).
   
 
= Solutions existantes =
 
= Solutions existantes =
Line 64: Line 64:
   
   
Ces deux graphes comparent les deux principaux logiciels de serveur web libre du marché: Apache et Nginx. Apache est séquentiel tandis que Nginx s'appuie sur la programmation événementielle. Ce benchmark mesure l’efficacité de ces deux logiciel en fonction du nombre de requête traitées et de la consommation mémoire en fonction du nombre de client simultanés. Le résultat est très sévère pour Apache sur ces deux plans, cependant les requêtes sont faites sur un simple fichier statique, Avec des données dynamique la différence est moins évidente. NginX est donc une excellente solution pour des applications nécessitant de nombreux fichiers statiques.
+
Ces deux graphes comparent les deux principaux logiciels de serveur web libre du marché: Apache et [[Nginx]]. Apache est séquentiel tandis que Nginx s'appuie sur la programmation événementielle. Ce benchmark mesure l’efficacité de ces deux logiciel en fonction du nombre de requête traitées et de la consommation mémoire en fonction du nombre de client simultanés. Le résultat est très sévère pour Apache sur ces deux plans, cependant les requêtes sont faites sur un simple fichier statique, Avec des données dynamique la différence est moins évidente. NginX est donc une excellente solution pour des applications nécessitant de nombreux fichiers statiques.
   
 
== Node.js ==
 
== Node.js ==
Line 70: Line 70:
 
* 2 ans d’existence
 
* 2 ans d’existence
 
* Javascript ou CoffeeScript
 
* Javascript ou CoffeeScript
* Nombreux Frameworks: express, sails.js
+
* Nombreux Frameworks: Express, Sails.js
 
* Gestionnaire d’extensions npm
 
* Gestionnaire d’extensions npm
   
Line 77: Line 77:
 
=== Hello Node.js ===
 
=== Hello Node.js ===
   
Un Simple Hello world avec Node.js, plateforme d'application javascript.
+
Un Simple Hello world avec [[Node.js]], plateforme d'application javascript.
   
 
var http = require('http');
 
var http = require('http');
Line 93: Line 93:
 
>> Hello Node.js !
 
>> Hello Node.js !
   
=== Un exemple illustrant le paradigme évènementiel ===
+
=== Un exemple illustrant le paradigme événementiel ===
   
Ce second exemple reprend le code précédent en ajoutant de la lecture de fichier pour illustrer le paradigme évènementiel de Node.js.
+
Ce second exemple reprend le code précédent en ajoutant de la lecture de fichier pour illustrer le paradigme événementiel de [[Node.js]].
   
 
<pre>
 
<pre>
Line 125: Line 125:
 
>> Contenu du fichier myfile.txt
 
>> Contenu du fichier myfile.txt
   
Le temps de lecture étant considérable, la ligne 18 a pu être éxecutée avant que la lecture de fichier (ligne 15) n'ai pu terminer son traitement.
+
Le temps de lecture étant considérable, la ligne 18 a pu être exécutée avant que la lecture de fichier (ligne 15) n'ai pu terminer son traitement.
   
 
= Conclusion =
 
= Conclusion =
La programmation évènementiel:
+
La programmation événementiel:
* Néccésite une bonne comprehension du paradigme évènementiel et des bonnes pratiques à mettre en place.
+
* Nécessite une bonne compréhension du paradigme événementiel et des bonnes pratiques à mettre en place.
 
* Avantages de performances pour:
 
* Avantages de performances pour:
 
** Application avec beaucoup de contenus statique (css, images, fichier javascript)
 
** Application avec beaucoup de contenus statique (css, images, fichier javascript)
** Application à forte solicitations de fichiers (Bases de données ou API externes)
+
** Application à forte sollicitations de fichiers (Bases de données ou API externes)
 
* Particulièrement utile pour les applications temps réel, de streaming, ou plus généralement pour les applications webs riches.
 
* Particulièrement utile pour les applications temps réel, de streaming, ou plus généralement pour les applications webs riches.
   

Revision as of 12:36, 17 November 2013

Server market
node.js, Nginx twisted et tornado

Présentation

Abstract

In computer programming, event-based programming is a programming paradigm in which the flow of the program is determined by events like sensor outputs or user actions (mouse clicks, key presses) or then messages from other programs or threads. It exists some programming canvas to implement this kind of programming paradigm, Node.js, Twisted and nginx will be present here.

Résumé

En informatique, une programmation événementielle se dit d'un paradigme de programmation fondé sur les événements. Elle s'oppose à la programmation séquentielle. Le programme sera principalement défini par ses réactions aux différents événements qui peuvent se produire, c'est-à-dire des changements d'état de variable, par exemple l'incrémentation d'une liste, un mouvement de souris ou de clavier. Il existe de nombreux canvas de présentation permettant ce type de programmation,Node.js, Twisted et nginx seront présentés ici.

Motivations

Node.js arrive chez Linked'In

Le premier avantage: les performances dans une application riche

Pour leurs application mobile en HTML5, le réseau social utilisait 30 serveurs pour gérer l'application avec le framework ruby on rails. Pour des raisons de performances la société a choisit d'utiliser un canvas de programmation événementielle et ont choisit la technologie Node.js. Résultat la nouvelle application sous Node.js ne demandais que 3 serveurs avec une amélioration des performances jusqu'à 20 fois selon certains scénarios.

Regroupement des équipes

Le second aspect est la possibilité qui est offerte aux ingénieurs front-end JavaScript de pouvoir participer au code du serveur. Les deux équipes ont finalement été fusionnées en une seule au sein de l'entreprise.

Nginx numéro 2 en 5 ans

Server market
Part des différentes solutions de serveurs web de 2000 à 2013

Apache la solution historique est le leader des serveurs webs dans le monde avec une part de marché d'environ 60% depuis 10 ans. la solution IIS de Microsoft, historiquement 2éme du marché a quant à celle perdu au fur et à mesure des part de marché de (25% en 2000 à 10% en 2013). Seul Nginx et Google web server progressent et gagne des parts. Google ne partage ni ne commercialise sa solution et sa progression ne reflète que la croissance de la société et l'importance de sa présence sur le Web. Nginx est un serveur web open-source événementiel qui en cinq ans est devenus la seconde solution de serveur web, ce qui démontre l’intérêt qui est consacrer à la programmation événementielle.

La Programmation événementielle

Le principe

  • Un seul thread avec une boucle événementielle
  • Rendre la main rapidement
  • Pas d’appels bloquants
  • Déléguer les gros calculs (fork, threads,...)

L'analogie du roi

“Le roi ordonne à ses messagers, qui reviennent dès qu'ils le peuvent, et le roi traite les réponses au fur et à mesure, une à la fois.”

Conséquences

1 //lecture de 3 fichiers
2 fs.readFile('fichier1', /* ... */ );
3 fs.readFile('fichier2', /* ... */ );
4 fs.readFile('fichier3', /* ... */ );
5 
6 //Impossible de prédire 
7 //l'ordre de réponse

L’exécution des lignes 2, 3, 4 ne sera pas séquentiel, le traitement de la ligne 4 peut très bien se terminer avant le traitement de la ligne 2 ou 3. Il est donc possible d'avoir un traitement des fichiers dans n'importe quel ordre (fichier 3,1,2 par exemple).

Solutions existantes

Les principales solutions

Serveur web uniquement

  • NginX: logiciel de serveur Web

Plateforme d’applications

  • Node.js: Javascript
  • Twisted: (Python) Solution historique en perte de vitesse.
  • Tornado: (Python) Projet récent mené par Facebook en pleine expansion.

10 000 req/s avec NginX

Benchmark Nginx


Ces deux graphes comparent les deux principaux logiciels de serveur web libre du marché: Apache et Nginx. Apache est séquentiel tandis que Nginx s'appuie sur la programmation événementielle. Ce benchmark mesure l’efficacité de ces deux logiciel en fonction du nombre de requête traitées et de la consommation mémoire en fonction du nombre de client simultanés. Le résultat est très sévère pour Apache sur ces deux plans, cependant les requêtes sont faites sur un simple fichier statique, Avec des données dynamique la différence est moins évidente. NginX est donc une excellente solution pour des applications nécessitant de nombreux fichiers statiques.

Node.js

  • Basé sur le moteur V8 de chrome
  • 2 ans d’existence
  • Javascript ou CoffeeScript
  • Nombreux Frameworks: Express, Sails.js
  • Gestionnaire d’extensions npm

Démonstration

Hello Node.js

Un Simple Hello world avec Node.js, plateforme d'application javascript.

var http = require('http');
var url = require('url');

http.createServer(function (request, response) {
   response.writeHead(200, {'Content-Type': 'text/plain'});
   response.write('Hello Node.js !');
   response.end();
}).listen(4242);

console.log('Server started');

Résultat:

 >> Hello Node.js !

Un exemple illustrant le paradigme événementiel

Ce second exemple reprend le code précédent en ajoutant de la lecture de fichier pour illustrer le paradigme événementiel de Node.js.

1 var http = require('http');
2 var fileSystem = require('fs');
3
4 http.createServer(function (request, response) {
5
6    function writeCallback(data){
7        response.write(data);
8    }
9
10   function closeCallback(){
11       response.end();
12   }
13
14   response.writeHead(200, {'Content-Type': 'text/plain'});
15   var read_stream = fileSystem.createReadStream('myfile.txt'); // Lecture du fichier myfile.txt
16   read_stream.on('data', writeCallback); //Ajout de listeners sur la lecture de fichier
17   read_stream.on('close', closeCallback);
18   response.write('Cette ligne est exécuté avant la fin de la lecture du fichier <br>');
19
20 }).listen(4242);
21 console.log('Server started');

Résultat:

>> Cette ligne est exécuté avant la fin de la lecture du fichier
>> Contenu du fichier myfile.txt

Le temps de lecture étant considérable, la ligne 18 a pu être exécutée avant que la lecture de fichier (ligne 15) n'ai pu terminer son traitement.

Conclusion

La programmation événementiel:

  • Nécessite une bonne compréhension du paradigme événementiel et des bonnes pratiques à mettre en place.
  • Avantages de performances pour:
    • Application avec beaucoup de contenus statique (css, images, fichier javascript)
    • Application à forte sollicitations de fichiers (Bases de données ou API externes)
  • Particulièrement utile pour les applications temps réel, de streaming, ou plus généralement pour les applications webs riches.

Références

  • Programmation événementielle [1]
  • Node chez linkedin [2]
  • Site officiel de node.js [3]
  • Part de marchés des serveurs [4]
  • Benchmark Nginx [5]
  • Présentation de node: [6]
  • Ressources pour la démonstration: [7]