2012-08-23 15 views
6

Hier ist mein Servercode:Knotencluster mit socket.io und expressjs

Ich versuche Cluster mit socket.io und expressjs zu verwenden. Ich teste das auf meinem Quad-Core-Desktop.

var cluster = require('cluster') 
var numCPUs = require('os').cpus().length 

if (cluster.isMaster) { 
    // Fork workers. 
    for (var i = 0; i < numCPUs; i++) { 
    cluster.fork() 
    } 

    console.log(new Date()); 
} 
else { 
    // get required modules 
    var connect = require('connect'); 
    var express = require('express'); 
    var mongo = require('mongodb'); 
    var MongoStore = require('connect-mongo')(express); 
    var server; 
    var redis = require('redis'); 
    var http = require('http'); 

    // create server object 
    app = exports.module = express(); 


    function configureServer() { 
    //configure environments 
    app.configure('production', function() { 
     app.use(express.errorHandler()); 
    }); 

    //configure server instance 
    app.configure(function() { 
     app.use(express.compress()) 
     // set jade as default view engine 
     app.set('view engine', 'jade'); 
     app.use(express.bodyParser()); 
     app.use(express.cookieParser("refdgfd")); 

     app.use(express.methodOverride()); 
     app.use(app.router); 
     // use express logger 
    }); 

    loadModules(); 
    } 

    var server = http.createServer(app).listen(80); 

    socket = require('socket.io').listen(server); 

    var RedisStore = require('socket.io/lib/stores/redis') 
    , pub = redis.createClient() 
    , sub = redis.createClient() 
    , client = redis.createClient(); 
    socket.set('store', new RedisStore({ 
    redisPub : pub 
    , redisSub : sub 
    , redisClient : client 
    })); 

    socket.configure(function() { 
    socket.set('log level', 1); 
    socket.set('transports', ['websocket']); 
    }); 

    configureServer(); 
} 

Gibt es etwas, das wirklich falsch ist?

Die Protokolle zeigen an, dass alles 4 mal passiert. Was scheint richtig. Aber die Kanalbenutzer von socket.io geben auch an, dass ich immer dann, wenn ich mich mit einer Seite verbinde, 4 mal verbinde (4 Benutzer-Sockets erstellen). Das scheint falsch zu sein. Wie behebe ich das Problem und sind andere Dinge mit meinem Code nicht in Ordnung? Vielen Dank.

+0

Ich habe genau das gleiche Problem. Doppelte Nachrichten in Anzahl der Kerne. Ich habe alle Kombinationen ausprobiert und kein Glück. Hast du irgendeine Lösung dafür gefunden? – Maziyar

Antwort

3

In diesem Moment hat socket.io keine volle Unterstützung für node.js cluster. Es funktioniert gut für mich mit websocket Transport, aber xhr-pooling schlägt fehl. Sie können in diesem Ausgaben mehr reed: #939, #917. Das Problem ist die xhr-pooling Anfrage kann in den Thread anders als die, die es ursprünglich autorisiert wurde bekommen.

+0

Danke, ich benutze eigentlich nur Websocket, vernachlässigt, um das in meinen Code aufzunehmen, ich habe es jetzt aktualisiert. xhr-polling hat andere Probleme als die hier genannten und websocket ist im Allgemeinen zuverlässig durch SSL. – Harry