2015-04-06 127 views
0

我正在使用socket.io库运行nodejs集群。 我正在通过nginx服务器接收请求。 Websocket连接在大多数情况下都能正常工作,但它不作为socket.io中的传输协议进行轮询。nodejs集群socket.io nginx配置

这里是伪代码:

if (cluster.isMaster) { 
    // Fork workers. 
for (var i = 0; i < numCPUs-1; i++) { 
    cluster.fork(); 
    } 
else{ 
var server = http.createServer(function(request, response){ 
    console.log('Connecting server'); 
    response.end(); 
}); 

server.listen(port); 
var socket_io = require('socket.io')(server); 
var redis_adapter = require('socket.io-redis'); 
//config.redis.ip,config.redis.port 
socket_io.adapter(redis_adapter({ host: config.redis.ip, port: config.redis.port })); 

socket_io.use(function(socket, next){ 
}); 


socket_io.on('connection', function (socket) { 
}; 

想知道是否有任何问题的代码。 我们是否需要使用sticky-session。如果是,在我的情况下使用它的正确方法是什么。

回答

1

websockets默认为粘性。

轮询作为运输的问题是,您的连接请求将发送给worker1,而握手或backnts请求可能会发送给其他worker..lets说worker2。而这个worker2将没有关于使用worker1建立的这个套接字连接的信息。

如果您的socket.io服务器是直接部署,则可以使用sticky-session(http://socket.io/docs/using-multiple-nodes/)。

但是,如果您的socket.io服务器位于代理服务器之后,则粘性会话可能无法以高效的方式工作,因为粘性服务器会按照远程IP地址平衡请求。而在代理服务器的情况下,所有的请求将最终落在同一个工作人员身上,而其余的工作人员将是理想的。

在这种情况下,一种可能的解决方案是在多个端口上启动socket.io worker并在nginx/apache中进行群集平衡。 欲了解更多帮助,请联系。