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)
| 归档时间: |
|
| 查看次数: |
3367 次 |
| 最近记录: |