2017-10-24 9 views
1

TCP 프로토콜이 단일 포트에서 몇 개의 연결을 열 수 있는지 제한을 극복하려고합니다. 그래서 내가 예를 들어 다른 포트에서 실행 내 서버의 여러 인스턴스를 만들 수있는 방법을 생각 : 1 (3001)socket.io router, multiple instances 중 하나에 할당

  • 인스턴스를 server_i1.js
  • 예 2 (3002) server_i2.js
  • 예 3 (3003) server_i3.js 많은 사람들이 연결 방법을 확인 할
  • 예 4 (3004) server_i4.js

그럼 내가 한 추가 파일 server_route.js을 가질 수 이온은 각 인스턴스마다 설정되고 사용자를 덜 채워진 인스턴스로 전달합니다. 나는 클러스터를 사용하여 무언가를 만들려고했으나 같은 포트에서 새로운 프로세스를 만드는 것으로 보인다. 모든 사용자가 예를 들어 http://exmaple.com:3000에 연결 한 다음 네 개의 가능한 포트 중 하나 ([3001, 3002, 3003, 3004]) 중 하나로 전달하는 방법은 무엇입니까?

현재 서버 접근 방식 :

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

if(cluster.isMaster) { 
    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 http = require('http'), 
     _io = require('socket.io'), 
     server = http.createServer(); 

    server.listen('3000', 'example.com'); 

    var io = _io.listen(server); 

    var connections = {}, 
     msg_sent = 0; 

    io.on('connection', function(socket) { 

     connections[socket.id] = new Date().getTime(); 

     socket.on('client-request', function(msg) { 
      msg_sent++; 
     }); 

     socket.on('disconnect', function() { 
      delete connections[socket.id]; 
     }); 

    }); 

    setInterval(function() { 
     console.log('Active connections: ', Object.keys(connections).length, 'Messages sent: ', msg_sent); 
    }, 1000); 

} 

답변

1

어쩌면 라운드 로빈을 사용합니까? 샘플 구현은 다음과 같습니다 클라이언트 측 하나에

const ports = ["3001"," 3002", "3003"]; 
var current = 0; 

io.on('connection', function(socket) { 
    socket.emit("redirect",ports[current]); 
    current = (current + 1) % ports.length; 
}); 

(function start(port){ 
    const socket = io("http://localhost:"+port); 
    socket.on("redirect", port => (socket.close(), start(port))); 
    //whatever 
})(3000); 
+0

할 것이 유일한 문제는 서버간에 부하를 분산하는 방법으로 할 것, 정말 좋은 생각, 당신은 어떤 생각을해야합니까 어떻게? – Mevia

+0

@mevia thats 라운드 로빈의 것. 연결이 많으면 워크로드가 서버간에 균등하게 분배됩니다 ... –