【问题标题】:Node.js block responseNode.js 阻止响应
【发布时间】:2013-01-23 09:16:14
【问题描述】:

当我的一个“长”响应以某种方式阻止另一个 AJAX 请求时,我遇到了不愉快的情况。 我同时调用 3 个不同的资源:

var list = ['/api/filters','/api/criteria/brands','/api/criteria/genders']  
list.forEach(function(item){$.post(item)})

在服务器端,我可以在日志文件中看到以下时间:

GET /api/filters 304 51ms
GET /api/criteria/genders 200 1ms
GET /api/criteria/brands 200 0ms

这对我来说看起来很酷,但在浏览器中图片完全不同。

picture with google chrome network tab

所以看起来浏览器首先等待答案(长请求),然后才收到最后 2 个结果。

这种行为的原因可能是什么?

【问题讨论】:

  • 50 毫秒以下的速度非常快,这有什么问题,可能只是您的网络
  • 这在带有 SSD 的本地机器上,因此实时延迟会“有点”更长。实际上 51ms 只是输出响应大约 300kb 先前缓存在内存中的 JSON(没有任何计算、数据库请求等)
  • 你为什么不把它放在一个真实的网络环境中,(AWS,Heroku),以确保你没有为幽灵优化

标签: javascript ajax node.js express blocking


【解决方案1】:

每个浏览器一次只处理特定数量的并发请求。如果您同时触发 10 个 ajax 请求,浏览器会将它们放在一个堆栈中并一个接一个地处理。

您可以在浏览器this question 中找到有关并发请求的更多信息(因为其中还包括图像、javascript 等)。

【讨论】:

  • 但我只打了 3 个电话,即使是从控制台也可以使这种情况尽可能清晰
【解决方案2】:

节点服务器运行是单线程的,任何使用 CPU 周期的代码都会阻塞整个进程。

因此,如果GET /api/filters 进行大量 CPU 密集型计算,它将阻塞任何其他请求,直到完成。添加一些关于它实际作用的更多信息有助于形成更好的答案。

如果您有 IO 操作,请尝试使它们异步。这将允许节点在第一个执行 IO 时为其他 URL 提供服务。

【讨论】:

    猜你喜欢
    • 2013-07-18
    • 1970-01-01
    • 2012-10-15
    • 2021-05-11
    • 1970-01-01
    • 1970-01-01
    • 2021-08-31
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多