Я пытаюсь преодолеть ограничение на количество подключений TCP
протокола, которое можно открыть на одном порту. Поэтому я подумал о том, как создать несколько экземпляров моего сервера, работающих на разных портах, например:
server_i1.js
server_i2.js
server_i3.js
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);
}
Может быть, использовать круглый робин? Пример реализации будет выглядеть так:
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);