我们有一个node.js服务器,它实现了一个REST API作为中央服务器的代理,该服务器有一个稍微不同的,不幸的是非对称的REST API.
我们的客户端在各种浏览器中运行,要求节点服务器从中央服务器获取任务.节点服务器从中央任务ID获取所有任务ID的列表,并将它们返回给客户端.然后,客户端通过代理为每个id发出两个REST API调用.
据我所知,这些东西都是异步完成的.在控制台日志中,当我启动客户端时它看起来像这样:
Requested GET URL under /api/v1/tasks/*: /api/v1/tasks/
Run Code Online (Sandbox Code Playgroud)
这需要几秒钟才能从中央服务器获取列表.一旦得到响应,服务器就会很快地解决这个问题:
Requested GET URL under /api/v1/tasks/id/:id :/api/v1/tasks/id/438
Requested GET URL under /api/v1/workflow/id/:id :/api/v1/workflow/id/438
Requested GET URL under /api/v1/tasks/id/:id :/api/v1/tasks/id/439
Requested GET URL under /api/v1/workflow/id/:id :/api/v1/workflow/id/439
Requested GET URL under /api/v1/tasks/id/:id :/api/v1/tasks/id/441
Requested GET URL under /api/v1/workflow/id/:id :/api/v1/workflow/id/441
Run Code Online (Sandbox Code Playgroud)
然后,每当一对这些请求从中央服务器获得结果时,另外两行很快被禁止.
所以我们的node.js服务器似乎只愿意一次发出六个请求.
使用Node.js通过HTTP请求查询某些公共API.因此,我正在使用该request模块.我正在测量我的应用程序中的响应时间,并看到我的应用程序从API查询返回的结果比通过curl或浏览器中的"直接"请求慢2-3倍.此外,我注意到与启用HTTPS的服务的连接通常比纯HTTP服务更长,但这可能是巧合.
我试图优化我的request选择,但无济于事.例如,我查询
https://www.linkedin.com/countserv/count/share?url=http%3A%2F%2Fwww.google.com%2F&lang=en_US
我正在使用request.defaults设置所有请求的总体默认值:
var baseRequest = request.defaults({
pool: {maxSockets: Infinity},
jar: true,
json: true,
timeout: 5000,
gzip: true,
headers: {
'Content-Type': 'application/json'
}
});
Run Code Online (Sandbox Code Playgroud)
实际请求是通过
...
var start = new Date().getTime();
var options = {
url: 'https://www.linkedin.com/countserv/count/share?url=http%3A%2F%2Fwww.google.com%2F&lang=en_US',
method: 'GET'
};
baseRequest(options, function(error, response, body) {
if (error) {
console.log(error);
} else {
console.log((new Date().getTime()-start) + ": " + response.statusCode);
}
});
Run Code Online (Sandbox Code Playgroud)
有人看到优化潜力吗?我做错了什么吗?提前感谢任何建议!
我正在开发NodeJS应用程序。有一个特定的RESTful API(GET),当用户触发该API时,它要求服务器执行大约10到20个网络操作才能从不同来源获取信息。所有这些网络操作都是异步回调,一旦它们全部完成,结果将由nodejs应用程序合并并发送回客户端。所有这些操作都是通过async.map函数并行启动的。
我只想了解一下,因为nodejs是单线程的,并且不使用多核计算机(至少不是没有集群),所以当节点有许多回调要处理时,节点如何扩展?回调的实际处理是取决于节点的单线程是否空闲,还是与主线程并行处理回调?
我问的原因是,我看到我的20个回调的性能从第一个回调降到了最后一个。例如,第一个网络操作(从10到20)需要141毫秒才能完成,而最后一个网络操作则需要约4秒钟(以从执行该功能到函数的回调返回值或一个错误)。它们都是相同的网络操作,因此命中相同的数据源,因此数据源不是瓶颈。我知道一个事实,即数据源响应单个请求所花费的时间不超过200ms。
我找到了这个线程,所以在我看来,一个线程需要处理所有回调和即将出现的新请求。
所以我的问题是,对于将触发许多回调的操作,优化其性能的最佳实践是什么?