所以我使用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是什么。它只知道P2
和P3
都设置为处理该端口上的请求,因此它将随机选择一个来处理请求。
如果你发送一个请求到/bot1和Node随机分配它由P3
处理,那么你会得到你看到Cannot GET /bot1
的错误,因为P3
不知道那个路径意味着什么。反之亦然
也许你真正想要的是一些bot进程和一个监听端口3000的进程,然后使用worker.send()
等将消息转发给bot进程。