2

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

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

实际的测试数据——来自 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 的错误用例吗?

4

2 回答 2

0

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

所以,是的,节点可能需要 3 秒来处理所有这些请求并处理它们。

有几种方法可以“解决”这个问题,具体取决于您的情况:

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

  2. 使用后台队列机制(又名:Resque,Beanstalk)并有一个后台工作人员(或由集群产生的进程)来分配工作(到节点工作进程等待从这个队列中挑选东西)

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

于 2013-10-16T20:37:29.057 回答
0

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

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

非常简单的场景,但是当我使用 jmeter 创建 1000 个线程(每个线程进行 50 次调用)来调用服务器 AI 时,平均响应时间约为 4 秒(对于 50000 次调用)。

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

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

于 2013-12-28T19:54:11.830 回答