socket.io 路由器,分配给多个实例之一
socket.io router, assign to one of multiple instances
我正在努力克服 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);
}
也许使用循环法?示例实现如下所示:
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);
我正在努力克服 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);
}
也许使用循环法?示例实现如下所示:
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);