我们有一个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服务器似乎只愿意一次发出六个请求.
jos*_*736 154
Node本身没有强加TCP连接限制.(重点是它是高度并发的,可以处理数千个同时连接.)您的操作系统可能会限制TCP连接.
您更有可能是对后端服务器的某种限制,或者您正在达到内置HTTP库的连接限制,但是如果没有关于该服务器或Node实现的更多详细信息,很难说.
Node的内置HTTP库(显然是构建在它上面的任何库,最常见的)维护一个连接池(通过Agent类),以便它可以利用HTTP keep-alives.当您向同一服务器运行许多请求时,这有助于提高性能:而不是打开TCP连接,发出HTTP请求,获取响应,关闭TCP连接,然后重复; 可以在重用的TCP连接上发出新请求.
在节点0.10及更早版本中,默认情况下,HTTP代理仅打开5个同时连接到单个主机的连接.您可以轻松更改:(假设您已将requireHTTP模块作为http)
http.globalAgent.maxSockets = 20; // or whatever
Run Code Online (Sandbox Code Playgroud)
节点0.12将默认值设置maxSockets为Infinity.
您可能希望保留某种连接限制.您不希望在一秒钟内完成数百个HTTP请求后完全压倒您的后端服务器 - 性能很可能比您让代理的连接池执行其操作更糟糕,限制请求以便不会使服务器过载.您最好的选择是运行一些实验,以查看在您的情况下最佳并发请求数.
但是,如果您确实不想要连接池,则可以完全绕过池 - 发送agent到false请求选项中:
http.get({host:'localhost', port:80, path:'/', agent:false}, callback);
Run Code Online (Sandbox Code Playgroud)
在这种情况下,并发HTTP请求绝对没有限制.
Alm*_*lmo 12
这是浏览器中并发连接数的限制:
在流行的浏览器中允许多少并发AJAX(XmlHttpRequest)请求?
我提出了其他答案,因为他们帮我诊断了问题.线索是节点的套接字限制是5,我一次得到6.6是Chrome中的限制,这是我用来测试服务器的.
你是如何从中央服务器获取数据的?在使用http模块发出HTTP请求时,"节点不限制连接"并不完全准确.以这种方式发出的客户端请求使用的http.globalAgent实例http.Agent,每个请求http.Agent都有一个设置maxSockets,用于确定代理可以向任何给定主机打开的套接字数量; 默认为5.
因此,如果您正在使用http.request或http.get(或依赖于这些方法的库)从中央服务器获取数据,您可以尝试更改http.globalAgent.maxSockets(或在http.Agent您使用的任何实例上修改该设置)的值.
看到: