2012-08-23 70 views
6

这里是我的服务器代码:节点群集与socket.io和expressjs

我想使用群集与socket.io和expressjs。我正在我的四核桌面上测试这个。

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(); 
} 

有什么突出的是真的错了吗?

日志表明一切都发生4次。这似乎是正确的。但是我的socket.io的频道用户也指出,无论何时我连接到一个页面,我连接4次(创建4个用户套接字)。这似乎是错误的。我该如何解决这个问题,并且在我的代码中有其他问题。谢谢。

+0

我有完全相同的问题。核心数量重复消息。我试过所有的组合,没有运气。你有没有找到解决办法? – Maziyar

回答

3

此刻socket.io尚未完全支持node.js cluster。对于websocket运输,它适用于我,但xhr-pooling失败。您可以在这个问题上更多地注意:#939,#917。问题是xhr-pooling请求可以进入与最初授权的线程不同的线程。

+0

谢谢,我实际上只使用websocket,忽略将其包含在我的代码中,我现在已经更新了它。除此之外,xhr-polling还有一些问题,websocket通常通过SSL可靠。 – Harry