使用cluster和node-webworker构建高性能node.js应用程序

时间:2011-09-09 04:58:12

标签: performance node.js concurrency cluster-computing web-worker

我不是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 个答案:

答案 0 :(得分:3)

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

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

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

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

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

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

答案 1 :(得分:1)

为什么不将代码复制并粘贴到文件中并通过JXcore运行

$ jx mt-keep:4 mysourcefile.js

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

答案 2 :(得分:0)

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

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