Accueil > Divers > REX node.js dans un projet front

REX node.js dans un projet front

Pitch projet

Il s’agit de réaliser une plate-forme web permettant d’organiser des évènements musicaux privés en direct. Le matériel musical est mémorisé dans des vidéos Youtube®. Cette plate-forme contient :

  • La gestion de la programmation des sessions DJ.
  • Une interface DJ pour gérer l’enchaînement et un mixage sonore des vidéos.
  • Un système de votes et un chat en temps réel.

La plate-forme doit supporter environ 100 utilisateurs connectés simultanément avec une tolérance de quelques secondes maximums de latence. Elle doit simuler le fonctionnement d’un streaming vidéo.

Solution

On simule un flux vidéo en synchronisant l’affichage des vidéos sur tous les navigateurs connectés en même temps ; en s’assurant que tous les utilisateurs voient la même chose en même temps. La capture d’écran ci-dessus montre l’interface DJ. Chaque action du DJ (volumes A et B, switch video et crossfader) est transmise au serveur puis dispatchée aux auditeurs via une web-socket.

Le choix de la solution s’est porté sur node.js pour ses capacités de push et sa facilité de mise en place. En général, node.js n’est pas utilisé seul car il n’est pas bon dans tous les cas. Les fichiers WEB sont servis par Apache et PHP.

La logique contenue dans node.js gère (entre autres) :

  • L’association de la socket avec la session PHP. Opération simple d’initialisation, nécessaire à la cohabitation des deux mondes.
  • La réception et la diffusion des messages ASAP

Le terme ASAP est plus proche de la réalité que le terme temps-réel. Le moteur (V8) de node.js contient un garbage collector qui rend difficile voire impossible de maîtriser le temps d’exécution.

Remarque, à plein régime, la latence constatée ne dépasse pas 500ms sur une machine bas de gamme.

Exemple de code de gestion des sessions/sockets.

Dans le tiers node.js, la connexion web-socket représente un utilisateur.  La socket étant un objet javascript, on le complète avec les données de session.

//////// CLIENT ////////

// Le module socket.io sert lui-même son client js au navigateur via http sur le port ouvert pour servir la websocket.

var urlNode = "http://domaine:port/";
var socket = io.connect(urlNode, {
    // (...)
    'reconnect':true
});

// Reception du message arbitraire 'ready'
socket.on('ready', function(data) {
    // Connexion établie
    var msg = {};
    msg.sessionId = "1234567890";
    socket.emit('whatever', msg);
});

// Message prédéfini
socket.on('connect_failed', function () {
    // gestion des erreurs de connection
    // Autres messages prédéfinis : error, reconnect_failed, disconnect
});
//////// SERVER ////////

var socket_io = require('socket.io');
// Création du serveur de WSocket
var io = socket_io.listen(port);
// Paramétrage socket.io
// Voir : https://github.com/LearnBoost/Socket.IO/wiki/Configuring-Socket.IO
io.configure(function() {
    // (...)
    io.set('transports', [ 'websocket', 'flashsocket', 'htmlfile', 'xhr-polling', 'jsonp-polling' ]);
});
// Création des callbacks
io.sockets.on('connection', function socketOnConnection(socket) {

    socket.on('disconnect', function socketOnDisconnect() {
        // Exécuté quand la connexion est perdue.
    });

    // Réception d'un message
    socket.on('whatever', function socketOnWhatever(data) {
        // 'whatever' est une string envoyée par le client
        // data est un objet contenant les données transmises par le client.
        // socket est l'objet du scope 'socketOnConnection' qui représente la connexion.
        // par exemple renvoyer des données au client : socket.json.emit('whateverback', data);
    });

    socket._session = {};
    // Init des données session utilisateur
    socket._session.lang = 'fr';
    socket._session.userData = {};
    socket._session.userData.identified = false;

    // io.sockets.clients() contient un array d'objets Socket.
    console.log('New connexion. Total connected : ' + io.sockets.clients().length);

    socket.json.emit('ready', {});
});

Notes

Socket.io est très pratique pour gérer les messages échangés entre le client web et le serveur. Il gère aussi des namespaces (rooms). Il ne permet pas de gérer les données binaires nativement. Il faut envisager d’autres solutions pour les uploads d’images ou pour exploiter les données webRTC.

Node.js en deux mots : ”Node.js is a platform built on Chrome’s JavaScript runtime for easily building fast, scalable network applications. Node.js uses an event-driven, non-blocking I/O model that makes it lightweight and efficient, perfect for data-intensive real-time applications that run across distributed devices.”

On peut penser à Node.js pour répondre à un besoin d’architecture Single Page, temps-réel léger. Une solution facile et rapide à mettre en place pour faire du push vers le navigateur. Pour apporter aux utilisateurs les avantages ergonomiques du mode connecté. On peut y penser dans un middleware pour interfacer un bus de messages. D’une manière générale, Node.js sera bon quand il y a beaucoup I/O.

On peut oublier Node.js quand on a de gros besoins en CPU.

Références

Découvrir node.js : http://book.mixu.net/node/

Référence : http://nodejs.org/api/

Cookbook : http://howtonode.org/

Implémentation de la webSocket avec un down grade transport vers Flash, AJAX ou JSONP : http://socket.io/

Contributions communautaires pour node.js : https://npmjs.org/

Categories: Divers Tags: ,
  1. Pas encore de commentaire
  1. Pas encore de trackbacks


− sept = 1