使用多个快速流程的最佳方式?

时间:2013-12-26 16:37:01

标签: node.js express

所以我正在运行一系列聊天机器人,这些聊天机器人与它们关联的网站很少。我正在使用快递和把手做所有的事情。我正在使用iptables将端口3000上的所有数据路由到端口80

但是,虽然包装器文件在端口3000上工作,但由于机器人是作为子进程启动的,因此每个机器人必须具有不同的端口。我使用包装器路由到端口,但它仍然很烦人。

例如,我在端口chatbot.example.com上有3000,但由于bot#1是子进程,因此它在端口3001上运行其Web服务器。

所以我将包装路由chatbot.example.com/bot1改为chatbot.example.com:3001/bot1 但这感觉非常俗气。

有没有更好的方法呢?

当前代码示例:snippi

2 个答案:

答案 0 :(得分:1)

考虑使用cluster模块进行设置,而不是手动创建包装器并生成子进程。它可能比你拥有的更稳定,如果那是你想要做的事情,应该让它们共享一个端口。

我也不会在一个进程==一个聊天机器人之间耦合(如果是我)。相反,我会编写应用程序,以便任何进程都可以使用常规的Express路由选择基于路径params或querystring params的任何聊天机器人进行响应。这样,如果您可以根据实际使用情况对流程进行负载均衡;一个受到很多打击的聊天机器人可能会被2个或3个进程服务,而一个根本没有被使用的聊天机器人不会消耗额外的资源。

更新示例代码 因此,在我看来,你有点混淆目的。我无法从你的片段中分辨出每个网站应该做什么,除了它与给定的聊天机器人有关。我在这里猜测每个聊天机器人网站的目的是显示相对于聊天机器人聊天的活动。在我看来,你最好将聊天机器人作为一个节点应用程序启动(或者每个聊天机器人一个,无论哪种方式都可以),每个都记录到某种类型的数据库,无论你想跟踪什么状态。 MongoDb,CouchDb,一些SQL db,没关系。然后,Web应用程序可以只是一个应用程序,只需读取该数据库并根据路径过滤给定的聊天机器人。

总的来说,感觉你正试图让一个应用程序做得太多。

答案 1 :(得分:0)

Express可以处理虚拟主机。我使用带有集群的express.vhost()在同一台服务器上运行3个站点,它们都监听同一个端口。

所以,你可以做一些像chatbot1.site.com,chatbot2.site.com这样的应用程序,只需要不同的虚拟主机。

// main 'server.js' app
var express = require('express');
var app = express();

app
    .use(express.vhost('chatbot1.site.com', require('./chatbot1.js').app ) )
    .use(express.vhost('chatbot2.site.com', require('./chatbot2.js').app ) );

// delay for db connections to start up (just what I do)
setTimeout( function () {
    app.listen(port);
}, 2000);

在“chatbot#.js”文件中,您需要导出您的应用:

// chatbot#.js
var app = exports.app = express ();

'chatbox.js'文件中的应用也不会收听端口,因为'server.js'应用开始收听。您甚至可以使用1个chatbot.js文件,具体取决于您存储/获取信息的方式。我认为复制'chatbot1.js'并使用不同的设置制作'chatbot2.js'会很简单。取决于您以及您的“聊天机器人”的安装方式。

顺便说一下,这个系统在群集中运行良好,因为你只需要将代码包裹在'server.js'文件中的代码周围。