NodeJS群集将所有请求发送到一个工作线程(Windows)

unftdfkk  于 2022-11-29  发布在  Node.js
关注(0)|答案(4)|浏览(162)

我正在使用Windows 7机器测试NodeJS中的集群。
代码如下:

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

     cluster.on('exit', function (worker, code, signal) {
        console.log('worker ' + worker.process.pid + ' died');
     });

     cluster.on('listening', function(worker, address) {
        console.log("A worker with #" + worker.id + " is now connected to " + address.address + ":" + address.port);        
     });
   } else {
      // Workers can share any TCP connection
      // In this case its a HTTP server
      http.createServer(function (req, res) {
          console.log(cluster.worker.id + ' is responding..!!!');
          var j = 0;
          //long running task
          for (var i = 0; i < 10000000000; i++) {
             j++;
          }        
         res.writeHead(200);
         res.end("hello world\n");
     }).listen(8080);

   }

当我运行这段代码时,看起来所有的请求都被发送到了最后创建的worker节点,而所有剩下的worker节点都处于空闲状态,所有的请求都被顺序中最后创建的节点处理。
我已经尝试做一些触及,但似乎还没有人报告这个问题。我看到一个关于堆栈溢出的帖子有同样的问题,没有解决方案。我正在使用节点v0.10.26。
请给我指个正确的方向。

8oomwypt

8oomwypt1#

如果其他人也有同样的问题,这个答案也适用于他们。使用不同的浏览器发出HTTP请求,这将确保使用不同的worker。

iyr7buue

iyr7buue2#

我刚刚使用了两个浏览器,并在命令行中使用了curl。我得到了相同的结果:http://prntscr.com/8fxx4g
但正确答案是node.js中的集群不工作。只有一个工作线程始终响应:
@dandavis在评论中说的是真的:群集不执行循环负载平衡,因此,只要Worker 1可用于请求,它就会处理这些请求

7hiiyaii

7hiiyaii3#

require('os').cpus().length是逻辑处理器的数量。如果转到“任务管理器”-〉“性能”-〉“CPU”,您将看到logicalProcessor的数量

xjreopfe

xjreopfe4#

在Windows上,群集调度被禁用,只有一个工作线程获得请求的全部负载。

cluster.schedulingPolicy = cluster.SCHED_RR;

或环境变量

NODE_CLUSTER_SCHED_POLICY=rr.

我尝试将环境变量作为系统全局变量,但它不起作用。

相关问题