node.js cluster:让每个worker呈现不同的页面

时间:2014-03-19 11:11:22

标签: javascript node.js child-process

所以我使用cluster为一些朋友运行一些聊天机器人。我使用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时,我最终会遇到同一个机器人的多个实例,这很俗气。)

1 个答案:

答案 0 :(得分:1)

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

你现在拥有的是:

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

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

如果您向/ bot1发送请求并且Node随机指定它由P3处理,那么您将收到错误Cannot GET /bot1,因为P3不知道这条路是什么意思。反过来也是如此。

也许您真正想要的是一些机器人进程和一个侦听端口3000的进程,然后使用worker.send()等将消息转发到僵尸程序进程。