我有一个问题……我想运行一个 NodeJS 套接字服务器(我的决定是使用 EngineIO,从阅读性能/跨浏览器/等……)并能够扩大规模(添加内核)。因此我想使用集群模块(即使在实验阶段,似乎每个人都说它可靠)。我考虑在 nginx 中使用负载均衡器,但对于这个项目来说似乎有点太复杂了(到处都提到这是高级选项)。
所以我需要解决的大问题是这样的:我需要在同一个线程上有两个不同的设备,这样他们就可以“说话”(第二屏解决方案> 例如这个:https ://www.google.com/ intl/en/chrome/browser/promo/supersync/)。反正EngineIO好像不支持共享存储(比如共享RedisStore),我觉得自己实现有点太高级了……
所以我正在考虑一个设置,我将每个进程工作人员放在不同的端口上,然后,当其中一个设备连接到该特定工作人员上的 EngineIO 实例(由 nodejs 集群负载平衡)时,它可以显示一个独特的代码(应该在第二个设备上输入),最后一个数字会让第二个设备知道要连接到哪个端口。我发现我需要粘性会话来使每个设备的连接保持在同一个线程上(或者至少是第一个设备,因为当我连接 EngineIO.
我设法在不同的端口上启动了多个工人......但感觉有些不对劲。我还没有找到任何关于开发人员实现这种结构的示例。也许这并没有错,但我觉得我应该得到别人的意见。所以我的问题是:在不同的端口上拥有不同的工作进程,以便能够知道与第二个设备连接到哪个端口是一个好主意吗?像这样的东西:
var cluster = require('cluster'),
http = require('http');
var numCPUs = require('os').cpus().length; // or just hardcode to 2, when not more than one cpu is available...
if (cluster.isMaster) {
// Fork workers.
for (var i = 0; i < numCPUs; i++) {
cluster.fork();
}
cluster.on('listening', function(worker, address) {
console.log("worker.id: " + worker.id);
});
} else {
console.log("cluster.worker.id: " + cluster.worker.id);
http.createServer(function(req, res) {
res.writeHead(200);
res.end("hello world " + cluster.worker.id + "\n");
}).listen(8000 + parseInt(cluster.worker.id));
}
当然,EngineIO 是解决方案的重要组成部分,它没有包含在上面的代码中,但这是下一步。