IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

NodeJS Discussion :

Broadcast NODE JS


Sujet :

NodeJS

  1. #1
    Nouveau membre du Club
    Homme Profil pro
    Développeur multimédia
    Inscrit en
    Décembre 2012
    Messages
    6
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Nouvelle-Calédonie

    Informations professionnelles :
    Activité : Développeur multimédia
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Décembre 2012
    Messages : 6
    Par défaut Broadcast NODE JS
    Bonjour,

    je suis nouveau sur le forum, je solliciterais votre aide pour résoudre un problème.

    Nous avons un site d'annonces, sur ce site on affiche en direct le nombre de connecté, les annonces vues etc ... jusqu'à aujourd'hui je faisais un setInterval qui lançait une fonction jquery pour rafraichire les div. Tout cela fonctionne bien. Seul hic cela consomme des connexions inutiles.
    Et vient NODEJS, formidable outils .. sauf qu'il fait planter le serveur.

    Voila comment je procéde :

    <gras>La partie client : </gras>

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    <script type="text/javascript" src="http://SRV_NODE:1337/socket.io.js"></script>
    <script type="text/javascript">
        (function ($)
        {
            if (typeof (io) != "undefined")
            {
                var socket = io.connect("http://SRV_NODE:1337/socket.io.js");
                setInterval(function ()
                {
                    socket.emit("cron_showcompteur",
                    {
                        ssid: "*SSID_ID*",
                        id_website: 1
                    });
                }, 5 * 1000);
     
                socket.on("showinfo", function (obj)
                {
                    $("#" + obj.divdest).html(obj.result);
                });
            }
        })(jQuery);
    </script>
    Le client lance le socket toutes les 5 sec vers cron_showcompteur avec son SSID.

    Partie Serveur :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    ..var initConf = require('./conf');
    var http = require('http');
    var util = require('util');
    var os = require('os');
    var Memcached = require('memcached');
    var memcached = new Memcached(util.format('%s:%s', initConf.objConf.memcache_ip, initConf.objConf.memcache_port));
    ....
     
    var array_exclu = new Array('website_ALL_whoisOnline', 'website_ALL_whoisOnline_top');
    io.sockets.on('connection', function (socket) {
        socket.on('cron_showcompteur', function (obj) {
     
    		var loadAvg = os.loadavg();
        	if (typeof (obj.ssid) == 'undefined') return;
        	//console.log(obj.ssid);
     
            socket.join(obj.ssid)
            if (loadAvg[0] < 3) {
     
                memcached.get(["website_ALL_whoisOnline", "website_ALL_whoisOnline_top", "nombre_visite_journee", util.format('annonces_ajoutees_journee_%d', obj.id_website)],
                    function (err, result) {
                    //console.log(result);
                    if (err) return;
                    if (typeof (result) == 'boolean') return;
     
                    if (typeof (result.website_ALL_whoisOnline) != 'undefined' && typeof (result.website_ALL_whoisOnline_top) != 'undefined') {
                        io.sockets. in (obj.ssid).emit('showinfo', {
                            divdest: 'website_ALL_whoisOnline',
                            result: util.format("<span title='Record %d'>%d</span>", addCommas(result.website_ALL_whoisOnline_top), addCommas(result.website_ALL_whoisOnline))
                        });
                    }
     
                    for (var i in result)
                    {
                        if (array_exclu.inArray(i))
                        {
                            io.sockets. in (obj.ssid).emit('showinfo',
                            {
                                divdest: i,
                                result: addCommas(result[i])
                            });
                        }
                    }
                });
            }
        });
    En résumer :

    La personne se connecte sur le site, un ssid est généré
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    md5(uniqid(rand(), true))
    , il envoi ce ssid avec l'id du site vers cron_showcompteur qui lui lui créé une room avec son ID, toutes les xx intervalles le client lui redemande de mettre à jour les infos toujours avec le même SSID.
    Pour mettre à jour les div c'est :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    Serveur :
    io.sockets. in (obj.ssid).emit('showinfo',
    {
        divdest: DIVDEST,
        result: VALEUR
    });
     
    Client:
     
    socket.on("showinfo", function (obj)
    {
        $("#" + obj.divdest).html(obj.result);
    });

    Cela fonctionne très bien quand on est 600 / 700 de connecté par contre dès qu'on monte à 1500 le serveur (un serveur dédié à NODEJS) monte en CPU à 100%

    J'ai testé plusieurs variantes :

    - De mettre le setInterval coté serveur, cela est pire.
    - De fonctioner en trigger, dés qu'un client se connecte ou ouvre une annonce cela recharge les autres etc ....

    J'ai un doute par contre sur le faite que l'on doivent créer une room par utilisateur, cela me semble gros ... car les données ne sont pas privé. Et sans room le setInterval n'est pas respecté, dés qu'une personne se connecte cela réinitialise tous les clients.

    Si vous voulez un exemple :

    <lien>http://nautisme.nc/</lien> >> Les stats sont mises à jours via NODEJS
    <lien>http://annonces.nc/</lien> >> Les stats sont mises à jours via Jquery (cron client)


    J'avais trouvé sur le net des solutions en long pooling mais je trouve que cela n'est pas forcement mieux que de le faire directement en jquery, j'aimerais si possible le faire en PUSH.

    Merci pour votre aide

    Bonne journée

  2. #2
    Rédacteur/Modérateur

    Avatar de SylvainPV
    Profil pro
    Inscrit en
    Novembre 2012
    Messages
    3 375
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2012
    Messages : 3 375
    Par défaut
    La partie Node.js sort un peu du scope de compétences de ce forum.

    S'il s'agit d'un problèmes de performances et que la communication est principalement Serveur -> Client, as-tu songé à utiliser les Server Sent Events plutôt que Websockets ? Les SSE sont beaucoup moins gourmands côté serveur

    https://developer.mozilla.org/en-US/...er-sent_events

  3. #3
    Nouveau membre du Club
    Homme Profil pro
    Développeur multimédia
    Inscrit en
    Décembre 2012
    Messages
    6
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Nouvelle-Calédonie

    Informations professionnelles :
    Activité : Développeur multimédia
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Décembre 2012
    Messages : 6
    Par défaut
    merci pour le conseil, je ne connaissais pas du tout.
    Le concept est très sympa, c'est exactement ce que je veux faire le seul hic c'est que cela n'est pas compatible avec IE, je continue à chercher du coté de l'html 5

    bonne journée

  4. #4
    Rédacteur/Modérateur

    Avatar de SylvainPV
    Profil pro
    Inscrit en
    Novembre 2012
    Messages
    3 375
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2012
    Messages : 3 375
    Par défaut
    Les Websockets non plus ne sont pas compatibles IE<=9 . Socket.io utilise un fallback (Flash ou long polling je sais plus)
    Donc si tu trouves un polyfill Server Sent Events pour IE, c'est gagné

Discussions similaires

  1. selection nodes
    Par luta_seb dans le forum XSL/XSLT/XPATH
    Réponses: 2
    Dernier message: 28/09/2004, 16h47
  2. Broadcast
    Par Gnux dans le forum Développement
    Réponses: 4
    Dernier message: 02/03/2004, 07h51
  3. []générer et LIRE du xml avec vb: sélection d'un node
    Par chris21 dans le forum VB 6 et antérieur
    Réponses: 11
    Dernier message: 19/09/2003, 13h14
  4. Ping de broadcast sous Windows
    Par ovh dans le forum Développement
    Réponses: 10
    Dernier message: 09/05/2003, 18h40
  5. template match="node() mais pas text()"
    Par Manu_Just dans le forum XSL/XSLT/XPATH
    Réponses: 4
    Dernier message: 26/03/2003, 10h52

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo