来自NodeJS的多个后端非阻塞调用给出了缓慢的响应

时间:2013-10-16 20:11:05

标签: performance node.js rest

我有一个特定的用例,我试图用Node解决。我从NodeJS收到的响应时间不是我期望的。

该应用程序是一个express.js Web应用程序。流程如下 一个。请求到达服务器。 湾根据该参数,调用后端REST服务。 C。 REST服务的响应具有指向多个其他对象的链接。 d。浏览每个链接并收集数据。 即格式化这些数据(不多)并发送给客户端。

实际测试数据 - 来自C的响应有100个链接,因此我进行了100次并行调用(我使用async.map)。每个后端服务的响应时间不到30毫秒。但100个请求的总响应时间是4秒。这是相当高的。

我观察到的是: 第一个后端请求和最后一个后端请求之间的时差约为3秒。我相信这是因为Node是单线程的,并且需要3秒才能放置所有100个http请求。

我用来进行并行调用的代码如下所示

var getIndividualRecord = function(entity,callback1)
{ 
        httpExecutor.executeRequest( entity.link.url, callback1);
}

var aggregateData = function(err, results)
{
    callback(null, results);
}
async.map(childObjects, getIndividualRecord, aggregateData);

childObjects是一个包含100条记录的数组。 httpExecutor使用请求模块进行REST调用。

我在做什么不对,或者这是一个错误的Node用例?

2 个答案:

答案 0 :(得分:0)

您的假设是正确的:节点是单线程的,因此当您的HTTP请求以非阻塞方式发生时(请求是在另一个之后发出的,甚至没有等待来自服务器的响应) ,它们并非真正发生在同时

所以,是的,很可能需要Node 3秒来完成所有这些请求并处理它们。

有几种“围绕”这种方式,可能会根据您的情况而有效:

  1. 您是否可以使用Node的cluster模块生成多个节点应用程序,每个应用程序都可以完成部分工作?然后你同时做事(因为你正在进行N节点处理)。

  2. 使用后台队列机制(又名:Resque,Beanstalk)并让后台工作程序(或使用Cluster生成的进程)分发工作(等待Node工作进程等待从该队列中取出的东西)< / p>

  3. 重新构建您的网络应用程序以处理部件需要一段时间的事实。也许渲染大部分页面然后onload发出一个ajax请求,触发3秒路径,然后在AJAX请求返回时将结果放入一些DOM元素。

答案 1 :(得分:0)

我有类似的情景和类似的观察。

在我的情况下,我使用pm2运行节点应用程序。在应用程序中有2个子服务器(我们称之为A和B)。 pm2每个服务器产生2个进程。从客户端我调用服务器A,它计算简单的东西,并以异步方式调用服务器B.当服务器B响应服务器A时,将数据发送回客户端。

非常简单的情况但是当我使用jmeter来创建1000个线程(每个线程进行50次调用)来呼叫服务器A时,我得到了大约4秒的平均响应(对于50000个呼叫)。

服务器B在50ms后响应,我认为这是问题所在。在前50ms,nodejs处理大量传入请求,然后无法快速处理来自服务器B和来电的响应。

我希望应用程序代码在单线程中执行,但应该有后台线程来处理所有其余的。似乎情况并非如此。