2014-10-15 18 views
5

Uygulamamı Node.js, socket.io ve node.js kümeleriyle kümelemede sorun yaşıyorum.WebSocket el sıkışmalarında Node.JS, Socket.IO ve Clusters çalışmıyor

Tüm çalışanlar için bilgileri paylaşmak üzere socket.io-redis'i kullanıyorum ancak çalışmıyor.

Kodum: istemci olarak

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

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

    cluster.on('exit', function(worker, code, signal) { 
    console.log('worker ' + worker.process.pid + ' died'); 
    }); 
} else { 

    ... 

     var express = require("express"); 
     //Server 
     var server = express(); 
     //Socket.io 
     var http = require('http').Server(server); 
     var io = require('socket.io')(http); 
     var redis_io = require('socket.io-redis'); 
     var redis = require("redis"); 

     io.adapter(redis_io({host: "127.0.0.1", port: 6379 })); 

    ... 
} 

i 400 hata gibi el sıkışma hataları almak veya bağlantı kurulmadan önce WebSocket kapalıdır.

Bunu çözmek için ne yapabilirim?

Im node.js son versiyonunu ve socket.io

Teşekkür kullanarak!

cevap

15

Ben de aynı problemi yaşadım ve bunu anlamak biraz zamanımı aldı. Bir miktar araştırma, bunun nedeni, uzun-yoklama gibi bazı ulaşım yollarının, en uygun bağlantıyı kurmak için çok sayıda talepte bulunması gerektiğinden kaynaklandığını açıkladı. Talepler arasında devlet var, bu yüzden farklı ardışık istekler farklı kümelenme işçilerine yönlendirilirse, bağlantı başarısız olur. Bu çevrede çalışır sticky-session adlı özel cluster modülü değinir http://socket.io/docs/using-multiple-nodes/ bu konuda bir sayfa mevcut

: https://github.com/indutny/sticky-session

o temelde tüm esere node.js takımı görmezden beri ben gerçekten kullanmak istemedi Küme modülünün arkasındaki TCP yük dengelemesine yatırım yapıyor.

Web Socket protokolünün kendisi yalnızca tek bir bağlantıya ihtiyaç duyduğundan, ilk ve tek taşımacılık olmak için websocket'u zorlayarak bu konuda çalışabildim. Bunu yapabilirim çünkü müşteriyi ve sunucuyu kontrol ediyorum. Genel bir web sayfası için, tarayıcınızın uyumluluğu konusunda endişelenmeniz gerektiğinden, bu işlem sizin için güvenli olmayabilir. Benim durumumda, müşteri bir mobil uygulamadır.

var socket = io('http://localhost:8080/', { 
    transports: [ 'websocket' ] 
}); 
+0

: Burada

Test sayfamda koymak JavaScript istemci kodu (yine gerçek istemci işte benim web sayfası gerçekten hazırlanıp test yardımcı olmak için sadece bir yardımdır, bir mobil uygulama) Brandon, teşekkür ederim! Çözümünüz en iyisi! –

İlgili konular