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>
Le client lance le socket toutes les 5 sec vers cron_showcompteur avec son SSID.
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>
Partie Serveur :
En résumer :
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]) }); } } }); } });
La personne se connecte sur le site, un ssid est généré, 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.
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2 md5(uniqid(rand(), true))
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
Partager