Node.js 中的集群不起作用。只有一名工人始终在响应

2023-11-30

我正在 Node.js 中练习集群,我有一个两核 CPU。我创建了两个worker,每个worker 运行一个简单的http 服务器。服务器响应回调将阻塞 5 秒,以便向其他工作人员发出下一个请求。为了验证工作人员是否并行工作,我在 Firefox 中打开了多个选项卡并刷新了每个选项卡。问题总是(99%)只有一名工作人员响应通过刷新选项卡发出的请求。一名工作人员只处理一个请求,所有其他请求都会被阻止,直到该工作人员完成为止。我的代码在这里 代码:

var cluster = require('cluster');
var http = require('http');



if (cluster.isMaster) {
    var cpus = require('os').cpus().length;
    console.log('No of cpus:' + cpus);
    console.log(require('os').cpus());

    for (var i = 0; i < cpus; i++) {
        cluster.fork();
    }

    cluster.on('fork', function(worker) {
        console.log('worker:' + worker.id + " is forked");
    });
    cluster.on('online', function(worker) {
        console.log('worker:' + worker.id + " is online");
    });
    cluster.on('listening', function(worker) {
        console.log('worker:' + worker.id + " is listening");
    });
    cluster.on('disconnect', function(worker) {
        console.log('worker:' + worker.id + " is disconnected");
    });
    cluster.on('exit', function(worker) {
        console.log('worker:' + worker.id + " is dead");
    });

} else {
    http.createServer(function(req, res) {

        console.log('worker:' + cluster.worker.id + " going to send response ");
        res.writeHead(200);
        res.end("hello world. worker: " + cluster.worker.id);
        var stop = new Date().getTime();
        while (new Date().getTime() < stop + 5000) {;
        }
    }).listen(8000);
}

OUTPUT:

20 Aug 00:36:11 - [nodemon] restarting due to changes...
20 Aug 00:36:12 - [nodemon] starting `node cluster.js`
No of cpus:2
[ { model: 'Intel(R) Core(TM)2 Duo CPU     E4500  @ 2.20GHz',
    speed: 2200,
    times: { user: 2264671, nice: 0, sys: 698343, idle: 5965109, irq: 98812 } },
  { model: 'Intel(R) Core(TM)2 Duo CPU     E4500  @ 2.20GHz',
    speed: 2200,
    times: { user: 2466000, nice: 0, sys: 502562, idle: 5959203, irq: 4609 } } ]
worker:1 is forked
worker:2 is forked
worker:2 is online
worker:1 is online
worker:2 is listening
worker:1 is listening
worker:1 going to send response
worker:1 going to send response
worker:1 going to send response
worker:1 going to send response
worker:1 going to send response
worker:1 going to send response
worker:1 going to send response
worker:1 going to send response
worker:1 going to send response
worker:1 going to send response
worker:1 going to send response
worker:1 going to send response
worker:1 going to send response
worker:1 going to send response
worker:1 going to send response
worker:1 going to send response
worker:1 going to send response
worker:1 going to send response
worker:1 going to send response
worker:1 going to send response

我注意到一件事。如果我强制重新加载(ctrl+f5)选项卡,那么两个工作人员都会相继响应。 输出:

worker:1 going to send response
worker:2 going to send response
worker:1 going to send response
worker:2 going to send response
worker:1 going to send response
worker:2 going to send response
worker:1 going to send response
worker:2 going to send response
worker:1 going to send response
worker:2 going to send response
worker:1 going to send response
worker:2 going to send response
worker:1 going to send response
worker:2 going to send response
worker:1 going to send response
worker:2 going to send response
worker:1 going to send response
worker:2 going to send response
worker:1 going to send response
worker:2 going to send response
worker:1 going to send response
worker:2 going to send response
worker:2 going to send response
worker:1 going to send response
worker:2 going to send response
worker:1 going to send response
worker:2 going to send response
worker:1 going to send response
worker:2 going to send response

我很困惑正常刷新(f5)和强制重新加载(ctrl + f5)这里发生了什么。帮我弄清楚...!


从表面上看,TIL 节点集群似乎并没有做到它所说的那样(至少对我来说)。

我的情况与您相同,当我从浏览器同步生成它们时,观察到相同的工作进程总是收到请求。我的一位同事使用 fiddler 一次重播约 20 个请求。当所有这些请求非常快地到达服务器时,比集群管理器将它们传递给工作人员的速度更快(我猜测),那么您将看到其他工作人员被请求调用。

看起来,一旦经理将请求交给工作人员,它就不会知道/关心工作人员的阻塞。它只知道管道中只有一个请求,并且不需要将该请求提供给第一个工作人员以外的任何人,因为据经理所知,他是可用的。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Node.js 中的集群不起作用。只有一名工人始终在响应 的相关文章

随机推荐

  • 如何在 XML Schema 1.1 中使用替代方案

    从我读到的所有内容来看 我在下面定义的模式应该有效 强调替代方案 我收到以下错误 http www w3 org 2001 XMLSchema alternative 在此上下文中不支持元素 你能指出我做错了什么吗 这是我当前的架构
  • 如何在 Android 中将图像 URL 分享到 WhatsApp?

    我需要在我的应用程序中将图像分享到 WhatsApp 我有图片网址 为了分享到 WhatsApp 我使用以下代码 String image url http images cartradeexchange com img 800 vehic
  • 如何禁用heroku上的资产管道?

    heroku cedar 隐式预编译了我的资产 即使我已经写了 config assets enabled false 如何禁用资产功能 问题是编译 slug 时应用程序配置不可用 最近解决了这个问题http devcenter herok
  • while 循环仅在 bash 中的文件的第一行上运行[重复]

    这个问题在这里已经有答案了 我有一个 while 循环 应该迭代一个文本文件 但停在第一行 我不明白为什么 我的代码如下 while read hadoop accounts do if grep no lock no remove the
  • 调试Android振动

    各位 我的手机无缘无故震动 所以我想确定发送振动命令来振动的应用程序 Android 会记录此类事件吗 或者我可以编写一个应用程序来监控Vibrator vibrate TIMEOUT 来自另一个应用程序的调用 笔记 我有 root 访问权
  • 2D 位集存储为 1D 时的 XOR 位集

    回答当你只关心速度时如何存储二进制数据 我想写一些来做比较 所以我想用std bitset 然而 为了公平比较 我想要一个一维std bitset模拟 2D 所以不要有 bitset lt 3 gt b1 string 010 bitset
  • JAX-WS 返回空列表

    我是网络服务新手 我遇到了一些问题 在服务器端我使用 spring ws 在客户端我使用jax ws 使用 wsimport 工具 我根据我的 wsdl 生成了 java 类 一切正常 但由于某种原因 jax ws 无法正确解析数组和列表
  • 使用 Struts 2 实现 Spring Security

    我想实现 Spring Security Struts2 我在执行项目时遇到了问题 没有为与上下文路径 Project 关联的名称空间 和操作名称 j spring security check 映射的操作 因为struts xml中没有名
  • 使用 Java Mail 下载附件

    现在我已经下载了所有消息并将它们存储到 Message temp 如何获取每封邮件的附件列表 List
  • GKE:带有推送订阅者的 Pod 之间的 Pubsub 消息

    我正在使用具有多个 Pod 的 GKE 部署 并且需要在 Pod 之间发送和接收消息 我想用pubsub 推送订阅者 我发现对于推送 我需要为订阅者 Pod 配置 https 访问 为了接收推送消息 您需要一个可公开访问的 HTTPS 服务
  • 反编译器字节码和混淆器

    我们可以从java字节码完全逆向工程源代码吗 为什么 Java 中允许此功能以及 Java 反编译器对抗混淆器的成功率如何 我知道这个问题很老了 但我一直在寻找可靠的答案 直到什么也没找到 因此 在这篇文章中 我总结了我在混淆 J2EE J
  • XML 序列化对象列表

    查看 Microsoft 关于 XML 序列化的文章 https msdn microsoft com en us library 58a18dwa aspx 他们在 序列化对象数组 下给出了一个示例 如下所示 public class P
  • 使用 java asm 获取函数参数值以进行字节码检测

    我使用 asm 在每个执行的函数中插入回调函数 我如何打印争论者的价值观 我正在使用 MethodAdapter visitCode 将我的函数注入到运行的每个函数中 我想将函数参数插入到一个数组中 并将该数组发送给我的回调函数 并将参数返
  • 为什么某些 TemplateBinding 值未显示在设计器中,而其他值却显示在设计器中? [带有重现代码]

    我遇到了一个奇怪的情况 以下示例代码替换窗口的内容 使用设置器的背景颜色并提供带有两个标签的堆栈面板 一张用于背景 一张用于标题 问题是 他们在设计时
  • 使用 Node.js 通过 Raspberry Pi 3 model B 进行 GPIO

    我正在尝试使用树莓派 3 B 型让 LED 闪烁 我的机器上安装了所有必需的模块 即 npm nodejs pi gpio 修复了检测 gpio 的微小更改 代码是 var gpio require pi gpio gpio open 16
  • 从 Javascript 调用 Google Chrome 扩展

    有一个很棒的扩展名为Blipshot它获取页面屏幕截图 我需要使用页面级 JavaScript 调用扩展 而不是单击其图标 这可能吗 您不能从网页内调用扩展的任何方法 但是 可以将内容脚本注入网页 并使用sendMessage and on
  • AJAX 函数未返回变量

    随着我的框架的增长 我决定将其拆分为文件 而不是将其留在主设计文件中 但是 通过这样做 函数的返回不会返回任何值 数据不为空 如果我提醒 js 文件中的值 它们就在那里 功能 js 文件中的第一个函数 在执行之前包含 var lock ge
  • 将模板类的对象传递给另一个类的构造函数

    我有一个模板类 template lt typename T gt class A private T array public A int size Initialises array with size 现在我需要一个类 B 它接收类
  • 键盘箭头的扫描码是什么? (右、左、下、上)

    我需要扫描代码的箭头 右 左 下 上 我正在汇编器中制作软件 我需要知道键盘箭头扫描码的十六进制值 这些是 ASCII 代码页下部的箭头字符的字符代码 Up 0x18 向下 0x19 右 0x1A 左 0x1B 还有Unicode 中的箭头
  • Node.js 中的集群不起作用。只有一名工人始终在响应

    我正在 Node js 中练习集群 我有一个两核 CPU 我创建了两个worker 每个worker 运行一个简单的http 服务器 服务器响应回调将阻塞 5 秒 以便向其他工作人员发出下一个请求 为了验证工作人员是否并行工作 我在 Fir