Node.js集群:让每个worker渲染不同的页面



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

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

虽然这在理论上工作得很好,但我只得到一个具有输出的bot。

如果我去example.com:3000/bot2,我得到bot2作为输出。

如果我去example.com:3000/bot1,我得到Cannot GET /bot1

哪一个会起作用似乎是随机的,但永远不会两个都起作用。

如果这是愚蠢的简单的事情,或者如果它不能完成道歉。我只是发现cluster在退出时重新启动自己更有效,而且通常比child_process更稳定。(有时,当我使用child_process时,我最终会得到同一个bot的多个实例,这很俗套。)

你似乎误解了cluster的工作原理。它对这种情况没有帮助,并且主要被设计为启动多个进程侦听同一端口的HTTP连接的方法。

你现在拥有的是:

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

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

如果你发送一个请求到/bot1和Node随机分配它由P3处理,那么你会得到你看到Cannot GET /bot1的错误,因为P3不知道那个路径意味着什么。反之亦然

也许你真正想要的是一些bot进程和一个监听端口3000的进程,然后使用worker.send()等将消息转发给bot进程。

相关内容

  • 没有找到相关文章

最新更新