5

我不是node.js主控,因此我想对此有更多的观点。使用集群和节点webworker构建高性能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"); 

而且使整个事情更高性能的,我认为也使用cluster为每个CPU内核创建一个新的节点进程。

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

这个配置有什么问题吗?

回答

3

我看到这个帖子是一个几个月大的,但我想,有人走来提供的事件给这个评论。 “

”默认情况下,node.js在一个进程上运行,并且如果有一段代码需要很长时间来执行任何后续连接,则必须等到代码结束之前连接的操作。

^- 这不完全正确。如果doSomething();在返回响应之前需要完成,然后是,但是如果不是,您可以使用Node.js核心中可用的异步功能,并立即返回,而此项目在背景。

的什么,我解释可以通过在服务器中加入以下代码可以看到一个简单的例子:

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

如果碰到服务器几次,你就会在客户端上的即时响应方面,并最终看到控制台填充发送响应后的消息。

1

你为什么不只是复制和你的代码粘贴到一个文件,并像

$ jx mt-keep:4 mysourcefile.js 

跑过来JXcore,看看它是如何执行。如果你需要一个真正的多线程而没有离开单线程的安全,试试JX。它的100%node.JS 0.12+兼容。您可以生成线程并在其中分别运行一个完整的node.js应用程序。