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

我不是一个node.js主,所以我想对此有更多的观点。

我正在创build一个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核心创build一个新的节点进程。

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

这个configuration有什么问题吗?

我看到这个post已经过了几个月了,但是如果有人出现,我想提供一个评论。

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

^ – 这不完全是真的。 如果doSomething(); 需要完成之后才能发送回应,那么是的,但是如果不是的话,你可以使用Node.js核心中的可用的asynchronousfunction,并立即返回,而这个项目在背景。

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

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

如果你打了几次服务器,你会立即在客户端得到响应,最终在响应被发送后的几秒钟内看到控制台填充了消息。

你为什么不把你的代码复制并粘贴到一个文件中,并像JXcore一样运行它

 $ jx mt-keep:4 mysourcefile.js 

并看看它是如何执行的。 如果你需要一个真正的multithreading,而不离开单线程的安全性尝试JX。 其100%node.JS 0.12+兼容。 你可以产生线程,并在其中分别运行一个完整的node.js应用程序。

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

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