【问题标题】:NodeJS|Socket.IO how to send server handler to workers?NodeJS|Socket.IO 如何将服务器处理程序发送给工作人员?
【发布时间】:2012-01-23 16:55:33
【问题描述】:

这个想法是在主进程中创建服务器,并在工作进程中处理请求。我想利用所有的 CPU 内核并实现负载平衡。

起初我尝试将服务器处理程序从 master 发送到 worker:

var cluster = require('cluster');

if (cluster.isMaster) {
    var app = require('express').createServer();
    app.listen(1234);

    var worker = cluster.fork();
    worker.stdin.write('fd', 'utf8', app._handle);
} else {
    process.stdin.resume();
    process.stdin.on('fd', function(fd){
        var stream = require('net').Stream(fd);
        var io = require('socket.io').listen(stream);
        io.sockets.on('connection', function(socket){
            ...
        }
    }
}

但是 write 没有在 worker 中触发 ('fd'...) 事件处理程序。然后我把一切都掌握了,以检查这是否可能:

    var app = require('express').createServer();
    app.listen(1234);
    var stream = require('net').Stream(app._handler);
    var io = require('socket.io').listen(stream);

服务器启动没有任何错误,但不工作。我无法使用标签从客户端请求 socket.io.js 脚本:

<script src="http://localhost:8080/socket.io/socket.io.js"></script>
Response: Cannot GET /socket.io/socket.io.js

所以我有两个烦恼:

  1. 如何将打开的套接字描述符发送给工作人员?
  2. 如何通过这个描述符为服务器设置handler?

【问题讨论】:

    标签: node.js cluster-computing socket.io


    【解决方案1】:

    您不需要自己处理文件描述符等,请查看我刚刚在这里回答的类似问题:

    Node.js, multi-threading and Socket.io

    代码示例:

    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);
        })
      });
    }
    

    【讨论】:

    • 看起来脚本会在工作线程中创建多个套接字并将它们绑定到一个端口。我希望这里有一个例外。你能解释一下这里发生了什么吗?
    • 在此处查看集群的文档以更好地理解:nodejs.org/docs/v0.6.6/api/cluster.html 它有一些示例,类似于我上面的示例。
    猜你喜欢
    • 2023-03-11
    • 2016-06-19
    • 2019-01-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-06-04
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多