为什么 Node.js 一次只处理六个请求?

2023-11-22

我们有一个 Node.js 服务器,它实现了 REST API 作为中央服务器的代理,而中央服务器的 REST API 略有不同,而且不幸的是不对称。

我们的客户端运行在各种浏览器中,要求节点服务器从中央服务器获取任务。节点服务器从中央服务器获取所有任务 ID 的列表,并将其返回给客户端。然后,客户端通过代理对每个 id 进行两次 REST API 调用。

据我所知,这些东西都是异步完成的。在控制台日志中,当我启动客户端时,它看起来像这样:

Requested GET URL under /api/v1/tasks/*: /api/v1/tasks/

从中央服务器获取列表需要几秒钟的时间。一旦收到响应,服务器很快就会抛出此消息:

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

然后,每次一对这样的请求从中央服务器获得结果时,另外两行很快就会被抛出。

所以看来我们的 Node.js 服务器一次只愿意发出 6 个请求。


Node 本身没有施加 TCP 连接限制。 (重点是它是高度并发的,可以处理数千个同时连接。)您的操作系统may限制 TCP 连接。

更有可能的是,您要么遇到了后端服务器的某种限制,要么遇到了内置 HTTP 库的连接限制,但如果没有有关该服务器或 Node 实现的更多详细信息,很难说。

节点内置HTTP 库(显然,任何建立在它之上的库,这是大多数)维护一个连接池(通过Agent类),以便它可以利用 HTTP keep-alive。当您向同一服务器运行多个请求时,这有助于提高性能:而不是打开 TCP 连接、发出 HTTP 请求、获取响应、关闭 TCP 连接并重复;可以在重用的 TCP 连接上发出新请求。

在节点 0.10 及更早版本中,HTTP 代理默认情况下只会打开到单个主机的 5 个同时连接。您可以轻松更改此设置:(假设您已经required HTTP 模块为http)

http.globalAgent.maxSockets = 20; // or whatever

node 0.12设置默认值maxSockets to Infinity.

您可能希望保留某种连接限制。您不希望一秒钟内数百个 HTTP 请求完全压垮您的后端服务器 - 性能很可能比您只是让代理的连接池执行其操作(限制请求以免服务器过载)更差。最好的选择是运行一些实验,看看在您的情况下并发请求的最佳数量是多少。

然而,如果你真的不想要连接池,你可以简单地完全绕过连接池 – 发送agent to false在请求选项中:

http.get({host:'localhost', port:80, path:'/', agent:false}, callback);

在这种情况下,并发 HTTP 请求绝对没有限制。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

为什么 Node.js 一次只处理六个请求? 的相关文章

随机推荐

  • 如何在Flutter中的TextFormField标签中添加红色星号

    由于我们无法制作像 RichText Text Span 这样的小部件来设置 TextFormField 的样式 任何人都可以帮我解决这个问题吗 现在得到 预期结果 我们怎样才能达到这样的结果呢 最简单的方法 但不完全等于 TextFiel
  • 没有 Storyboard 和 ARC 的 Xcode

    我已经下载了新的 xcode 5 并刚刚开始使用它 我们可以直接创建包括故事板和ARC的应用程序 它不像早期版本那样要求选项 所以 我的问题是我们如何在没有 ARC 和 Storyboard 的情况下使用 xcode5 我们必须手动删除故事
  • Django PIL:IOError 无法识别图像文件

    我正在学习 Python 和 Django 用户使用 forms ImageField 提供图像 然后我必须对其进行处理才能创建两个不同大小的图像 当我提交表单时 Django 返回以下错误 IOError at add event can
  • 在c#中模拟无限滚动以获取页面的完整html

    有很多网站都使用这种 我认为 令人讨厌的 无限滚动 风格 例如 tumblr twitter 9gag 等网站 我最近尝试使用 HtmlAgilityPack 以编程方式从这些网站上抓取一些图片 像这样 HtmlWeb web new Ht
  • gcc 4.8.1 中的 C++11:复制构造函数的列表初始化不起作用

    我鼓励这个问题 如果我有 class A public int main A a A b a 海湾合作委员会给出 move cc 在函数 int main 中 move cc 15 7 错误 A 的初始值设定项太多 A b a 但是当我使用
  • 如何使用express js创建一个简单的html服务器

    我是 node js 新手 我想创建一个简单的express js 静态文件服务器 但我有一些问题 我已经在全球安装了express js 4 2 如下所示 npm install g express generator 我在 httpsr
  • 如果被少于五个连续零包围,则将向量中的零更改为一

    我有一个向量0s and 1s 并想要识别字符串所在的索引0s 被包围1s 如果数量0之间的1s 小于或等于 5 我想将这些零更改为1s 这是一个例子 gt x lt c 0 0 0 1 1 1 0 0 0 1 1 0 0 0 0 0 0
  • 如何调度一个超时的 Redux 操作?

    我有一个操作可以更新我的应用程序的通知状态 通常 此通知将是某种错误或信息 然后 我需要在 5 秒后调度另一个操作 将通知状态返回到初始状态 因此没有通知 其背后的主要原因是提供通知在 5 秒后自动消失的功能 我没有运气使用setTimeo
  • 在bash shell脚本中如何将字符串转换为数字[重复]

    这个问题在这里已经有答案了 嘿我想将字符串转换为数字 x 0 80 I would like to convert x to 0 80 to compare like such if x gt 0 70 then echo x gt gt
  • 如何使用 Jackson 反序列化 JS 日期?

    我从 ExtJS 获取格式为以下的日期字符串 2011 04 08T09 00 00 当我尝试反序列化此日期时 它将时区更改为印度标准时间 为时间添加 5 30 这就是我反序列化日期的方式 SimpleDateFormat dateForm
  • npm install fsevents 错误

    你好 我正在尝试安装 fsevents whitchnpm 因此我使用以下版本 节点 4 2 6 国家公共管理 3 5 2 操作系统 Ubuntu 16 04 LTS 我正在执行该语句 Edited npm install fsevents
  • 使用仪器解决内存不足警告

    我正在尝试使用仪器来解决一些内存不足的情况 我可以看到物理内存可用监视器中的内存消耗下降到几 MB 尽管分配显示所有分配约为 3 MB 总体字节为 34 MB 自从我使用 NSOperationQueue 将一些操作移动到单独的线程后 我就
  • NHibernate无状态会话插入速度慢

    这几天我一直致力于提高 NHibernate 插入性能 我读过很多帖子 例如this one that 无状态会话每秒可以插入 1000 2000 条记录 但是 它可以插入 1243 条记录的最佳时间对我来说超过 9 秒 var sessi
  • smtp;550 访问被拒绝 - HELO 名称无效(请参阅 RFC2821 4.1.1.1)

    我正在运行 Windows Server 2008 R2 但我收到一些域拒绝的 smtp 邮件 为了测试它 我将一个文本文件放入 C inetpub mailroot Pickup 目录中 内容如下 From email protected
  • 带有双引号参数的 exec

    我想执行findWindows 命令使用exec包 但 Windows 正在做一些奇怪的转义 我有类似的东西 out err exec Command find SomeText Output 但这会引发错误 因为 Windows 正在将其
  • 将分数转换为 html 实体[重​​复]

    这个问题在这里已经有答案了 我们在数据库中存储了一些分数信息 例如3 4 5 除了进行搜索和替换之外 是否有任何内置 PHP 函数可以自动将它们转换为正确的 html 实体 您可以使用htmlentities 函数 这会将所有特殊字符替换为
  • 检测用户何时关闭软键盘

    我的视图中有一个 EditText 小部件 当用户选择 EditText 小部件时 我会显示一些说明并出现软键盘 我使用 OnEditorActionListener 来检测用户何时完成文本输入 然后关闭键盘 隐藏指令并执行某些操作 我的问
  • 有什么方法可以知道 php 脚本是否在 cli 模式下运行?

    或者反过来 有没有办法知道 php 脚本是否正在 Web 服务器内运行 http www php net manual en function php sapi name php function is cli return php sap
  • Java 客户端应用程序中的 Ajax 调用 [重复]

    这个问题在这里已经有答案了 可能的重复 如何使用 Servlet 和 Ajax 我在 Javascript 中使用以下代码来进行 Ajax 调用 function getPersonDataFromServer ajax type POST
  • 为什么 Node.js 一次只处理六个请求?

    我们有一个 Node js 服务器 它实现了 REST API 作为中央服务器的代理 而中央服务器的 REST API 略有不同 而且不幸的是不对称 我们的客户端运行在各种浏览器中 要求节点服务器从中央服务器获取任务 节点服务器从中央服务器