[英]WebSocket handshake in Node.JS, Socket.IO and Clusters not working
我在使用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 }));
...
}
在客戶端,我得到握手錯誤,如400錯誤或WebSocket在建立連接之前關閉。
我能做些什么來解決這個問題?
我使用的是node.js和socket.io的最新版本
謝謝!
我遇到了同樣的問題,我花了一段時間才弄明白。 一些研究解釋說,這是因為一些傳輸,如長輪詢,需要發出多個請求才能建立最佳連接。 跨請求存在狀態,因此如果將不同的連續請求路由到不同的集群工作程序,則連接將失敗。
在http://socket.io/docs/using-multiple-nodes/上有一個關於它的頁面,它引用了一個名為sticky-session
的自定義cluster
模塊,該模塊可以解決這個問題: https : //github.com/indutny/sticky-會議
我真的不想使用它,因為這基本上忽略了node.js團隊一直投資於集群模塊后面的TCP負載平衡的所有工作。
由於Web Socket協議本身只需要一個連接,因此我可以通過強制websocket
成為第一個也是唯一的一個傳輸來解決這個問題。 我可以這樣做,因為我控制客戶端和服務器。 對於公共網頁,這可能不安全,因為您不得不擔心瀏覽器兼容性。 就我而言,客戶端是一個移動應用程序。
這是我放入測試頁面的JavaScript客戶端代碼(同樣,真正的客戶端是一個移動應用程序,所以我的網頁實際上只是幫助構建和測試):
var socket = io('http://localhost:8080/', {
transports: [ 'websocket' ]
});
您必須使用粘性會話來避免客戶端從初始握手連接到不同的服務器。 請參閱https://github.com/elad/node-cluster-socket.io
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.