socket.io router, назначить одному из нескольких экземпляров

1

Я пытаюсь преодолеть ограничение на количество подключений TCP протокола, которое можно открыть на одном порту. Поэтому я подумал о том, как создать несколько экземпляров моего сервера, работающих на разных портах, например:

  • экземпляр 1 (3001) 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);

}
Теги:
sockets
socket.io
forwarding

1 ответ

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
    это действительно хорошая мысль, единственная проблема заключается в том, как сбалансировать нагрузку между серверами, есть ли у вас какие-либо мысли о том, как?
  • 0
    @ Mevia это вещь круговой робин. Если соединений много, рабочая нагрузка будет равномерно распределена между серверами ...

Ещё вопросы

Сообщество Overcoder
Наверх
Меню