Socket.io 正在执行多个请求以执行握手并与客户端建立连接。对于集群,这些请求可能会到达不同的工作人员,这将破坏握手协议(protocol)。 我尝试使用 radis,但没有成功
var cluster = require('cluster');
var config = require('./config/environment');
if(cluster.isMaster) {
var server = require('http').createServer();
var socketio = require('socket.io')(server, {
serveClient: (config.env === 'production') ? false : true,
path: '/socket.io-client',
pingInterval: 25000,
pingTimeout: 30000
});
var redis = require('socket.io-redis');
socketio.adapter(redis({ host: '127.0.0.1', port: 6379 }));
var numWorkers = require('os').cpus().length;
for(var i = 0; i < numWorkers; i++) {
cluster.fork();
}
} else {
startServer();
}
// Start server
function startServer() {
var express = require('express');
var mongoose = require('mongoose');
var multer = require('multer');
// Connect to database
mongoose.connect(config.mongo.uri, config.mongo.options);
// Setup server
var app = express();
app.use(multer({ dest: './uploads/'}));
var server = require('http').createServer(app);
var socketio = require('socket.io')(server, {
serveClient: (config.env === 'production') ? false : true,
path: '/socket.io-client',
pingInterval: 25000,
pingTimeout: 30000
});
var redis = require('socket.io-redis');
socketio.adapter(redis({ host: '127.0.0.1', port: 6379 }));
require('./config/socketio')(socketio);
require('./config/express')(app);
require('./routes')(app);
server.listen(config.port, config.ip, function () {
});
// Expose app
exports = module.exports = app;
}
最佳答案
就在 socket.io 文档中 using multiple node servers with socket.io ,它是这样说的:
If you plan to distribute the load of connections among different processes or machines, you have to make sure that requests associated with a particular session id connect to the process that originated them.
然后继续解释如何使用 nginx 代理来完成。
或者,如果在同一台机器上使用多个集群进程,则有一个 sticky-session module可以与 node.js 集群一起使用。查看代码,粘性 session 模块对 IP 地址进行哈希处理,并使用该哈希值始终将其分配给同一集群服务器实例。
关于node.js - nodejs中通过集群的socket.io问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38564248/