node.js - nodejs中通过集群的socket.io问题

标签 node.js redis socket.io

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/

相关文章:

session - 使用 NoSQL 系统存储 session 数据

node.js - 使用 Socket.IO 修复垃圾邮件服务器的方法?

node.js - 如何从使用socket.io的 Controller 函数发出信号?

ios - 对 iOS 中使用标记的 Azure 应用服务推送通知注册进行故障排除

node.js - 如何控制spawnCommand方法的执行位置

python - 生产中的 Redis-Queue (RQ) 任务队列

python - 如何修复 web 中返回 request.get_json 并获取 null 的问题?

javascript - 每次刷新页面时都会加载内容

javascript - 使用 node.js 中的 readline 模块调试服务器端代码

python - Redis - 如何 RPUSH/LPUSH 一个空列表