dimanche 23 octobre 2011

Client HTTP asynchrone avec node et coffescript

Un des points forts de Node est de pouvoir programmer facilement des fonctions asynchrones.  Ci dessous un exemple de programmation d'un client HTTP. Cette fonction va interroger une base NoSQL en faisant varier la clé de 0 à 4.  Le programme est en coffeescript,  il utilise la librairie api_request. disponible ici sur github



L’exécution de programme montre bien l'aspect asynchrone des requêtes : La boucle 'for' est exécutée sans interruption (les lignes : début de fonction) , puis Node commence à envoyer les requêtes au serveur Nosql dans un ordre qui n'est pas celui de la boucle.  Il commence par la 'clé 4' . Avec une boucle plus grande (ex : 100) on retrouve cette 'clé 4' en première requête. Cette valeur peut changer sur une autre machine.  Pendant la boucle for , le gestionnaire d’évènement se contente de stocker les demandes, puis en   fonction de son cycle interne , profite des interruptions pour réaliser les requêtes. Avec une boucle de 100 requêtes, les 10 premières sont en vrac puis le système se régule. Dans un système asynchrone, la fonction appelée retourne un callback  (fonction de retour) et se termine. Ce callback sera appelé lors de la réalisation  de l’évènement associé.
 
Il existe des moyens pour enchaîner des actions synchrones  dans un univers asynchrone (ce n'est pas une aberration) . Le callback doit prévoir cet  enchainement d'action.

exemple :



La fonction de callback fait un appel récursif tout en incrémentant  la clé. A la réception de réponse du serveur, un évènement sera déclenché. La fonction callback associée à la réalisation de l'évènement sera appelé et cette fonction fournira l’enchaînement suivant. On utilise dans cet exemple des techniques de programmation fonctionnelle, ce n'est pas un hasard. Les fonctions callback se déclenchent dans un temps incertain et surtout avec des variables globales dans un état lui aussi incertain. La programmation fonctionnelle donne des modes de résolution pour ce type de problème avec des  variables partagée.





Aucun commentaire: