Node.JS,Socket.IO和Clusters中的WebSocket握手不起作用

Gab*_*iga 5 cluster-computing node.js express socket.io

我在使用Node.js,socket.io和node.js集群集群我的应用程序时遇到问题.

我使用socket.io-redis来共享所有工作人员的信息,但是无法正常工作.

我的代码:

var cluster   = require('cluster');
var numCPUs = require('os').cpus().length;

if (cluster.isMaster) {   
  // Fork workers.
  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 express   = require("express");
         //Server
         var server = express();
         //Socket.io
         var http  = require('http').Server(server);
         var io    = require('socket.io')(http);
         var redis_io = require('socket.io-redis'); 
         var redis = require("redis");

         io.adapter(redis_io({host: "127.0.0.1", port: 6379 })); 

    ...
}
Run Code Online (Sandbox Code Playgroud)

在客户端,我得到握手错误,如400错误或WebSocket在建立连接之前关闭.

我能做些什么来解决这个问题?

我使用的是node.js和socket.io的最新版本

谢谢!

Bra*_*don 19

我遇到了同样的问题,我花了一段时间才弄明白.一些研究解释说,这是因为一些传输,如长轮询,需要发出多个请求才能建立最佳连接.跨请求存在状态,因此如果将不同的连续请求路由到不同的集群工作程序,则连接将失败.

http://socket.io/docs/using-multiple-nodes/上有一个关于它的页面引用了一个自定义cluster模块sticky-session,该模块可以解决这个问题:https://github.com/indutny/sticky-session

我真的不想使用它,因为这基本上忽略了node.js团队一直投资于集群模块后面的TCP负载平衡的所有工作.

由于Web Socket协议本身只需要一个连接,因此我能够通过强制websocket成为第一个也是唯一的传输来解决这个问题.我可以这样做,因为我控制客户端和服务器.对于公共网页,这可能不安全,因为您不得不担心浏览器兼容性.就我而言,客户端是一个移动应用程序.

这是我放入测试页面的JavaScript客户端代码(同样,真正的客户端是一个移动应用程序,所以我的网页实际上只是帮助构建和测试):

var socket = io('http://localhost:8080/', {
  transports: [ 'websocket' ]
});
Run Code Online (Sandbox Code Playgroud)