2012-08-23 10 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.ionode.js clusterを完全にサポートしていません。 websocketトランスポートではうまく動作しますが、xhr-poolingは失敗します。この問題でもっとリードすることができます:#939#917。問題は、xhr-poolingリクエストが最初に承認されたスレッドとは異なるスレッドに入ることができることです。

+0

ありがとう、私は実際にwebsocketを使用しているだけで、私のコードにそれを含めることを怠ったので、今更新しました。 xhr-pollingには、ここで言及したもの以外のいくつかの問題があり、websocketは一般的にSSLを通じて信頼性があります。 – Harry

関連する問題