我在我的服务器上设置了Node.js和Nginx.现在我想使用它,但是,在我开始之前有2个问题:
Node.js服务器有2个概念,其中一个更好:
一个.为需要它的每个网站创建单独的HTTP服务器.然后在程序开始时加载所有JavaScript代码,因此代码被解释一次.
湾 创建一个处理所有Node.js请求的Node.js服务器.这将读取所请求的文件并篡改其内容.因此,每个请求都会解释文件,但服务器逻辑要简单得多.
我不清楚如何正确使用Node.js.
这是我的代码使用socket.io作为WebSocket和后端与pub/sub redis.
var io = io.listen(server),
buffer = [];
var redis = require("redis");
var subscribe = redis.createClient(); **<--- open new connection overhead**
io.on('connection', function(client) {
console.log(client.request.headers.cookie);
subscribe.get("..", function (err, replies) {
});
subscribe.on("message",function(channel,message) {
var msg = { message: [client.sessionId, message] };
buffer.push(msg);
if (buffer.length > 15) buffer.shift();
client.send(msg);
});
client.on('message', function(message){
});
client.on('disconnect', function(){
subscribe.quit();
});
});
Run Code Online (Sandbox Code Playgroud)
每个新的io请求都将创建新的redis连接.如果有人用100个标签打开浏览器,那么redis客户端将打开100个连接.它看起来不太好看.
如果cookie相同,是否可以重用redis连接?因此,如果有人打开许多浏览器标签,也将其视为开放1连接.
我希望让Socket.io 在Node.js v.0.6.0及更高版本中使用本机负载平衡("集群")进行多线程.
据我所知,Socket.io使用Redis来存储其内部数据.我的理解是:我们不想为每个工作者生成一个新的Redis实例,而是强制工作者使用与主服务器相同的Redis实例.因此,连接数据将在所有工作人员之间共享.
在主人中有类似的东西:
RedisInstance = new io.RedisStore;
Run Code Online (Sandbox Code Playgroud)
我们必须以某种方式传递RedisInstance给工人并做以下事情:
io.set('store', RedisInstance);
Run Code Online (Sandbox Code Playgroud)
受到使用旧的第三方集群模块的此实现的启发,我有以下非工作实现:
var cluster = require('cluster');
var http = require('http');
var numCPUs = require('os').cpus().length;
if (cluster.isMaster) {
// Fork workers.
for (var i = 0; i < numCPUs; i++) {
cluster.fork();
}
var sio = require('socket.io')
, RedisStore = sio.RedisStore
, io = sio.listen(8080, options);
// Somehow pass this information to the workers
io.set('store', new RedisStore);
} else {
// Do the work …Run Code Online (Sandbox Code Playgroud)