javascript - Node.js集群: have each worker render different page

标签 javascript node.js child-process

所以我使用集群为一些 friend 运行一些聊天机器人。我使用 express 为每个机器人运行一个页面。然而,集群不喜欢这样。我的代码(删节)类似于以下内容:

var configs = {
  bot1:"bot1",
  bot2:"bot2"
};

if (cluster.isMaster) {
  for (var bot in configs) {
    cluster.fork( { file:configs[bot] } );
  }
} else {
  var file = process.env["file"];
  var page = "/" + process.env["file"];
  var express = require("express");
  var web = express();
  web.listen(3000);

  web.get(page,function(req,res){
    res.send( file );
  });
}

虽然这在理论上效果很好,但我只得到一个有输出的机器人。

如果我访问 example.com:3000/bot2 我会得到 bot2 作为输出。

如果我访问 example.com:3000/bot1,我会收到 Cannot GET/bot1

哪一个可行似乎是随机的,但两者都行不通。

如果事情太简单或者无法完成,我们深表歉意。我只是发现cluster在退出时重新启动自身更有效,并且通常比child_process更稳定。 (有时,当我使用 child_process 时,我最终会得到同一个机器人的多个实例,这很俗气。)

最佳答案

您似乎误解了集群的工作原理。它对于这种情况没有帮助,主要是为了启动多个进程监听同一端口的 HTTP 连接而设计的。

您现在拥有的是:

  • P1 => 启动 P2 和 P3 的主进程。
  • P2 => 监听端口 3000 处理 /bot1
  • P3 => 监听端口 3000 处理 /bot2

当请求到达端口 3000 时,Node 不知道 URL 是什么。它只知道 P2P3 都设置为处理该端口上的请求,因此它会随机选择一个来处理该请求。

如果您向/bot1 发送请求,并且 Node 随机分配该请求由 P3 处理,那么您将收到所看到的错误 Cannot GET/bot1,因为 P3 不知道这条路径意味着什么。反之亦然。

也许您真正想要的是一定数量的机器人进程和一个监听端口 3000 的单个进程,然后使用 worker.send() 等将消息转发到机器人进程。

关于javascript - Node.js集群: have each worker render different page,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22503964/

相关文章:

javascript - 具有不同形状的交叉过滤数据

javascript - Android 为 Node.js 服务器抛出 FileNotFoundException

node.js child_process 生成忽略等号

javascript - 让所有功能异步的任何缺点?

javascript - Node.js 请求模块获取现代版本的网站

javascript - 单击后从 showcomments 中删除类() - 来自所有类似的类?

javascript - 如何在超链接中包含 JavaScript 变量?

node.js - Koa 和 Express 4.0 有什么区别?

node.js - Airtable动态添加列

boost - 使用boost进程库防止子进程继承父进程打开的TCP端口