node.js为新端口分配新的服务器实例

让我们假设我们有这个服务器结构:

  • load_balancer.js
  • server_instance_1.js(端口23101
  • server_instance_2.js(端口23102
  • shared_logic.js

目前我有2个服务器实例作为js文件,我手动启动。 问题是,是否可以自动创build和折叠需要或未使用的服务器实例的dynamic进程?

例如,我允许每个服务器实例有50k连接的用户,所以如果我的软件会检测到我接近100k组合,它会在端口23103上启动新的实例,而如果我有3个实例运行,我要下去60k用户closures三审。

如果可能(最有可能)如何实现?

典型的实例代码示例:

 var http = require('http'), _io = require('socket.io'), server = http.createServer(); server.listen('23101', 'IP_ADDR'); var io = _io.listen(server); io.on('connection', function(socket) { // ... }); 

示例1 :recursion函数我设法通过使用单个文件处理启动和closures具有一些variables的新服务器来跟踪当前运行的服务器和用户。

 var http = require('http'), _io = require('socket.io'); var servers = []; var users = 0; var serversAreClosing = false; const USERS_PER_SERVER = 50000; var startServerInstance = function () { var server = http.createServer(ports[ports.length-1] + 1); //start a http server on the port after the previous server var io = _io.listen(server); io.on('connection', function(socket) { users++; if(users > USERS_PER_SERVER * servers.length) { startServerInstance(); } }); io.on('disconnect', function(socket) { users--; if(users < USERS_PER_SERVER * (servers.length-1) && !serversAreClosing) { var lastServer = servers.pop(); serversAreClosing = true; //Make sure that no other server tries to kill servers if two users disconnect at the same time lastServer.http.close(function() { lastServer.io.close(function() { serversAreClosing = false; }); }}); } }); //Put your own code here servers.push({"http" : server, "io": io}); } 

由于我不能看到你的load_balancer代码,我不知道它是如何工作的,虽然我想你可以导出服务器variables,然后路由用户到服务器与最less的人连接。

 var smallestServer; for(var server of servers) { if(!smallestServer) { smallestServer = server; continue; } if(smallestServer.io.sockets.clients().length > server.io.sockets.clients().length) { smallestServer = server; } } directToServer(smallestServer); // This should be replaced with whatever code you use to direct users. 

示例2 :使用process.fork

Controller.js

 var child_process = require('child_process'); var forks = []; var users = 0; var serversAreClosing = false; var portAvailable = 23101; const USERS_PER_SERVER = 50000; var createFork = function() { var newFork = child_process.fork("server.js"); newFork.send("start", {port: portAvailable}); portAvailable++; forks.push(newFork); newFork.on("userConnected", function() { users++; if(users > USERS_PER_SERVER * forks.length) { createFork(); } }); newFork.on("userDisconnected", function() { users--; if(users < USERS_PER_SERVER * (forks.length-1) && !serversAreClosing) { var lastFork = forks.pop(); serversAreClosing = true; //Make sure that no other server tries to kill servers if two users disconnect at the same time lastFork.send("stop"); portAvailable--; } }); newFork.on("stopped", function() { serversAreClosing = false; }); } 

Server.js

 var http = require('http'), _io = require('socket.io'), server = http.createServer(), io = undefined; process.on("start", function(port) { server.listen(port); io = _io.listen(server) io.on("connection", function(socket) { process.emit("userConnected"); }); io.on("disconnect", function(socket) { process.emit("userDisconnected"); }); }); process.on("stop", function() { server.close(function() { io.close(function() { process.emit("stopped"); }); } }); });