2014-10-15 6 views
5

Node.js, socket.io 및 node.js 클러스터로 내 응용 프로그램을 클러스터링하는 데 문제가 있습니다.Node.JS, Socket.IO 및 Cluster의 WebSocket 핸드 셰이크가 작동하지 않습니다.

socket.io-redis를 사용하여 모든 작업자에 대한 정보를 공유하지만 작동하지 않습니다.

내 코드 : 클라이언트에서

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

    ... 
} 

, 난 400 오류와 같은 핸드 셰이크에 에러가 발생하거나 연결이 설정되기 전에 웹 소켓이 닫혀 있습니다.

내가 이것을 해결하기 위해 할 수있는 일은 무엇입니까?

임 Node.js를의 마지막 버전과 socket.io

감사를 사용!

답변

15

나는이 같은 문제가 있었고 그것을 이해하는 데 시간이 걸렸다. 약간의 연구 결과에 따르면 긴 폴링과 같은 일부 전송은 최적의 연결을 설정하기 위해 여러 요청을해야하기 때문에 발생한다고 설명했습니다. 여러 요청간에 상태가 유지되므로 서로 다른 연속 요청이 다른 클러스터 작업자로 라우팅되면 연결이 실패합니다. 이 문제를 해결 작동 sticky-session라는 사용자 지정 cluster 모듈을 인용 http://socket.io/docs/using-multiple-nodes/에서 그것에 대해 페이지가 있습니다

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

즉 기본적으로 모든 작업에게 Node.js를 팀을 무시하기 때문에 나는 정말 그것을 사용하지 않았다 클러스터 모듈 뒤에 TCP로드 균형 조정에 투자했습니다.

웹 소켓 프로토콜 자체가 단일 연결 만 필요하기 때문에 websocket을 첫 번째이자 유일한 전송으로 강제로 처리 할 수있었습니다. 클라이언트와 서버를 제어하기 때문에이 작업을 수행 할 수 있습니다. 공용 웹 페이지의 경우 브라우저 호환성에 대해 걱정해야하므로 안전하지 않을 수 있습니다. 제 경우에는 클라이언트가 모바일 앱입니다.

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

: 여기

내가 내 테스트 페이지에 넣어 자바 스크립트 클라이언트 코드입니다 (다시, 실제 클라이언트는 그래서 여기 내 웹 페이지가 정말 구축하고 테스트하는 데 도움 단지 도움이됩니다, 모바일 앱입니다) 브랜든, 고마워! 귀하의 솔루션이 최고입니다! –

관련 문제