javascript - Node.js、多线程和 Socket.io

标签 javascript node.js socket.io

我希望 Socket.io 使用 native load balancing 进行多线程工作("cluster") 在 Node.js v.0.6.0 及更高版本中。

据我了解,Socket.io 使用 Redis 来存储其内部数据。我的理解是:我们不想为每个工作人员生成一个新的 Redis 实例,而是要强制工作人员使用与主服务器相同的 Redis 实例。因此,连接数据将在所有工作人员之间共享。

master 里面是这样的:

RedisInstance = new io.RedisStore;

我们必须以某种方式将 RedisInstance 传递给工作人员并执行以下操作:

io.set('store', RedisInstance);

灵感来自 this implementation使用旧的第 3 方集群模块,我有以下非工作实现:

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

if (cluster.isMaster) {
  // Fork workers.
  for (var i = 0; i < numCPUs; i++) {
    cluster.fork();
  }

  var sio = require('socket.io')
  , RedisStore = sio.RedisStore
  , io = sio.listen(8080, options);

  // Somehow pass this information to the workers
  io.set('store', new RedisStore);

} else {
  // Do the work here
  io.sockets.on('connection', function (socket) {
    socket.on('chat', function (data) {
      socket.broadcast.emit('chat', data);
    })
  });
}

想法?我可能完全走错了方向,任何人都可以指出一些想法吗?

最佳答案

其实你的代码应该是这样的:

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

if (cluster.isMaster) {
  // Fork workers.
  for (var i = 0; i < numCPUs; i++) {
    cluster.fork();
  }
} else {
  var sio = require('socket.io')
  , RedisStore = sio.RedisStore
  , io = sio.listen(8080, options);

  // Somehow pass this information to the workers
  io.set('store', new RedisStore);

  // Do the work here
  io.sockets.on('connection', function (socket) {
    socket.on('chat', function (data) {
      socket.broadcast.emit('chat', data);
    })
  });
}

另一种选择是打开 Socket.IO 来监听多个端口并拥有类似 HAProxy 负载平衡的东西。 无论如何,您知道最重要的事情:使用 RedisStore 在进程之外进行扩展!

资源:

http://nodejs.org/docs/latest/api/cluster.html
How can I scale socket.io?
How to reuse redis connection in socket.io?
Node: Scale socket.io / nowjs - scale across different instances
http://delicious.com/alessioaw/socket.io

关于javascript - Node.js、多线程和 Socket.io,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8563401/

相关文章:

javascript - 如何使用 JavaScript 为另一个域设置 cookie?

javascript - 具有来自给定键和值数组的键/值对的对象数组

javascript - vue/vuetify 中的 {on, attrs} 有何作用?

javascript - 一次从目录导入所有模块 [NODE]

node.js - npm install -g webpack 给出 tar.unpack untar 错误

node.js - Node.js 终端中漂亮的异常消息

go - 使用 Golang 通过 Socket.io 传输音频

node.js - 通过 Nginx 时 Socket.io 连接失败

javascript - Electron Js应用程序菜单单击可多次运行

websocket - 保持与 Socket.io 的连接