我不是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
。
此配置有问题吗?
答案 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,因为它应该为这种事情提供更灵活的架构。完整信息: