5

我不是 node.js 大师,所以我想对此有更多的看法。

我正在创建一个 HTTP node.js Web 服务器,它不仅必须处理大量并发连接,而​​且还必须处理长时间运行的作业。默认情况下,node.js 在一个进程上运行,如果有一段代码需要很长时间才能执行任何后续连接,则必须等到代码结束它在前一个连接上所做的事情。

例如:

var http = require('http');
http.createServer(function (req, res) {

  doSomething(); // This takes a long time to execute

  // Return a response
}).listen(1337, "127.0.0.1");

所以我正在考虑使用node-webworker库在单独的线程中运行所有长时间运行的作业:

var http = require('http');
var sys = require('sys');
var Worker = require('webworker');
http.createServer(function (req, res) {

  var w = new Worker('doSomething.js'); // This takes a long time to execute

  // Return a response
}).listen(1337, "127.0.0.1");

为了让整个事情更高效,我还想使用集群为每个 CPU 核心创建一个新的节点进程。

通过这种方式,我希望通过不同的进程来平衡客户端连接cluster(如果我在四核上运行它,假设是 4 个节点进程),然后在单独的线程上执行长时间运行的作业node-webworker

这个配置有问题吗?

4

3 回答 3

3

我看到这篇文章已经有几个月的历史了,但我想在有人出现的情况下对此发表评论。

“默认情况下,node.js 在一个进程上运行,如果有一段代码需要很长时间才能执行任何后续连接,则必须等到代码结束它在前一个连接上所做的事情。”

^-- 这并不完全正确。如果做某事();需要在你发回响应之前完成,那么是的,但如果不是,你可以利用 Node.js 核心中提供给你的异步功能,并立即返回,而该项目在背景。

通过在您的服务器中添加以下代码,可以看到我正在解释的一个简单示例:

setTimeout(function(){
    console.log("Done with 5 second item");
}, 5000);

如果您点击服务器几次,您将在客户端立即获得响应,并最终在响应发送后几秒钟内看到控制台填充消息。

于 2012-02-23T23:00:52.663 回答
1

为什么不直接将代码复制并粘贴到文件中,然后在JXcore上运行它

$ jx mt-keep:4 mysourcefile.js

看看它的表现如何。如果您需要真正的多线程而不离开单线程的安全性,请尝试 JX。它 100% 兼容 node.JS 0.12+。您可以生成线程并在每个线程中分别运行整个 node.js 应用程序。

于 2014-02-19T23:35:51.823 回答
0

您可能想查看 Q-Oper8,因为它应该为这种事情提供更灵活的架构。完整信息在:

https://github.com/robtweed/Q-Oper8

于 2011-09-09T06:19:35.773 回答