当我使用以下代码启动nodeJS应用程序并从浏览器激活http://localhost:3222/时,应用程序需要超过2000毫秒才能返回响应。
var http = require('http');
http.createServer(function (req, res) {
res.writeHead(200, {'Content-Type': 'text/plain'});
res.end(fib(40).toString());
}).listen(3222, '127.0.0.1');
function fib(n) {
if (n <= 1) {
return n;
}
return fib(n-1) + fib(n-2);
}
然后我尝试使用Apache bench同时访问url,我注意到请求是以严肃的方式而不是并发方式执行的。
>ab -n 3 -c 1 http://localhost:3222/
1724ms (longest request)
严肃对待3次请求,平均每次采取1713ms,最长时间为1724ms
>ab -n 3 -c 3 http://localhost:3222/
5195ms (longest request)
同时发出3个请求,平均每个采用3483毫秒,最长时间为5195毫秒。
上面的时间清楚地表明请求不是由节点服务器同时执行的。
我的问题是,应该如何在生产nodeJS应用程序中处理这些场景?
注意:给出的代码仅用于表示目的,我有兴趣知道如何在nodeJS app中处理耗时,复杂的业务逻辑而不阻塞主线程。
答案 0 :(得分:0)
您的测试用例的问题是:Node.js是单线程的。异步函数用于非阻塞I / O:您可以等待数据库查询或文件写入等完成并同时执行其他操作。但是如果你得到一些需要很长时间才能执行的代码,那么所有其他操作都会被推迟,直到代码执行完成为止。
您可以启动node.js应用程序的多个实例,并使用haproxy或类似程序进行一些负载平衡。但唯一真正的解决方案是将计算与请求处理分离。